Я создаю объект изображения QImage
из PIL
и показываю его на экране.
PIL
имеет «RGB (24-разрядный)», «RGBA (32-разрядный)», «P (8-разрядный индексный режим (режим палитры))», «L (8-разрядный)», Формат изображения «1 (1 бит)» доступен для QImage
.
При подключении к нему QImage
также имеет «Format_RGB888 (24-разрядный)», «Format_ARGB (32-разрядный)», «Format_Indexed8 (8-разрядный)», «Format_Mono (1-разрядный)».
Я создаю QImage
объект с подключением к формату изображения PIL.
Например, когда я получаю формат «RGB» из PIL Image, я помещаю аргумент как «Format_RGB888» в пятый конструктор QImage
в качестве формата QImage «RGB».
Проблема в том, что когда я получаю «P», я делаю QImage
и показываю его, изображение всегда меняется на оттенки серого.
Я обозначил «Format_Indexed8», потому что «P» имеет 8-битную глубину, и в форматах QImage
нет другого приемлемого формата.
Вот 8-битное изображение в формате "P" от PIL.
имя этого изображения: Flag_Of_Debar.png.
Но в результате выполнения изображение меняется на него.
Я делю свой код по формату PIL следующим образом.
За исключением "P", нет проблем
Почему 8-битный режим P P-Image изменен на оттенки серого?
а что мне делать?
from PySide import QtGui,QtCore
import os,sys
from PIL import Image
import numpy as np
import io
def main():
app = QtGui.QApplication(sys.argv)
directory = os.path.join(os.getcwd(),"\\icons\\")
filename = QtGui.QFileDialog().getOpenFileName(None,"select icon",directory,"(*.png *.jpg *.bmp *.gif)","(*.png *.jpg *.bmp *.gif)")[0]
im = Image.open(filename)
print(im.mode)
data = np.array(im)
img_buffer = io.BytesIO()
im.save(img_buffer,"BMP")
if im.mode == "RGB":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_RGB888)
elif im.mode == "RGBA":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_ARGB32)
#for avoiding RGB BGR change problem
qimagein.loadFromData(img_buffer.getvalue(), "BMP")
elif im.mode == "1":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_Mono)
elif im.mode == "L":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_Indexed8)
elif im.mode == "P":
qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_Indexed8)
w = QtGui.QLabel()
pix = QtGui.QPixmap.fromImage(qimagein)
w.setPixmap(pix)
w.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()