I\'m trying to extract a 32x32 icon from an EXE, and convert the bitmap data into an PIL Image
object. My final goal is to compare the icon to another 32x32 PNG and
From a mailing list here, I found this code snippet:
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')
From there, you could load it into PIL
in the normal Image.open
fashion.
If you dig through the docs, you should be able to avoid the IO step and do it all in memory if you want. PIL
has a from frombuffer
method that you can use to convert the result of GetBitmapBits
to an Image
object.