当我制作 QImage 时,如果图像是 8 位 index-mode(调色板模式),我的图像将因此更改为灰度
When I make QImage , if the image is 8-bit index-mode(palette mode), my Image is changed to grayscale as a result
我从 PIL
制作了一个 QImage
的图像对象并将其显示在屏幕上。
PIL
有 "RGB(24-bit)","RGBA(32-bit)","P(8-bit-index mode(palette mode))","L(8-bit)","1(1-bit)" Image-Format 可用至 QImage
.
与其相关,QImage
也有"Format_RGB888(24-bit)","Format_ARGB(32-bit)","Format_Indexed8(8-bit)","Format_Mono(1-bit)"。
我制作了一个与 PIL 图像格式有关的 QImage
对象。
例如,当我从 PIL Image 获取 "RGB" 格式时,我在 QImage
构造函数的第五个参数 "Format_RGB888" 作为 QImage "RGB" 格式.
问题是当我得到 "P" 时,我做了一个 QImage
并显示它,图像总是变成灰度。
我指定"Format_Indexed8"是因为"P"是8位深度,QImage
格式中没有其他可采用的格式。
这是 8 位图像,"P" PIL 格式。
这张图片的名字是Flag_Of_Debar.png。
但是作为执行的结果,图片变成了它
我将我的代码按照 PIL 格式分隔如下。
除了"P",没问题
为什么8位"P"模式PIL-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()
PIL
的Pillow
分支直接有一个method of converting to a QImage
。
from PIL import ImageQt
qimagein = ImageQt.ImageQt(im)
在这种特殊情况下,您必须设置调色板:
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)
我从 PIL
制作了一个 QImage
的图像对象并将其显示在屏幕上。
PIL
有 "RGB(24-bit)","RGBA(32-bit)","P(8-bit-index mode(palette mode))","L(8-bit)","1(1-bit)" Image-Format 可用至 QImage
.
与其相关,QImage
也有"Format_RGB888(24-bit)","Format_ARGB(32-bit)","Format_Indexed8(8-bit)","Format_Mono(1-bit)"。
我制作了一个与 PIL 图像格式有关的 QImage
对象。
例如,当我从 PIL Image 获取 "RGB" 格式时,我在 QImage
构造函数的第五个参数 "Format_RGB888" 作为 QImage "RGB" 格式.
问题是当我得到 "P" 时,我做了一个 QImage
并显示它,图像总是变成灰度。
我指定"Format_Indexed8"是因为"P"是8位深度,QImage
格式中没有其他可采用的格式。
这是 8 位图像,"P" PIL 格式。
这张图片的名字是Flag_Of_Debar.png。
但是作为执行的结果,图片变成了它
我将我的代码按照 PIL 格式分隔如下。 除了"P",没问题
为什么8位"P"模式PIL-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()
PIL
的Pillow
分支直接有一个method of converting to a QImage
。
from PIL import ImageQt
qimagein = ImageQt.ImageQt(im)
在这种特殊情况下,您必须设置调色板:
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)