Когда я делаю QImage, если изображение находится в 8-битном индексном режиме (режим палитры), мое изображение в результате изменяется на оттенки серого - PullRequest
0 голосов
/ 28 июня 2018

Я создаю объект изображения 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

имя этого изображения: Flag_Of_Debar.png.

Но в результате выполнения изображение меняется на него.

enter image description here

Я делю свой код по формату 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()

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

В этом особом случае вы должны установить палитру:

elif im.mode == "P":
    qimagein = QtGui.QImage(data.data, data.shape[1], data.shape[0], data.strides[0], QtGui.QImage.Format_Indexed8)
    pal = im.getpalette()
    l = [QtGui.qRgb(*pal[3*i:3*(i+1)]) for i in range(256)]
    qimagein.setColorTable(l)

enter image description here

0 голосов
/ 28 июня 2018

Вилка Pillow из PIL имеет метод преобразования в QImage напрямую.

from PIL import ImageQt
qimagein = ImageQt.ImageQt(im)
...