python从exe里得到ico图标

说到exe那就是windows程序了,

python调用win32api 需要先安装https://github.com/mhammond/pywin32/releases
转化成ico有2种,一种是pyqt5另存图片换个文件名,这个可能不太专业,第2种是PythonMagick
https://download.lfd.uci.edu/pythonlibs/w3jqiv8s/PythonMagick-0.9.19-cp37-cp37m-win_amd64.whl
pip install PythonMagick-0.9.19-cp37-cp37m-win_amd64.whl
  1.  
    import sys
  2.  
    import win32ui
  3.  
    import win32gui
  4.  
    from PyQt5.QtWidgets import *
  5.  
    from PyQt5.QtCore import *
  6.  
    from PyQt5.QtGui import *
  7.  
    from PIL import Image
  8.  
    class testWindow(QMainWindow):
  9.  
    def __init__(self, parent=None):
  10.  
    super().__init__(parent)
  11.  
    self.initUI()
  12.  
     
  13.  
    def initUI(self):
  14.  
    self.setGeometry(180.0, 130.0, 280.0, 400.0)
  15.  
    self.setMouseTracking(True)
  16.  
    argv=sys.argv
  17.  
    if len(argv)>1:
  18.  
    large, small = win32gui.ExtractIconEx(argv[1], 0)
  19.  
    else:
  20.  
    large, small = win32gui.ExtractIconEx(r"C:/work/Mail139_disk.exe", 0)
  21.  
    win32gui.DestroyIcon(small[0])
  22.  
    self.bitmapFromHIcon(large[0])
  23.  
    #self.pixmap =QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]), 2)
  24.  
    self.pixmap =QPixmap('icon.png')
  25.  
    self.pixmap.save("a.ico","ico")
  26.  
     
  27.  
    def bitmapFromHIcon(self, hIcon):
  28.  
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
  29.  
    hbmp = win32ui.CreateBitmap()
  30.  
    hbmp.CreateCompatibleBitmap(hdc, 32, 32)
  31.  
    hdc = hdc.CreateCompatibleDC()
  32.  
    hdc.SelectObject(hbmp)
  33.  
    hdc.DrawIcon((0, 0), hIcon)
  34.  
    hdc.DeleteDC()
  35.  
    bmpstr=hbmp.GetBitmapBits(True)
  36.  
    img = Image.frombuffer( 'RGBA',(32,32), bmpstr, 'raw', 'BGRA', 0, 1)
  37.  
    img.save('icon.png')
  38.  
    return hbmp.GetHandle()
  39.  
     
  40.  
    def paintEvent(self, event):
  41.  
    painter = QPainter()
  42.  
    painter.begin(self)
  43.  
    painter.setRenderHint(QPainter.Antialiasing)
  44.  
    painter.setPen(Qt.NoPen)
  45.  
    painter.setBrush(QBrush(QColor(255.0, 255.0, 255.0, 255.0), Qt.SolidPattern))
  46.  
    painter.drawRect(QRect(0.0, 0.0, 280.0, 400.0))
  47.  
    painter.drawPixmap(QRect(0.0, 0.0, 32.0, 32.0), self.pixmap)
  48.  
    painter.end()
  49.  
     
  50.  
    if __name__ == "__main__":
  51.  
    app = QApplication(sys.argv)
  52.  
    mainWindow = testWindow()
  53.  
    mainWindow.show()
  54.  
    app.exec_()

注意fromWinHBITMAP 是pyqt4的函数pyqt5没有了,所以就简单点先存为png文件再转化ico,以上代码保存pyqtico.py,然后用下面命令使用:

python pyqtico.py C:/work/Mail139_disk.exe

PythonMagick的用法另一篇博客文章已经有过示例,就不用再写了,如果要打包pyqt5相当大,仅仅这个功能不值当用。此处代码仅仅为了练习,打包成exe的话记得win10打包只能到win10用,不能把exe放到xp之类其他os

 

