Скопированное изображение сохранено с разными пикселями в оригинал с PIL - PullRequest
0 голосов
/ 10 февраля 2019

Мне нужно сделать копию изображения, чтобы манипулировать им, однако сохранение исходного изображения и открытие скопированного изображения, похоже, различаются по своим значениям пикселей:

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», но, похоже, все они вызывают те же проблемы.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

*.jpg представляет собой сжатый формат изображения .При повторном сохранении jpg вы используете другое качество по умолчанию для устройства записи jpg, поэтому результирующие значения пикселей отличаются.

См. параметры формата файла изображения для jpg для параметра quality, который вы можете передать image.save ()

качество
Качество изображения по шкале от 1 (худшее) до 95 (наилучшее). По умолчанию 75. Следует избегать значений выше 95;100 отключает части алгоритма сжатия JPEG и приводит к большим файлам практически без улучшения качества изображения.

Либо

Похожие:

0 голосов
/ 10 февраля 2019

Проблема заключается в сохранении изображения как 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 приведет к довольно большому размеру, но сохранение и загрузка изображения не приведет к изменению пикселей.

...