4

Windows のファイルから 48x48 または 256x256 のアイコンを取得しようとしていますが、行き止まりのように見えます。現時点では、Python に HICON ハンドルがあります (PySides QFileIconProvider は 32x32 のアイコンのみを返すため)。これを pyside ウィンドウに表示したいのですが、QPixmap.fromHICON/HBITMAP のような関数は実装されておらず、ソースから削除されたようですQt 4.8(?) 以降。また、アイコンをファイルに保存する必要がないようにしています。

それで、どんな種類の PySide オブジェクトに対しても、HICON またはそれを変換できる他のものを取得する方法はありますか?

編集: 古い関数 fromWinHBITMAP 関数を python で単純に書き直そうとしましたが、うまくいきません。src 行を python に変換する方法がわかりません。QImage.scanLine() によって返されるメモリ バッファーの値を変更する方法もわかりません。

for (int y=0; y<h; ++y) {
            QRgb *dest = (QRgb *) image.scanLine(y);
            const QRgb *src = (const QRgb *) (data + y * bytes_per_line);
            for (int x=0; x<w; ++x) {
                dest[x] = src[x] | mask;
            }
        }

現時点では、win32api を使用して HICON から PyCBITMAP を作成し、ビットのリストを取得しています。

for y in range(0, hIcon.height):
    dest = i.scanLine(y)
    src = bitmapbits[y*hIcon.widthBytes:(y*hIcon.widthBytes)+hIcon.widthBytes]

    for x in range(0, hIcon.width):
        dest[x] = bytes(ctypes.c_uint32(src[x] | 0))

これにより、「ValueError: memoryview オブジェクトのサイズを変更できません」という結果になります。

関数のソースはこちらにあります: http://www.qtcentre.org/threads/19188-Converting-from-HBitmap-to-a-QPixmap?p=94747#post94747

4

3 に答える 3

3

修正しました!

def iconToQImage(hIcon):
    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
    hbmp = win32ui.CreateBitmap()
    hbmp.CreateCompatibleBitmap(hdc, hIcon.width, hIcon.height)
    hdc = hdc.CreateCompatibleDC()
    hdc.SelectObject(hbmp)

    win32gui.DrawIconEx(hdc.GetHandleOutput(), 0, 0, hIcon.hIcon, hIcon.width, hIcon.height, 0, None, 0x0003)

    bitmapbits = hbmp.GetBitmapBits(True)
    image = QtGui.QImage(bitmapbits, hIcon.width, hIcon.height, QtGui.QImage.Format_ARGB32_Premultiplied)
    return image
于 2013-03-11T04:03:26.887 に答える
1

この種のセットアップを行うのは少し難しいですが、Python Imaging Library (PIL) はビットマップと ICO ファイルをサポートしており、Windows 用のダウンロードがあります。アイコンのファイル名を取得できると仮定すると、それを PIL でロードしてから、生データを QImage に転送できます。

from PIL import Image
from PySide.QtGui import QImage, QImageReader, QLabel, QPixmap, QApplication

im = Image.open("my_image.png")
data = im.tostring('raw', 'RGBA')

app = QApplication([])

image = QImage(data, im.size[0], im.size[1], QImage.Format_ARGB32)
pix = QPixmap.fromImage(image)
lbl = QLabel()
lbl.setPixmap(pix)
lbl.show()

app.exec_()

次にQImage、そこから必要な操作を行います。

于 2013-03-09T04:57:31.487 に答える