문제

Python을 사용하여 .exe 파일에서 아이콘을 추출하는 방법을 찾고 있습니다. Win32Gui의 ExtracticOnex 함수를 사용하여 .exe의 아이콘을 잡을 수 있지만 PYQT를 사용하여 아이콘을 페인트하고 싶기 때문에 히콘 리소스 핸들을 반환합니다.

또한 Win32Gui를 사용하는 유일한 예는 투명성이 없으며 아이콘이 매끄럽지 않습니다.

Python & Pyqt를 사용 하여이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

--편집하다--

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 a HBITMAP, 유일한 문제는 변환하는 방법입니다 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

편집하다: 이 코드는 안티 아시아 및 알파 채널에 도움이되지 않습니다. 새 코드는 거의 정확하지만 QT에 알파 채널을로드하도록 지시해야합니다. 교체하는 경우 :

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

와 함께:

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

그것은 옳은 일을 할 것입니다. "마법"숫자 2 기술적으로 여야합니다 QtGui.QPixmap.Alpha 그러나 어떤 이유로 QT는 상수를 제공하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top