2012-07-22 401 views
5

这很简单。制作RGB图像,一个像素大。将像素值设置为(a,b,c)。保存。问题是,保存的图像与(a,b,c)具有不同的像素值。通常,在其中一个通道上具有+ -1,就好像它是随机噪声一样,但其一致。继承人的代码:PIL在保存时更改像素值

from PIL import Image 
newImg = Image.new('RGB', (1,1), "black") 
pixels = newImg.load() 
pixels[0,0] = (0,3,0) 
newImg.save("point.jpg") 
savedImage = Image.open("point.jpg") 
pixelsSaved = savedImage.load() 

print pixels[0,0] 
print pixelsSaved[0,0] 

输出从这个是: (0,3,0) (1,3,0)

一致。

如果使用(4,2,0)作为像素保存,输出为: (4,2,0) (3,2,0)

和(0,10, 0)给出: (0,10,0) (0,10,1)

例如。

为什么价值在储蓄时变化?我如何防止它?请帮忙。

谢谢。

回答

6

另存为.png.jpg是一种有损压缩格式。

+0

谢谢一个男人!我爱你!!!! – void 2018-02-10 07:18:58

3

JPG不承诺精确地存储你想要的像素。它压缩数据以使文件变小,并且压缩基于人的感知。这个想法是创建一个像素阵列,虽然它们是不同的像素,但它们对人类来说看起来是一样的。

因此,您正在编写的像素位于输出中,但相邻像素已被更改为能够以较小的空间存储整个图像。这被称为“有损压缩”,因为数据丢失了。

其他图片格式没有此属性。 PNG是一种无损压缩格式,这意味着在对压缩的PNG进行解压缩后会得到相同的像素。如果您将图像保存为PNG,则会得到您想要的结果。

+0

你们是血腥的辉煌!谢谢! – Ethan 2012-07-23 00:42:17

+0

是的,你们是血腥血腥的辉煌..没有想到这个..啊,谢谢! – void 2018-02-10 07:18:41