HICON/HBITMAP到QIcon/QPixmap/QImage/任何在i中有Q的东西

2024-06-26 14:58:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从Windows文件中获取48x48或256x256图标,但却遇到了一个似乎是死路一条的路。目前我有一个python中的HICON句柄(因为PySides QFileIconProvider只返回32x32个图标),我想在pyside窗口中显示它,但是函数如下QPixmap.fromHICON/HBITMAP从qt4.8(?)开始,似乎已经从源代码中删除了。另外,我尽量避免将图标保存到文件中。在

那么,有没有什么方法可以将HICON或者其他任何东西转换成任何类型的PySide对象?在

编辑: 我一直试图在python中简单地重写winhbitmap函数中的旧函数,但效果并不理想。我不确定应该如何将src行转换为python,而且我也不知道如何更改返回的内存缓冲区的值图像扫描线()

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并检索位列表。在

^{pr2}$

这将导致“ValueError:无法修改memoryview对象的大小”

函数的源可以在这里找到:http://www.qtcentre.org/threads/19188-Converting-from-HBitmap-to-a-QPixmap?p=94747#post94747


Tags: 文件对象函数srcforwindows句柄dest
2条回答

修好了!在

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

要进行这种设置有点困难,但是从我读到的Python图像库(PIL)支持bitmap and ICO files和拥有{a2}。假设您可以获得图标的文件名,那么可以用PIL加载它,然后传输raw data to a 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操作。在

相关问题 更多 >