如何从EXE中提取32x32图标位图数据并将其转换为PIL图像对象?

时间:2013-11-04 02:48:18

标签: python icons python-imaging-library pywin32

我正在尝试从EXE中提取32x32图标,并将位图数据转换为PIL Image对象。我的最终目标是将图标与另一个32x32 PNG进行比较,并与RMS进行区分。

我已尝试win32gui.ExtractIconEx()然后win32gui.GetIconInfo()并尝试Image.open(),但PIL显然不接受PyHANDLE对象。我也尝试用Image.open()直接打开exe,显然这不起作用。

我现在很难过,有什么方法可以在Python中使用,或者我应该用不同的语言编写这部分代码?

1 个答案:

答案 0 :(得分:3)

在邮件列表here中,我找到了以下代码段:

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个对象。