首页 > 编程语言 >python从exe里得到ico图标

python从exe里得到ico图标

时间:2024-09-29 10:15:11浏览次数:8  
标签:exe ico python hdc win32gui icon hbmp 图标

说到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

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

标签:exe,ico,python,hdc,win32gui,icon,hbmp,图标
From: https://www.cnblogs.com/mq0036/p/18438991

相关文章

  • JMeter调用python脚本
    JMeter调用python脚本前提具备python环境具备jdk环境一、编写python脚本python脚本如下:importrandom#随机一个1~100的随机数print(random.randint(1,100))二、使用BeanShell取样器调用python脚本Stringcommand="pythonD:\\apache-jmeter-5.5\\bin\\test.py"......
  • uni-app小程序项目使用iconfont字体图标
    前情uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app。为什么要这么做?借助字体图标,我们可以如同操作文字一样操作字体图标。如,颜色的切换、大小的改变对字体图标进行放大不会出现失......
  • python学习-python对文件的操作
    Python文件操作指南一、文件的打开与关闭(一)打开文件在Python中,可以使用内置的open()函数来打开文件。它接受文件名和模式作为参数,并返回一个文件对象。基本语法:file=open(file_name,mode)file_name:要打开的文件的名称,可以是相对路径或绝对路径。mode:打开文件的......
  • Python对数据库(MySQL,redis、MongoDB)的操作
    Python对数据库的操作(MySQL,redis、MongoDB)一、操作MySQL数据库安装pymysql:需要通过pipinstallpymysql进行安装。查询数据:fetchone、fetchmany(n)、fetchall()importpymysql#建立mysql连接,ip、端口、用户名、密码(passwd,不能写成其他,例如:pwd或者p,否则报错)、库名con......
  • python内置模块typing里Literal函数的基本用法和总结--快速学习掌握Literal函数的用法
    Literal是Pythontyping模块中提供的一种类型注解,用于指定变量或函数的参数只能取特定的字面量值(常量)。它允许你将变量的取值严格限制在指定的一组值内,确保程序只接受特定的常量值,从而减少错误的发生。一、基本概念在Python中,通常我们会使用常见的类型注解来限制变量......
  • 【Python脚本】路径管理之pathlib
    在Python的pathlib模块中,Path类和PurePath类是用于处理文件和目录路径的两个主要类.它们具有不同的目的和功能,以下是它们的主要异同点:类的继承关系:Path类继承自PurePath,因此Path类拥有PurePath的所有方法.不同点:PurePath类:纯路径对象:PurePath类及其子类(如Pure......
  • Python打包工具之pyinstaller
    前言:近期使用PySimpleGUI开发了一款开发者工具X-助手工具,意打造成平常开发助手,无论是图片还是网址的处理等等都需要这一个工具即可,无需在网上找各个网站去找解决方案,对于GUI的打包工具,在Python领域pyinstaller较为流行工具样例:   安装:pipinstall-Upyins......
  • Python 进行网页抓取
    1.从网站中提取数据importrequestsfrombs4importBeautifulSoupdefscrape_data(url):response=requests.get(url)soup=BeautifulSoup(response.text,'html.parser')#在此处编写代码,从网站中提取相关数据说明:这个Python脚本利用requests和Beautif......
  • python多线程与线程池
    线程:是任务的执行者。进程:是一个动态的概念。适用情况:IO密集用多线程。CPU密集用多进程。原因:Cpython解释器中使用了GIL全局解释锁,一个进程只有一个锁。只有拿到这个锁的线程才能获取解释器,取解释执行代码。这就导致了即使开了多线程,实际上只有一个线程在执行。因此......
  • 华为OD机试2024年E卷-转骰子[200分]( Java | Python3 | C++ | C语言 | JsNode | Go )实
    题目描述骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置在平面上,可以向左翻转(用L表示向左翻转1次),可以向右翻转(用R表示向右翻转1次),可以向前翻转(用F表示向前翻转1次),可以向后翻转(用B表示向后翻转1次),可以逆时针旋转(......