QIcon 使用 ndarray

QIcon Using ndarray

在使用PyQt5的一些界面中,设button为QPushButton。如果我们想使用给定的保存图像 image.jpg 为按钮设置图标,我们通常会这样写:

button.setIcon(QtGui.QIcon("image.jpg"))

但是,如果给我一个 n 维 numpy 数组 array,它也表示一个图像,我不能简单地写 button.setIcon(QtGui.QIcon(array)),因为它会给出错误消息。我应该怎么做呢? (不考虑将数组保存为图像,因为我想将大量数组制作成按钮)

编辑:

对于典型情况,请考虑:

import numpy

array = numpy.random.rand(100,100,3) * 255

那么array就是一个代表图像的方阵。要看到这一点,我们可以写(我们不必使用 PILImage 来解决我们的问题,这只是一个演示):

from PIL import Image
im = Image.fromarray(imarray.astype('uint8')).convert('RGBA')

参考:100x100 image with random pixel colour

我想把这个固定数组做成一个图标

你必须构建一个 QImage -> QPixmap -> QIcon:

import numpy as np

from PyQt5.QtGui import QIcon, QImage, QPixmap
from PyQt5.QtWidgets import QApplication, QPushButton

app = QApplication([])

array = (np.random.rand(1000, 1000, 3) * 255).astype("uint8")

height, width, _ = array.shape
image = QImage(bytearray(array), width, height, QImage.Format.Format_RGB888)
# image.convertTo(QImage.Format.Format_RGB32)

button = QPushButton()
button.setIconSize(image.size())
button.setIcon(QIcon(QPixmap(image)))
button.show()

app.exec_()