1

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

我试过这样做win32gui.ExtractIconEx()并尝试这样做,但显然 PIL 不接受 PyHANDLE 对象win32gui.GetIconInfo()Image.open()我也试过直接用 exe 打开Image.open(),显然不行。

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

4

1 回答 1

4

从这里的邮件列表中,我找到了这个代码片段:

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有一个 fromfrombuffer方法,可用于将结果转换为GetBitmapBits对象Image

于 2013-11-04T19:40:37.160 回答