如何从EXE中提取32×32的图标位图数据,并将其转换成一个PIL Image对象?(How to

2019-10-18 21:54发布

我试图从一个EXE中提取32×32的图标,位图数据转换成PIL Image对象。 我的最终目标是比较图标到另一个32×32 PNG,并得到与RMS的区别。

我试着做win32gui.ExtractIconEx()然后win32gui.GetIconInfo()和attemping到Image.open()上,但PIL不接受PyHANDLE对象,显然。 我也attemped打开直接与EXE Image.open()显然是行不通的。

我很为难,现在,有没有什么办法,这是可能在Python或者我应该用不同的语言来写的我的这部分代码?

Answer 1:

从邮件列表在这里 ,我发现这个代码片段:

import win32ui
import win32gui
import win32con
import win32api

ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)

large, small = win32gui.ExtractIconEx("C:\Program Files (x86)\Malwarebytes' Anti-Malware\mbam.exe",0)
win32gui.DestroyIcon(small[0])

hdc = win32ui.CreateDCFromHandle( win32gui.GetDC(0) )
hbmp = win32ui.CreateBitmap()
hbmp.CreateCompatibleBitmap( hdc, ico_x, ico_x )
hdc = hdc.CreateCompatibleDC()

hdc.SelectObject( hbmp )
hdc.DrawIcon( (0,0), large[0] )

hbmp.SaveBitmapFile( hdc, 'icon.bmp')  

从那里,你可以将其加载到PIL在正常Image.open时尚。

如果您通过文档挖,你应该能够避免IO一步,做这一切的内存,如果你想要的。 PIL有一个从frombuffer ,你可以用它来的结果转换方法GetBitmapBits到一个Image对象。



文章来源: How to extract 32x32 icon bitmap data from EXE and convert it into a PIL Image object?