从.exe提取.ico文件并使用PyQt进行绘制的最佳方法?
问题描述:
我正在寻找一种方法来使用Python从.exe文件中提取图标。我知道你可以使用win32gui的ExtractIconEx函数来获取.exe的图标,但是这会返回一个HIcon资源句柄,这是不好的,因为我想用PyQt来绘制图标。从.exe提取.ico文件并使用PyQt进行绘制的最佳方法?
此外,我看到使用win32gui的唯一例子没有任何透明度和图标看起来不光滑。
什么是最好的方式去做这个使用Python & PyQt?
- 编辑 -
感谢来自卢卡斯·拉林斯基帮助这个问题现在已经解决了,这里是最终的代码被人正在寻求做同样的事情对我说:
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_()
答
有一种方法可以从HBITMAP
创建QPixmap
,所以唯一的问题是如何将HICON
转换为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
编辑:此代码不会与抗锯齿和Alpha通道帮助。你的新代码几乎是正确的,但你需要告诉Qt加载Alpha通道。如果更换:
self.pixmap = QtGui.QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]))
有:
self.pixmap = QtGui.QPixmap.fromWinHBITMAP(self.bitmapFromHIcon(large[0]), 2)
它会做正确的事情。 “魔术”号码2
在技术上应该是QtGui.QPixmap.Alpha
,但由于某些原因Qt没有提供常数。
感谢您的示例,我已经能够从ExtractIconEx中返回HIcon并使用简单函数将其转换为HBitmap。所以一切正在工作,除了图标的背景是不透明的,图标没有反锯齿:( 到目前为止:http://i34.tinypic.com/v33dom.png – 2009-10-24 18:58:05
将'fromWinHBITMAP(...) '用'fromWinHBITMAP(...,2)'('2'应该是'QPixmap.Alpha',但是PyQt似乎没有暴露出来)。 – 2009-10-24 19:12:50
非常好,它现在是透明的!什么是平滑它的最好方法现在它有了一个巨大的改进:http://i36.tinypic.com/11kcj04.png – 2009-10-24 19:19:50