我在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.setColorTable(list([i] for i in range(256)))
print image.colorTable()
import sys
app = QtGui.QApplication(sys.argv)
window = test()
sys.exit(app.exec_())
我有以下问题:
image.colorTable()
返回一个256次的数字列表4294967295L(即2 ^ 32-1),尽管我刚刚将颜色表设置为0到255.
image.pixelIndex(1, 1)
给出消息" QImage :: pixelIndex:不适用于32-bpp图像(无调色板)"虽然格式设置为Indexed8(并且isGrayscale()返回true)。
image.pixel(1, 1)
返回4278190080(当我将格式设置为Format_RGB32时)。这颜色是什么? (它应该是黑色的。)
根据ekhumoro的回答新代码:
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_())
答案 0 :(得分:2)
docs for QImage包含您问题的所有答案:
来自setColorTable()
的条目:
将用于将颜色索引转换为 QRgb 值的颜色表设置为指定的颜色。使用图像时,颜色表必须足够大,以包含图像中存在的所有像素/索引值的条目,否则结果未定义。
来自load()
的条目:
加载程序尝试使用指定的格式(例如PNG或JPG)读取图像。 如果未指定format(默认值),则加载程序会探测文件以获取标题以猜测文件格式。
因此,传递给QImage
构造函数的格式无关紧要,我预测print image.format()
将输出值> 3.另外,查看pixelIndex()
的条目我看到了:
如果位置无效,或如果图像不是调色板图像(depth()> 8),则结果未定义。
来自pixel()
的条目:
QRgb QImage :: pixel(int x,int y)const。
因此,此函数返回类型QRgb
的值,由文档描述:
格式为#AARRGGBB的ARGB四元组,相当于unsigned int。
很方便,Qt提供了一些用于提取QRgb
值的各种组件的函数。其中之一是qGray
,其描述如下:
从给定的ARGB四元组rgb返回灰色值(0到255)。
(注意:这些函数在全局命名空间中,因此在PyQt中,您可以在QtGui
模块中找到它们。