2

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

假设我的图像存储在一个 numpy 数组(dtype=8 位)中。使用 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)

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

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

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

有谁知道如何用 Pillow 保存 4 位 png,或者有另一种快速的方法吗?

4

1 回答 1

2

Pillow 不支持 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'

于 2018-10-05T08:31:31.673 回答