Python处理16位灰度PNG图像

0 投票
1 回答
2288 浏览
提问于 2025-04-17 05:56

我正在写一个脚本,用来检查一张图片是否经过标准化。我使用的是Python的PNG模块来分析这张图片。为了测试,我在Photoshop里创建了一张16位的图片,这张图片只有两像素宽,一黑一白。

我的脚本能正确识别黑色像素(值为0),但是对于白色像素,它给出的值是65533,而我原本期待的是65535。

我不明白为什么会这样。是我的脚本有问题,还是跟Photoshop保存图片的方式有关呢?

这是一个简单的测试PNG图片:https://i.stack.imgur.com/UgfhF.png

脚本内容:

#!/usr/bin/python

import sys
import png # https://pypi.python.org/pypi/pypng

if len(sys.argv) != 2:
    print "Invalid number of arguments (",len(sys.argv),").\nUsage: python getMinMaxColor.py png_file"
    sys.exit(-1)
pngFilePath = sys.argv[1]

f = open(pngFilePath, 'rb')
r = png.Reader(file=f)
k = r.read()

bitDepth = 16
if k[3]['bitdepth'] != None:
    bitDepth = k[3]['bitdepth']

absMaxColor = 2**bitDepth-1

maxColor = -1
minColor = absMaxColor+1
print "Content:"
for line in k[2]:
    for color in line:
        print color
        if (color > maxColor):
            maxColor = color
        if (color < minColor):
            minColor = color

f.close()

print "\n"

print "Min Color:", minColor
print "Max Color:", maxColor, "( max:", absMaxColor, ")"
if minColor == 0 and maxColor == absMaxColor:
    print "Image is normalized"
else:
    print "Image is not normalized"

1 个回答

2

看起来这个PNG文件里的白色像素值确实是65533,而不是65535。我猜这可能跟Photoshop在“16位模式”下实际上是用15位来处理有关,所以在保存16位灰度图像时会有一点小误差。

撰写回答