.exeから.icoを抽出してPyQtでペイントする最良の方法は?
質問
Pythonを使用して.exeファイルからアイコンを抽出する方法を探しています。 win32guiのExtractIconEx関数を使用して.exeのアイコンを取得できることは知っていますが、これは、PyQtを使用してアイコンをペイントしたいので良くないHIconリソースハンドルを返します。
また、win32guiを使用して見た唯一の例には透明度がなく、アイコンは滑らかに見えません。
Python&を使用してこれを実行する最善の方法は何ですか? PyQt?
-編集-
Lukášの支援に感謝します。ラリンスクýこの問題は現在解決されています。最終的なコードは、私に似た何かをしようとしている人です:
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 <に変換する方法です/ code>。これは、
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
編集:このコードは、アンチエイリアスとアルファチャネルには役立ちません。新しいコードはほとんど正しいですが、アルファチャネルをロードするようQtに指示する必要があります。交換する場合:
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は定数を提供しません。
所属していません StackOverflow