使用python将灰度图像保存为4位png

时间:2015-04-17 12:29:06

标签: python png pillow pypng

我正在寻找一种将灰度图像保存为带有python的4位png的快速方法。我必须保存的图像非常大,所以保存它们需要相当长的时间。

假设我的图像存储在numpy-array(dtype = 8-bit)中。使用PyPng我可以做到:

import png
data = map(lambda x: map(int, x/17), data)
png.from_array(data, 'L;4').save(filename)

这将保存正确的4位png。有了Pillow,我可以做到:

import PIL.Image as Image
im = Image.fromarray(data)
im.save(filename)

第二种方法(Pillow)大约是第一种方法的10倍(即使没有对话),但是图像是8位png。我尝试添加行

im = im.point(lambda i: i/17) # convert values
im.mode = 'L;4'

然后我得到*** SystemError: unknown raw mode,即使模式' L; 4'在https://github.com/python-pillow/Pillow/blob/master/PIL/PngImagePlugin.py

中指定

有没有人知道如何使用Pillow保存4位png还是有另一种快速方法吗?

1 个答案:

答案 0 :(得分:0)

枕头不支持4位灰度。但是,如果像我一样,只想将8-bit图像转换为4-bit字节串,则可以。 仅除以17是不够的,因为每个像素仍将输出为1个字节。您需要将每个随后的半字​​节与其相邻的半字节配对,以获取完整的字节。

为此,您可以使用以下内容:

def convert_8bit_to_4bit(bytestring):
    fourbit = []
    for i in range(0,len(bytestring),2):
        first_nibble = int(bytestring[i] / 17)
        second_nibble = int(bytestring[i+1] / 17)
        fourbit += [ first_nibble << 4 | second_nibble ]
    fourbit = bytes(fourbit)
    return fourbit

取决于其他应用程序将如何处理半字节的顺序,您可能需要彼此切换'first_nibble''second_nibble'