Python 灰度图像的颜色表
我在PyQt中有一个灰度图像,希望得到特定像素的颜色。灰度图像使用最多256个条目的颜色表Python 灰度图像的颜色表,python,colors,pyqt,pyqt4,qimage,Python,Colors,Pyqt,Pyqt4,Qimage,我在PyQt中有一个灰度图像,希望得到特定像素的颜色。灰度图像使用最多256个条目的颜色表 from PyQt4 import QtGui def test(): image = QtGui.QImage(100, 100, QtGui.QImage.Format_Indexed8) image.load("d:/1.bmp") print image.pixel(1, 1) print image.pixelIndex(1, 1) image.set
from PyQt4 import QtGui
def test():
image = QtGui.QImage(100, 100, QtGui.QImage.Format_Indexed8)
image.load("d:/1.bmp")
print image.pixel(1, 1)
print image.pixelIndex(1, 1)
image.setColorTable(list([i] for i in range(256)))
print image.colorTable()
import sys
app = QtGui.QApplication(sys.argv)
window = test()
sys.exit(app.exec_())
这是d:/1.bmp:
我有以下问题:
返回一个256倍于数字4294967295L(即2^32-1)的列表,尽管我刚刚将颜色表设置为0到255image.colorTable()
给出消息“QImage::pixelIndex:不适用于32 bpp图像(无调色板)”,尽管格式设置为Indexed8(并且isGrayscale()返回true)image.pixelIndex(1,1)
返回4278190080(也是在我将格式设置为format_RGB32时)。这是什么颜色?(应该是黑色的。)image.pixel(1,1)
from PyQt4 import QtGui
def test():
image = QtGui.QImage(100, 100, QtGui.QImage.Format_Indexed8)
image.load("d:/1.bmp")
image2 = image.convertToFormat(QtGui.QImage.Format_Indexed8)
print "format:", image2.format()
print "pixel color:", QtGui.qGray(image2.pixel(1, 1))
image2.setColorTable(list([QtGui.qRgb(i, i, i)] for i in range(256)))
print "color table:", image2.colorTable()
import sys
app = QtGui.QApplication(sys.argv)
window = test()
sys.exit(app.exec_())
您的问题的答案如下:
- 从
的条目中: 将用于将颜色索引转换为QRgb值的颜色表设置为指定的颜色。使用图像时,颜色表必须足够大,以包含图像中所有像素/索引值的条目,否则结果将无法定义setColorTable()
- 从
的条目中: 加载程序尝试使用指定的格式(例如PNG或JPG)读取图像如果未指定格式(这是默认设置),加载程序将探测文件头以猜测文件格式 因此,传递给load()
构造函数的格式是不相关的,我预测QImage
将输出一个大于3的值。另外,查看print image.format()
的条目,我发现: 如果位置无效,或者如果图像不是调色板图像(深度()>8),则结果未定义pixelIndex()
- 从
的条目中: QRgbQImage::像素(整数x,整数y)常数 因此,该函数返回一个pixel()
类型的值,文档中这样描述: 格式为#AARRGGBB的ARGB四元组,相当于无符号整数 Qt方便地提供了一些函数,用于提取QRgb
值的各种组件。其中之一是QRgb
,如下所述: 从给定的ARGB四进制rgb返回灰色值(0到255) (注意:这些函数位于全局名称空间中,因此在PyQt中,您可以在qGray
模块中找到它们)QtGui
image.pixel(1,1)
。对于与您的答案有关的颜色表,我认为image.setColorTable(list([QtGui.qRgb(I,I,I)]对于范围(256))内的I)
将创建一个合适的颜色表(包含所有可能的灰度值),但仍然image.colorTable()
返回未定义的值。我不明白颜色表与加载图像的格式有什么关系:加载中的格式指的是jpg、bmp、png等,我认为这些格式独立于单色、8位或32位。关于image.format
:确实返回了4(RGB32)。因此,在加载bmp文件后,我添加了image.convertToFormat(QtGui.QImage.Format\u Indexed8)
。但是,image.format
仍然返回4,颜色表仍然是无意义的。@MichaelWestwort。请看我答案的第一行;-)convertToFormat()
函数不进行就地修改。这也是非常正确的。因此,我相应地修改了代码,现在创建了一个新的图像。现在的格式确实是3(Indexed8)。但是,颜色表仍然是[4294967295L]*256。尽管isGrayscale()返回true,并且颜色表包含所有256种灰度颜色(就我现在正确理解的颜色定义而言)。不,我错了。isGrayscale对于image2返回false,image2在绘制时显示为全白色,但是读取所有像素会返回正确的红色、绿色和蓝色值,三者对于每个像素都相等。