2009-10-23 55 views
2

我正在尋找一種方法來使用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_() 

回答

1

有一種方法可以從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沒有提供常數。

+0

感謝您的示例,我已經能夠從ExtractIconEx中返回HIcon並使用簡單函數將其轉換爲HBitmap。所以一切正在工作,除了圖標的背景是不透明的,圖標沒有反鋸齒:( 到目前爲止:http://i34.tinypic.com/v33dom.png – 2009-10-24 18:58:05

+0

將'fromWinHBITMAP(...) '用'fromWinHBITMAP(...,2)'('2'應該是'QPixmap.Alpha',但是PyQt似乎沒有暴露出來)。 – 2009-10-24 19:12:50

+0

非常好,它現在是透明的!什麼是平滑它的最好方法現在它有了一個巨大的改進:http://i36.tinypic.com/11kcj04.png – 2009-10-24 19:19:50

相關問題