2024-09-29 09:35:44【出处】:https://blog.csdn.net/qiaozhangchi/article/details/107150650

=======================================================================================

使用Python从exe文件中提取图标

 

在这篇博客中,我们将学习如何使用Python和一些Windows特定的库来从.exe文件中提取图标,并将其保存为.png文件。

依赖库

我们的代码需要以下Python库:

  • win32ui
  • win32gui
  • PIL

如果你还没有安装这些库,可以使用pip进行安装:

pip install pywin32 pillow

环境准备

确保你已经安装了Python,并且可以使用pip安装所需的库。

详细步骤

  1. 安装依赖库:确保你已经安装了pywin32pillow库。
  2. 定义函数:创建一个名为get_exe_icon的函数,用于从.exe文件中提取图标。
  3. 提取图标:使用win32gui.ExtractIconEx函数从.exe文件中提取图标。
  4. 创建设备上下文:使用win32ui.CreateDCFromHandlewin32ui.CreateBitmap创建一个设备上下文,并在其中绘制图标。
  5. 绘制图标:在设备上下文中绘制提取的图标。
  6. 保存图标:将绘制的图标保存为.png文件。

 

提取图标

我们首先需要一个函数来从.exe文件中提取图标。我们可以使用win32gui和win32ui库来完成这个任务。以下是get_exe_icon函数的代码:

