You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:16:09