我正在尝试从可执行文件中提取 .ico 文件 我在网站上找到了这个代码
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(r"C:\z\NEW ICON\a.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')
这确实有效,但它总是给我一个 32x32 的图标 我知道 exe 文件包含更高分辨率的图标,因为我用 7zip 打开它
要提取最大的图标,您应该迭代所有图标并找到最大的:
import os
import win32ui
import win32gui
import win32con
import win32api
import ctypes
lib = ctypes.windll.user32
def save_icon(icon_handle, size, save_path):
hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
hbmp = win32ui.CreateBitmap()
hbmp.CreateCompatibleBitmap(hdc, size, size)
hdc = hdc.CreateCompatibleDC()
hdc.SelectObject(hbmp)
hdc.DrawIcon((0, 0), icon_handle)
hbmp.SaveBitmapFile(hdc, save_path)
def extract_largest_icon(exe_path, output_file):
large_icons,small_icons = win32gui.ExtractIconEx(exe_path, 0, 50)
all_icons =large_icons+ small_icons
if not all_icons:
print("No iconsss found in executable")
return
largest_icon = None
largest_size= 0
for icon in all_icons:
icon_info = win32gui.GetIconInfo(icon)
icon_width =lib.GetSystemMetrics(win32con.SM_CXICON)
icon_height = lib.GetSystemMetrics(win32con.SM_CYICON)
icon_size = icon_width * icon_height
if icon_size > largest_size:
largest_size = icon_size
largest_icon = icon
if largest_icon:
print(f"Saving largest icon..")
save_icon(largest_icon, win32api.GetSystemMetrics(win32con.SM_CXICON),output_file)
win32gui.DestroyIcon(largest_icon)
exe_file = r"C:\z\NEW ICON\a.exe"
output_file = r"C:\path\to\output\icon_largest.bmp"
extract_largest_icon(exe_file, output_file)