代码解析

  1. 导入库

     

    1.  
      import win32ui
    2.  
      import win32gui
    3.  
      from PIL import Image

     

    这里我们导入了win32uiwin32gui库,用于与Windows API进行交互,以及PIL库(Python Imaging Library)用于图像处理。

  2. 定义函数

     

    def get_exe_icon(exe_path):
    

     

    定义一个名为get_exe_icon的函数,接受一个参数exe_path,表示.exe文件的路径。

  3. 提取图标

     

    1.  
      large, small = win32gui.ExtractIconEx(exe_path, 0)
    2.  
      win32gui.DestroyIcon(small[0])

     

    使用win32gui.ExtractIconEx函数从指定的.exe文件中提取图标。largesmall分别表示大图标和小图标。这里我们只使用大图标,并销毁小图标以释放资源。

  4. 创建设备上下文

     

    1.  
      hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
    2.  
      hbmp = win32ui.CreateBitmap()
    3.  
      hbmp.CreateCompatibleBitmap(hdc, 32, 32)

     

    创建一个设备上下文(Device Context,简称DC),用于绘制图标。CreateDCFromHandle函数从句柄创建一个DC,CreateBitmap函数创建一个位图对象,并使用CreateCompatibleBitmap函数使其与DC兼容。

  5. 绘制图标

     

    1.  
      hdc = hdc.CreateCompatibleDC()
    2.  
      hdc.SelectObject(hbmp)
    3.  
      hdc.DrawIcon((0, 0), large[0])

     

    创建一个兼容的DC,并选择位图对象到DC中。使用DrawIcon函数在DC中绘制图标。

  6. 保存图标

     

    1.  
      bmpinfo = hbmp.GetInfo()
    2.  
      bmpstr = hbmp.GetBitmapBits(True)
    3.  
      img = Image.frombuffer(
    4.  
      'RGB',
    5.  
      (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
    6.  
      bmpstr, 'raw', 'BGRX', 0, 1)
    7.  
      img.save('icon.png')

     

    获取位图信息和位图的位数据。使用PIL库的Image.frombuffer函数将位图数据转换为图像对象,并将图像保存为.png文件。

使用示例

以下是如何使用get_exe_icon函数的示例:

 

 

get_exe_icon(r'D:\install\Microsoft VS Code\Code.exe')

 

 

 

代码解析

  • win32gui.ExtractIconEx(exe_path, 0):从指定的.exe文件中提取图标。largesmall分别表示大图标和小图标。
  • win32ui.CreateDCFromHandle(win32gui.GetDC(0)):创建一个设备上下文,用于绘制图标。
  • win32ui.CreateBitmap():创建一个位图对象,用于存储绘制的图标。
  • hdc.CreateCompatibleDC():创建一个兼容的设备上下文。
  • hdc.SelectObject(hbmp):选择位图对象到设备上下文中。
  • hdc.DrawIcon((0, 0), large[0]):在设备上下文中绘制图标。
  • hbmp.GetInfo():获取位图信息。
  • hbmp.GetBitmapBits(True):获取位图的位数据。
  • Image.frombuffer(...):使用PIL库将位图数据转换为图像对象。
  • img.save('icon.png'):将图像保存为.png文件。

使用示例

以下是如何使用get_exe_icon函数的示例:

 

 

get_exe_icon(r'D:\install\Microsoft VS Code\Code.exe')

 

在这个示例中,我们从D:\install\Microsoft VS Code\Code.exe文件中提取图标,并将其保存为icon.png文件。

 

 

完整代码

  1.  
    import win32ui
  2.  
    import win32gui
  3.  
    from PIL import Image
  4.  
     
  5.  
    def get_exe_icon(exe_path):
  6.  
    # 获取exe文件的图标
  7.  
    large, small = win32gui.ExtractIconEx(exe_path, 0)
  8.  
    win32gui.DestroyIcon(small[0])
  9.  
     
  10.  
    # 创建一个设备上下文
  11.  
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
  12.  
    hbmp = win32ui.CreateBitmap()
  13.  
    hbmp.CreateCompatibleBitmap(hdc, 32, 32)
  14.  
     
  15.  
    # 在设备上下文中绘制图标
  16.  
    hdc = hdc.CreateCompatibleDC()
  17.  
    hdc.SelectObject(hbmp)
  18.  
    hdc.DrawIcon((0, 0), large[0])
  19.  
     
  20.  
    # 保存图标到本地文件
  21.  
    bmpinfo = hbmp.GetInfo()
  22.  
    bmpstr = hbmp.GetBitmapBits(True)
  23.  
    img = Image.frombuffer(
  24.  
    'RGB',
  25.  
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
  26.  
    bmpstr, 'raw', 'BGRX', 0, 1)
  27.  
    img.save('icon.png')
  28.  
     
  29.  
    get_exe_icon(r'D:\install\Microsoft VS Code\Code.exe')

运行结果

运行上述代码后,你将会在当前目录下看到一个名为icon.png的文件,其中包含从.exe文件中提取的图标。

 

效果图:

 

扩展1:提取多个图标

有些.exe文件可能包含多个图标。我们可以修改get_exe_icon函数来提取所有图标,并将它们保存为不同的文件。

  1.  
    import win32ui
  2.  
    import win32gui
  3.  
    from PIL import Image
  4.  
     
  5.  
    def get_all_exe_icons(exe_path):
  6.  
    # 获取exe文件的所有图标
  7.  
    large, small = win32gui.ExtractIconEx(exe_path, 0, 10) # 提取最多10个图标
  8.  
     
  9.  
    for i, icon in enumerate(large):
  10.  
    # 创建一个设备上下文
  11.  
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
  12.  
    hbmp = win32ui.CreateBitmap()
  13.  
    hbmp.CreateCompatibleBitmap(hdc, 32, 32)
  14.  
     
  15.  
    # 在设备上下文中绘制图标
  16.  
    hdc = hdc.CreateCompatibleDC()
  17.  
    hdc.SelectObject(hbmp)
  18.  
    hdc.DrawIcon((0, 0), icon)
  19.  
     
  20.  
    # 保存图标到本地文件
  21.  
    bmpinfo = hbmp.GetInfo()
  22.  
    bmpstr = hbmp.GetBitmapBits(True)
  23.  
    img = Image.frombuffer(
  24.  
    'RGB',
  25.  
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
  26.  
    bmpstr, 'raw', 'BGRX', 0, 1)
  27.  
    img.save(f'icon_{i}.png')
  28.  
     
  29.  
    get_all_exe_icons(r'D:\install\Microsoft VS Code\Code.exe')

扩展2:提取并保存为不同格式

除了保存为.png文件,我们还可以将图标保存为其他格式,如.ico或.bmp。

 

  1.  
    import win32ui
  2.  
    import win32gui
  3.  
    from PIL import Image
  4.  
     
  5.  
    def get_exe_icon(exe_path, output_format='png'):
  6.  
    # 获取exe文件的图标
  7.  
    large, small = win32gui.ExtractIconEx(exe_path, 0)
  8.  
    win32gui.DestroyIcon(small[0])
  9.  
     
  10.  
    # 创建一个设备上下文
  11.  
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
  12.  
    hbmp = win32ui.CreateBitmap()
  13.  
    hbmp.CreateCompatibleBitmap(hdc, 32, 32)
  14.  
     
  15.  
    # 在设备上下文中绘制图标
  16.  
    hdc = hdc.CreateCompatibleDC()
  17.  
    hdc.SelectObject(hbmp)
  18.  
    hdc.DrawIcon((0, 0), large[0])
  19.  
     
  20.  
    # 保存图标到本地文件
  21.  
    bmpinfo = hbmp.GetInfo()
  22.  
    bmpstr = hbmp.GetBitmapBits(True)
  23.  
    img = Image.frombuffer(
  24.  
    'RGB',
  25.  
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
  26.  
    bmpstr, 'raw', 'BGRX', 0, 1)
  27.  
    img.save(f'icon.{output_format}')
  28.  
     
  29.  
    # 示例:保存为.ico文件
  30.  
    get_exe_icon(r'D:\install\Microsoft VS Code\Code.exe', output_format='ico')

 

扩展3:处理不同尺寸的图标

有些图标可能有不同的尺寸,我们可以提取并保存这些不同尺寸的图标。

  1.  
    import win32ui
  2.  
    import win32gui
  3.  
    from PIL import Image
  4.  
     
  5.  
    def get_exe_icon_with_size(exe_path, size=(32, 32)):
  6.  
    # 获取exe文件的图标
  7.  
    large, small = win32gui.ExtractIconEx(exe_path, 0)
  8.  
    win32gui.DestroyIcon(small[0])
  9.  
     
  10.  
    # 创建一个设备上下文
  11.  
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
  12.  
    hbmp = win32ui.CreateBitmap()
  13.  
    hbmp.CreateCompatibleBitmap(hdc, size[0], size[1])
  14.  
     
  15.  
    # 在设备上下文中绘制图标
  16.  
    hdc = hdc.CreateCompatibleDC()
  17.  
    hdc.SelectObject(hbmp)
  18.  
    hdc.DrawIcon((0, 0), large[0])
  19.  
     
  20.  
    # 保存图标到本地文件
  21.  
    bmpinfo = hbmp.GetInfo()
  22.  
    bmpstr = hbmp.GetBitmapBits(True)
  23.  
    img = Image.frombuffer(
  24.  
    'RGB',
  25.  
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
  26.  
    bmpstr, 'raw', 'BGRX', 0, 1)
  27.  
    img.save(f'icon_{size[0]}x{size[1]}.png')
  28.  
     
  29.  
    # 示例:提取并保存64x64尺寸的图标
  30.  
    get_exe_icon_with_size(r'D:\install\Microsoft VS Code\Code.exe', size=(64, 64))

扩展4:处理错误和异常

在实际使用中,我们可能会遇到一些错误和异常。我们可以添加错误处理来提高代码的健壮性。

 

  1.  
    import win32ui
  2.  
    import win32gui
  3.  
    from PIL import Image
  4.  
     
  5.  
    def get_exe_icon_safe(exe_path):
  6.  
    try:
  7.  
    # 获取exe文件的图标
  8.  
    large, small = win32gui.ExtractIconEx(exe_path, 0)
  9.  
    if not large:
  10.  
    raise ValueError("无法提取图标")
  11.  
    win32gui.DestroyIcon(small[0])
  12.  
     
  13.  
    # 创建一个设备上下文
  14.  
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
  15.  
    hbmp = win32ui.CreateBitmap()
  16.  
    hbmp.CreateCompatibleBitmap(hdc, 32, 32)
  17.  
     
  18.  
    # 在设备上下文中绘制图标
  19.  
    hdc = hdc.CreateCompatibleDC()
  20.  
    hdc.SelectObject(hbmp)
  21.  
    hdc.DrawIcon((0, 0), large[0])
  22.  
     
  23.  
    # 保存图标到本地文件
  24.  
    bmpinfo = hbmp.GetInfo()
  25.  
    bmpstr = hbmp.GetBitmapBits(True)
  26.  
    img = Image.frombuffer(
  27.  
    'RGB',
  28.  
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
  29.  
    bmpstr, 'raw', 'BGRX', 0, 1)
  30.  
    img.save('icon.png')
  31.  
    print("图标提取并保存成功")
  32.  
    except Exception as e:
  33.  
    print(f"发生错误: {e}")
  34.  
     
  35.  
    get_exe_icon_safe(r'D:\install\Microsoft VS Code\Code

其他文章推荐

相关类型推荐

  • 使用Python进行图像处理
  • Python与Windows API的交互

结论

在这篇博客中,我们学习了如何使用Python和一些Windows特定的库从.exe文件中提取图标。虽然这个任务在某些情况下可能比较复杂,但是通过使用正确的工具和方法,我们可以轻松地完成它。

总结

通过本文的学习,你应该已经掌握了如何使用Python从.exe文件中提取图标,并将其保存为.png文件。如果你有任何问题或建议,请在评论区留言。        

 

 

2024-09-29 10:06:18【出处】:https://blog.csdn.net/m0_74972192/article/details/140755435

=======================================================================================

Python 获取 exe 的 icon(图标)  并且保存

参考链接:https://mail.python.org/pipermail/python-win32/2009-April/009078.html

复制代码
import win32ui
import win32gui
import win32con
import win32api

#ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
#ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)
ico_x = 32
ico_y = 32

exePath = "c:/windows/system32/shell32.dll"

large, small = win32gui.ExtractIconEx(exePath, 0)
useIcon = large[0]
destroyIcon = small[0]
win32gui.DestroyIcon(destroyIcon)

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), useIcon) #重画图标
savePath = "d:/test.bmp"
hbmp.SaveBitmapFile(hdc, savePath)
复制代码

 注意:

win32gui.ExtractIconEx 只能提取32x32 和 16x16 的一大一小的图片
hbmp.SaveBitmapFile 只能在已经存在的路径下保存文件,如果路径不存在,用os.makedirs()创建

上面只是保存 bmp,如果想要保存 png,可以给 python 安装 Pillow模块,代码如下:
复制代码
from PIL import Image
bmpstr = hbmp.GetBitmapBits(True)
img = Image.frombuffer(
    'RGBA',
    (32,32),
    bmpstr, 'raw', 'BGRA', 0, 1
)

img.save('icon.png')
复制代码

转为QImage:

bmpmapbits = hbmp.GetBitmapBits(True)
QtGui.QImage(bitmapbits, 64, 64, QtGui.QImage.Format_ARGB32_Premultiplied)

Pillow 下载地址:https://pypi.org/project/Pillow/#files

参考链接:https://stackoverflow.com/questions/32341661/getting-a-windows-program-icon-and-saving-it-as-a-png-python

 

2024-09-29 10:07:43【出处】:https://www.cnblogs.com/ibingshan/p/11057390.html#:~:text=import%20w

=======================================================================================

posted on 2024-09-29 10:09  jack_Meng  阅读(0)  评论(0编辑  收藏  举报

导航