从 .exe 中提取 .ico 并使用 PyQt 进行绘制的最佳方法?

2024-03-23

我正在寻找一种使用 Python 从 .exe 文件中提取图标的方法。我知道你可以使用 win32gui 的 ExtractIconEx 函数来获取 .exe 的图标,但这会返回一个 HIcon 资源句柄,这不好,因为我想使用 PyQt 绘制图标。

另外,我见过的使用 win32gui 的唯一示例没有任何透明度,并且图标看起来不平滑。

使用 Python 和 PyQt 执行此操作的最佳方法是什么?

--Edit--

感谢 Lukáš Lalinský 的帮助,这个问题现在已经解决了,这是最终的代码,任何人都在寻求做与我类似的事情:

import sys
import win32ui
import win32gui
from PyQt4 import QtCore
from PyQt4 import QtGui

class testWindow(QtGui.QMainWindow):
    def __init__(self):
        super(testWindow, self).__init__()
        self.setGeometry(180.0, 130.0, 280.0, 400.0)
        self.setMouseTracking(True)

        large, small = win32gui.ExtractIconEx('C:\\Users\\Blank\\Apps\\Web Browsers\\Firefox\\Firefox.exe', 0)
        win32gui.DestroyIcon(small[0])

        self.pixmap = QtGui.QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]), 2)
    def bitmapFromHIcon(self, hIcon):
        hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
        hbmp = win32ui.CreateBitmap()
        hbmp.CreateCompatibleBitmap(hdc, 32, 32)
        hdc = hdc.CreateCompatibleDC()
        hdc.SelectObject(hbmp)
        hdc.DrawIcon((0, 0), hIcon)
        hdc.DeleteDC()
        return hbmp.GetHandle()
    def paintEvent(self, event):
        painter = QtGui.QPainter()
        painter.begin(self)
        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtCore.Qt.NoPen)
        painter.setBrush(QtGui.QBrush(QtGui.QColor(255.0, 255.0, 255.0, 255.0), QtCore.Qt.SolidPattern))
        painter.drawRect(QtCore.QRect(0.0, 0.0, 280.0, 400.0))
        painter.drawPixmap(QtCore.QRect(0.0, 0.0, 32.0, 32.0), self.pixmap)
        painter.end()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    mainWindow = testWindow()
    mainWindow.show()
    app.exec_()

有一个方法可以创建QPixmap from a HBITMAP,所以唯一的问题是如何转换HICON to HBITMAP。这可以使用以下方法完成GetIconInfo.

icons = win32gui.ExtractIconEx('C:/Program Files/Internet Explorer/iexplore.exe', 0, 10)
info = win32gui.GetIconInfo(icons[0][0])
pixmap = QtGui.QPixmap.fromWinHBITMAP(info[4])
info[3].close()
info[4].close()
# call win32gui.DestroyIcon on all the icons returned by ExtractIconEx

EDIT:此代码对抗锯齿和 Alpha 通道没有帮助。您的新代码几乎是正确的,但您需要告诉 Qt 加载 Alpha 通道。如果你更换:

self.pixmap = QtGui.QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]))

with:

self.pixmap = QtGui.QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]), 2)

它会做正确的事。 “神奇”的数字2技术上应该是QtGui.QPixmap.Alpha但由于某种原因 Qt 没有提供常量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 .exe 中提取 .ico 并使用 PyQt 进行绘制的最佳方法? 的相关文章

