スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    実行ファイル(.exe)からPyQtとPywinを使用してアイコンイメージを引っ張る

     気がつけば最後の更新から2ヶ月たってました。やべぇ、時間の流れが早いです。
     最近は書くネタが減ってきたのでついつい更新が止まっちゃってました。

     さて、Windowsでは実行ファイル(.exe)にアイコンがついてますよね。アレが欲しい時とかに、PyQtで引っこ抜いてくる方法のメモです。



     その前に、前提としてこれらの事は標準のPython単体ではできません。これとは別にWindows用拡張モジュールが必要になります。
    http://sourceforge.net/projects/pywin32/files/pywin32/Build%20214/
     拡張用モジュール「Pywin32」です。お使いのPythonのバージョンにあったものを拾ってきましょう。因みにダウンロードページは、ページ上部横並びにある(上から3段目?)のFilesをクリックしましょう。
     最初わからなくて彷徨いましたw


     実行ファイル形式なので、実行してOK連打で終了。


    アイコンを引っ張ってくるには、win32~シリーズを使用します。因みに今回は大きいアイコン(Exeでは通常2種類のアイコンが用意されている模様)を引っ張ります。
    # -*- coding:utf-8 -*-
    import sys
    from PyQt4 import QtGui, QtCore
    
    # exeファイルのパス============================================================
    PathList = [
        "C:\\Program Files\\Autodesk\\Maya2013\\bin\\maya.exe",
        "C:\\Program Files\\Adobe\\Adobe Photoshop CS5 (64 Bit)\\Photoshop.exe",
    ]
    # =============================================================================
    
    # Windows用モジュールのインポート==============================================
    import win32ui
    import win32gui
    import win32api
    import win32con
    # =============================================================================
    
    
    def getIconFromExe( path ):
        # Exeのパスからアイコンを取得する関数。
        # 大きいアイコンのサイズを取得。-------------------------------------------
        ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
        ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)
        # -------------------------------------------------------------------------
    
        # アイコンを取得。
        large, small = win32gui.ExtractIconEx( path, 0 )
        # 小さいアイコンは今回は使用しないので破棄する。
        if small:
            win32gui.DestroyIcon( small[0] )
        # 大きいアイコンを取得できなかった場合は空文字を返す。
        if not large:
                return ''
    
    
        # アイコンのハンドルを取得。-----------------------------------------------
        hdc  = win32ui.CreateDCFromHandle( win32gui.GetDC(0) )
        hbmp = win32ui.CreateBitmap()
    
        # Bitmapを作成。その際上で取得した大きいアイコンのサイズを指定する。
        # この値は直接int値を入力してもよい。
        hbmp.CreateCompatibleBitmap( hdc, ico_x, ico_y )
    
        hdc  = hdc.CreateCompatibleDC()
        hdc.SelectObject( hbmp )
        hdc.DrawIcon( ( 0, 0 ), large[0] )
        hdc.DeleteDC()
        # -------------------------------------------------------------------------
    
        # ハンドルをQPixmapのfromWinHBITMAPメソッドに渡してPixmapを作成する。
        pixmap = QtGui.QPixmap.fromWinHBITMAP( hbmp.GetHandle(), 2 )
        return pixmap
    
    
    
    class MainWindow( QtGui.QDialog ):
        def __init__( self, parent=None ):
            super( MainWindow, self ).__init__( parent )
            self.setWindowTitle( 'Exe from Icon' )
            self.resize( 500, 150 )
    
            layout   = QtGui.QVBoxLayout( self )
            model    = QtGui.QStandardItemModel( 0, 1 )
            listview = QtGui.QListView()
            listview.setIconSize( QtCore.QSize(32, 32) )
            listview.setModel( model )
    
            for path in PathList:
                item = QtGui.QStandardItem( path )
                item.setIcon(
                    QtGui.QIcon(
                        getIconFromExe( path )
                    )
                )
                model.setItem( model.rowCount(), 0, item )
    
            layout.addWidget( listview )
    
    
            
    
    if __name__ == '__main__':
        app = QtGui.QApplication( sys.argv )
        win = MainWindow()
        win.show()
        
        sys.exit( app.exec_() )
    


    こんな感じ。
    py_iconFromExe001.png
     上記「getIconFromExe」がExeファイルからアイコンを抽出している関数になってます。
     出来上がったpixmapのsaveメソッドを使用すれば好きな形式でディスクに保存もできます。Qt素敵(*^ー^*)



     因みに人にツールとして配る時に、相手の環境にもPywin32をインストールしなければならないのが面倒ですが、最悪自作のツールのパッケージに上記で使用した4つのモジュール
    • import win32ui
    • import win32gui
    • import win32api
    • import win32con
    と、
    • pythoncom26.dll
    • pywintypes26.dll
    を全部入れておいて、それらを格納しているディレクトリをPythonのsysパスに通しておけば、インストールせずとも使用する事は可能です。
     win32~は別途インストールしなきゃならないんで敬遠してたのですが、Windowsの深い部分にアクセスするには必須ですね。



    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココからアクセスできますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。