我需要一个图像的副本来操纵它,但是保存原始图像和对外开放的复制人似乎在他们的像素值不同:
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可能改变由2个值的所有像素值的每个R,G和B通道的(如可与前两个像素中可以看出),然而,第三像素具有3个值的各信道的变化。
我怎样才能使图像的可靠副本,以改变它的像素,其中复印图像的起始像素为原来的一样吗?
注:我已经试过比我的“mountain.jpg”之外的其它图像,但似乎都导致了同样的问题。
*.jpg
是compressed image format。通过再次保存jpg
您使用不同的默认质量为JPG作家因此产生的像素值不同。
见image file format params for jpg为可以传递给quality
的image.save()参数
质量 图像质量,其规模从1(最差)至95(最好)。缺省值是75.值高于95应该尽量避免。 100禁用大型文件的JPEG压缩算法的部分,并且结果与图像质量几乎没有任何增益。
或
png
远东)或有关:
问题是保存图像为JPG。尝试用PNG做。通过保存为JPG图像,你正在做的JPG压缩。这改变了像素。做这个
copyImage.save('copy.png')
copyImage.close()
和
copy = Image.open("copy.png")
copy_data = copy.load()
注意:
您可能希望看到JPG和PNG之间的差异。
JPG是丢失数据的成本压缩
PNG是压缩不会丢失数据
JPG将产生具有非常低的尺寸的图像,但每次您保存图像,你basicly一再压缩它。一般质量低
PNG会造成相当大的规模,但保存和载入图像不会产生任何的像素改变。