随机推荐

  • 限制 Windows 窗体数据可视化图表中的纵横比

    使用图表控件System Windows Forms DataVisualization Charting Chart 我正在制作散点图 如何约束它 使 X 轴的比例与 Y 轴的比例相同 简单地将控件本身设置为方形是不够的 因为它具有用于绘
  • 无法将 Neo4j GORM 插件添加到 Grails 项目

    我想在我的 Grails 项目中使用 Neo4j 图形数据库 我创建了一个新的 Grails 项目 我使用的是 Intellij Ultimate Edition 该应用程序运行良好 当我尝试在 BuildConfig groovy 中添加
  • 为什么如果我传递 lambda 作为键,与将其直接应用于具有相同 lambda 的原始可迭代的映射相比,max 的行为会有所不同?

    我试图理解 max 函数中关键参数的工作原理 它来自从列表中查找最接近 0 的整数的问题 并在列表中具有相同正值和负值的情况下使用正值 我发现这是一个有效的在线解决方案 给定一个整数 x 列表 print max a key lambda
  • 为 Spring Boot 应用程序中的所有控制器指定一次 @RequestHeader

    我有一个 Spring Boot 应用程序 其中包含多个控制器 提供各种 REST 方法 每个方法都需要定义相同的标头参数 有没有一种方法可以为所有控制器方法指定一次类似以下内容的方法 public ResponseEntity get R
  • 使用 GET 而不是 POST 删除经过身份验证的页面后面的数据 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我知道只要在公共网站上修改数据 您就应该使用 POST 有几个原因 包括搜索引擎会跟踪所有链接并修改数据 我的问题是 您认为在管理界面等经过
  • React Hook useEffect 缺少依赖项:“dispatch”

    这是我第一次使用 React js 我试图在离开此视图时删除警报 因为我不想在其他视图上显示它 但如果没有错误 我想保留成功警报以显示当我要重定向到另一个视图时 但我在 google chrome 上收到此警告Line 97 6 React
  • 找不到 Django 媒体 URL

    我遇到了一个奇怪的问题 希望其他地方有人也遇到过同样的问题 我的问题是 django 应用程序中存储的媒体无法通过 MEDIA ROOT URL 提供服务 当我尝试获取列表时使用 URL myhost media 保存在我的应用程序中的媒体
  • 如何在Windows窗体中创建垂直导航栏?

    我正在开发我的学校项目 Windows 窗体应用程序 正如你所看到的 我创建了 3 个面板 一个用于标题 一个用于导航栏 一个用于内容 我可以使标题和导航栏静态化 例如网页中的布局 并在单击按钮时更改内容吗 我创建了几个面板 并更改每个面板
  • 将程序集编译为 x64 有什么优点吗?

    假设我有一个 Net Framework 3 5 SP1 CLR 2 0 应用程序 需要在 x86 和 x64 平台上运行 还假设出于某种原因 我需要创建单独的 x86 和 x64 安装程序 由于我无论如何都有一个特定于 x64 的安装程序
  • R data.table 在 i 语句中使用 max

    这应该很简单 但由于某种原因 data table 没有达到我的预期 我想取一行中两个值的最大值来确定是否应该过滤一行 似乎发生的情况是 max 函数正在查看整个列 这不是我想要的 这是代码 gt test dt lt data table
  • 在哪里可以找到带有源代码的简约 WDM 驱动程序模板? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我遇到过内核模式驱动程序 但经验很少 这就是我想做的 有一个加载驱动程序的用户模式应用程序 让用户模式应用程序写入它 以便向它发送指令 让
  • 如何在选择中进行选择

    我有一个包含唯一 ID 字段的表 另一个字段 REF 包含对另一个数据集的 ID 字段的引用 现在我必须选择 REF 指向不存在的数据集的所有数据集 SELECT FROM table WHERE no dataset with ID RE
  • 使用 CloudFront 时,S3 上的自定义重定向规则返回 403

    我在 S3 上为我的存储桶有一个自定义重定向规则
  • “git pull”坏了

    我最近将 MacBook Pro 升级到 Snow Leopard 并且 git pull 返回 rakudo git pull git pull is not a git command See git help Did you mean
  • 将大端字节集合编组到结构中以提取值

    有一个很有洞察力的问题从字节数组中读取 C 中的 C C 数据结构 https stackoverflow com questions 2871 reading a c c data structure in c from a byte a
  • AND 和 OR 运算符在 Bash 中如何工作?

    我在 bash 中尝试了以下命令 echo this echo that echo other 这给出了输出 this other 我不明白 我的试运行是这样的 echo this echo that echo other暗示true tr
  • IE 中的空白 iFrame

    我有一个 iframe 如果来自externaldomain com的something html有css html position relative 在 IE 中 它将把 iframe 渲染为空白 所有其他浏览器都很好 有人知道解决方案
  • 谷歌浏览器闪烁

    大家好 我是新来的 不是编码员 而是我们即将于 2017 年夏天发布的项目的经理 我的开发人员和编码人员无法找到我们网站仅在 Chrome 上存在闪烁的原因 www playinera com http www playinera com
  • 实体框架:如何捕获任何错误

    我正在尝试将数据插入到具有大量数据的 SQL Server 表中not null限制 CREATE TABLE dbo Customer CustomerId int IDENTITY 1 1 NOT NULL FirstName varc
  • 从 .exe 中提取 .ico 并使用 PyQt 进行绘制的最佳方法?

    我正在寻找一种使用 Python 从 exe 文件中提取图标的方法 我知道你可以使用 win32gui 的 ExtractIconEx 函数来获取 exe 的图标 但这会返回一个 HIcon 资源句柄 这不好 因为我想使用 PyQt 绘制图