我正在寻找一种将灰度图像保存为带有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还是有另一种快速方法吗?
答案 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'