python PIL的putpixel函数不适用于jpg

时间:2019-12-06 14:58:25

标签: python image-processing python-imaging-library

>>> m1.putpixel((0,0),(1,2,3))
>>> asarray(m1)[0]
array([[  1,   2,   3],
       [  1,   0, 252],
       [  1,   0, 252],
       ...,
       [253,   0,   0],
       [253,   0,   0],
       [253,   0,   0]], dtype=uint8)
>>> m1.save('enc_png.jpg',"JPEG")
>>> m1 = Image.open('enc_png.jpg')
>>> asarray(m1)[0]
array([[  0,   0, 211],
       [  0,   0, 219],
       [  1,   4, 231],
       ...,
       [253,   0,   0],
       [253,   0,   0],
       [253,   0,   0]], dtype=uint8)

当我将图像保存为jpg时,像素从(1,2,3)变为(0,0,211)。当我将其另存为png时,效果很好。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

JPEG is a lossy compression format,但PNG is lossless

当您将数据另存为JPEG时,它会因数据丢失而被压缩-这会改善文件的大小,并且不会对图像的质量产生太大的影响(如果您提高压缩级别,质量会降低)。 “数据丢失”是指您的数据的某些部分不可恢复地被其他一些数据所替代,从而使压缩率更好。而且,写入文件的内容没有足够的信息(故意!)来还原原始文件的每个字节。因此,在解压缩时,您的字节(以及其邻居BTW)已被其他内容取代。

PNG压缩数据的方式使得它们可以在解压缩期间完全还原,因此您的所有字节都保持不变。