我正在尝试为学校做一种增量编码任务,我需要将连续像素之间的差异放入下一个像素中,以便稍后对它们进行解码。不幸的是,如果差异为负,PIL 函数 putdata 将以某种方式将值转换为 0,这使得我以后无法使用反向过滤器对其进行解码。我该怎么做才能让它成为可能?请注意,编码后的图像不必看起来很漂亮,它只需要包含我对其进行解码所需的数据即可。
from PIL import Image
img = Image.open("lena.bmp")
img = img.convert("RGB")
encoded_img = Image.new("RGB", (img.size[0], img.size[1]))
decoded_img = Image.new("RGB", (img.size[0], img.size[1]))
colorlist = []
pixels = []
# Encoding
img.show()
for pixel in img.getdata():
R0 = pixel[0]
G0 = pixel[1]
B0 = pixel[2]
colorlist.append(R0)
colorlist.append(G0)
colorlist.append(B0)
if len(colorlist) > 3:
R0 -= colorlist[len(colorlist) - 6]
G0 -= colorlist[len(colorlist) - 5]
B0 -= colorlist[len(colorlist) - 4]
pixels.append((R0, G0, B0))
encoded_img.putdata(pixels)
encoded_img.show()
encoded_img.save("encoded.bmp")
最佳答案
对每个 R
、G
、B
值使用模 256。这意味着所有值都在 [0-255] 范围内结束,即一个字节,例如-1 映射到 255。
然后,对于两个 R 值 R0
和 R1
,它们的区别是:
Rdiff = (R0 - R1) % 256
稍后,您可以执行相反的操作:
R0 = (R1 + Rdiff) % 256
只要所有输入也在 0-255 范围内(在本例中为 0-255),计算就是正确的。
这些是一些示例编码 (Rdiff
) 值,具有以下逻辑:
R0=50, R1=20 --> Rdiff=30
R0=10, R1=50 --> Rdiff=216
R0=0, R1=5 --> Rdiff=251
R0=33, R1=200 --> Rdiff=89
关于python - 如何将负 (<0) RGB 颜色值放入 PIL 中的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54449562/