Python 灰度图像的颜色表

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

我在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_())
这是d:/1.bmp:

我有以下问题:

  • 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时)。这是什么颜色?(应该是黑色的。)

根据Ekhurlo的回答,新代码:

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_())
您的问题的答案如下:

  • setColorTable()
    的条目中:

    将用于将颜色索引转换为QRgb值的颜色表设置为指定的颜色。使用图像时,颜色表必须足够大,以包含图像中所有像素/索引值的条目,否则结果将无法定义

  • load()
    的条目中:

    加载程序尝试使用指定的格式(例如PNG或JPG)读取图像如果未指定格式(这是默认设置),加载程序将探测文件头以猜测文件格式

    因此,传递给
    QImage
    构造函数的格式是不相关的,我预测
    print image.format()
    将输出一个大于3的值。另外,查看
    pixelIndex()
    的条目,我发现:

    如果位置无效,或者如果图像不是调色板图像(深度()>8),则结果未定义

  • pixel()
    的条目中:

    QRgbQImage::像素(整数x,整数y)常数

    因此,该函数返回一个
    QRgb
    类型的值,文档中这样描述:

    格式为#AARRGGBB的ARGB四元组,相当于无符号整数

    Qt方便地提供了一些函数,用于提取
    QRgb
    值的各种组件。其中之一是
    qGray
    ,如下所述:

    从给定的ARGB四进制rgb返回灰色值(0到255)

    (注意:这些函数位于全局名称空间中,因此在PyQt中,您可以在
    QtGui
    模块中找到它们)


好的,我理解索引的返回值。我用QtGui.qGray(image.pixel(1,1))替换了
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在绘制时显示为全白色,但是读取所有像素会返回正确的红色、绿色和蓝色值,三者对于每个像素都相等。