使用PIL将复制的图像以不同的像素保存到原始图像

时间:2019-02-09 21:01:06

标签: python python-imaging-library

我需要对图像进行复制以进行操作,但是保存原始图像并打开复制的图像似乎在像素值方面有所不同:

from PIL import Image

# Open original image
img = Image.open("mountain.jpg")
data = img.load()

# Display individual pixels
print("Pixel 1: {}".format(data[0,0]))
print("Pixel 2: {}".format(data[0,1]))
print("Pixel 3: {}".format(data[0,2]))

# Makes a copy of the input image and loads the copied image's pixel map
copyImage = img.copy()

copyImage.save('copy.jpg')
copyImage.close()

# Opens the copied image that was saved earlier and its pixel map
copy = Image.open("copy.jpg")
copy_data = copy.load()

print()

# Display copied images' individual pixels
print("Pixel 1 (copy): {}".format(copy_data[0,0]))
print("Pixel 2 (copy): {}".format(copy_data[0,1]))
print("Pixel 3 (copy): {}".format(copy_data[0,2]))

copy.close()

输出为:

Pixel 1: (72, 102, 112)
Pixel 2: (75, 105, 115)
Pixel 3: (71, 101, 111)

Pixel 1 (copy): (70, 100, 110)
Pixel 2 (copy): (77, 107, 117)
Pixel 3 (copy): (74, 104, 114)

最初,我认为PIL可能会将R,G和B通道的每个像素的所有像素值都更改为2个值(如前两个像素所示),但是第三个像素的更改值为3个值每个频道。

我如何制作可靠的图像副本以更改其像素,使复制图像的起始像素与原始像素相同?

注意: 我尝试了除“ mountain.jpg”以外的其他图像,但似乎都引起了相同的问题。

2 个答案:

答案 0 :(得分:2)

问题是将图像另存为 JPG 。尝试使用 PNG 来实现。 通过将图像另存为JPG,您正在执行JPG压缩。这会改变像素。做

copyImage.save('copy.png')
copyImage.close()

copy = Image.open("copy.png")
copy_data = copy.load()

注意:

您可能希望查看 JPG PNG 之间的区别。

JPG 是具有丢失数据成本的压缩

PNG 是压缩而不会丢失数据

JPG将导致图像尺寸非常小,但是每次保存图像时,基本上都是一次又一次地对其进行压缩。质量一般较低

PNG会导致很大的尺寸,但是保存和加载图像不会导致任何像素变化。

答案 1 :(得分:1)

*.jpgcompressed image format。通过再次保存jpg,您可以为jpg书写器使用不同的默认质量 因此产生的像素值会有所不同。

请参见image file format params for jpg,以获取可以传递给image.save()quality参数

  

质量
  图像质量,范围从1(最差)到95(最佳)。 默认值为75。应避免使用大于95的值。 100会禁用JPEG压缩算法的某些部分,从而导致大型文件的图像质量几乎没有任何提高。

要么

相关: