Python 从 EXE 文件中提取高分辨率图标

问题描述 投票:0回答:1

我正在尝试从可执行文件中提取 .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 打开它

python winapi win32gui
1个回答
0
投票

要提取最大的图标,您应该迭代所有图标并找到最大的:

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)
© www.soinside.com 2019 - 2024. All rights reserved.