如何从EXE文件提取高分辨率图标?现有代码仅生成32×32图标
提取EXE中的高分辨率图标
原代码只能提取32×32分辨率图标,核心原因是它依赖系统默认图标尺寸(SM_CXICON返回值通常为32),且ExtractIconEx默认提取对应尺寸的图标。要获取EXE中包含的高分辨率图标,可通过以下两种方法解决:
方法一:使用SHGetFileInfo直接获取高分辨率图标
SHGetFileInfo支持读取文件的大尺寸图标(包括256×256及以上分辨率),代码示例如下:
import win32gui import win32ui import win32con import win32api file_path = r"C:\z\NEW ICON\a.exe" # 指定获取大图标、返回句柄、使用文件属性 flags = win32con.SHGFI_LARGEICON | win32con.SHGFI_ICON | win32con.SHGFI_USEFILEATTRIBUTES # 获取图标句柄 info = win32gui.SHGetFileInfo(file_path, 0, flags) hicon = info[0] # 直接保存为ICO文件 win32api.SaveIcon(hicon, 'high_res_icon.ico') # 若需保存为BMP格式 icon_info = win32gui.GetIconInfo(hicon) bmp_src = win32ui.CreateBitmapFromHandle(icon_info[4]) w, h = bmp_src.GetWidth(), bmp_src.GetHeight() hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0)) compatible_dc = hdc.CreateCompatibleDC() bmp = win32ui.CreateBitmap() bmp.CreateCompatibleBitmap(hdc, w, h) compatible_dc.SelectObject(bmp) compatible_dc.DrawIcon((0, 0), hicon) bmp.SaveBitmapFile(compatible_dc, 'high_res_icon.bmp') # 释放资源 win32gui.DestroyIcon(hicon) win32gui.ReleaseDC(0, hdc.GetSafeHdc()) compatible_dc.DeleteDC() bmp.DeleteObject() bmp_src.DeleteObject()
方法二:遍历ExtractIconEx提取的所有图标,筛选高分辨率版本
通过ExtractIconEx提取文件中所有图标,再筛选出尺寸最大的那个:
import win32gui import win32ui import win32api file_path = r"C:\z\NEW ICON\a.exe" # 提取文件中所有图标(参数-1表示获取全部索引的图标) large_icons, small_icons = win32gui.ExtractIconEx(file_path, -1) # 遍历找到尺寸最大的图标 max_area = 0 target_hicon = None for hicon in large_icons: icon_info = win32gui.GetIconInfo(hicon) bmp = win32ui.CreateBitmapFromHandle(icon_info[4]) w, h = bmp.GetWidth(), bmp.GetHeight() if w * h > max_area: max_area = w * h target_hicon = hicon bmp.DeleteObject() # 保存目标图标 if target_hicon: win32api.SaveIcon(target_hicon, 'max_res_icon.ico') # 释放目标图标资源 win32gui.DestroyIcon(target_hicon) # 销毁剩余图标资源 for hicon in large_icons: if hicon != target_hicon: win32gui.DestroyIcon(hicon) for hicon in small_icons: win32gui.DestroyIcon(hicon)
关键说明
- 原代码中
SM_CXICON返回的是系统默认大图标尺寸,并非EXE中存储的最大图标尺寸,这是导致提取结果分辨率低的根本原因。 - 操作图标后必须调用
DestroyIcon释放资源,避免内存泄漏。
内容的提问来源于stack exchange,提问作者humantrash
相关产品推荐
相关产品推荐

