Сохранение изображения дважды с помощью PIL - PullRequest
0 голосов
/ 12 июня 2018

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

from PIL import Image

quality = 85

# Open original image and save 
img = Image.open('image.jpg')
img.save('test1.jpg', format='JPEG', quality=quality)

# Open the saved image and save again with same quality
img = Image.open('test1.jpg')
img.save('test2.jpg', format='JPEG', quality=quality)

Почти нет различий в размере или качестве изображения.

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

Кроме того, если я сохраню изображение с 85% качества, а затем открыть и сохранить с 95% качеством, размер изображения становится намного больше.Означает ли это, что PIL распаковывает изображение и снова сжимает его?

1 Ответ

0 голосов
/ 13 июня 2018

В большинстве случаев ваши test1.jpg и test2.jpg изображения будут немного отличаться.Это означает, что потеря информации, хранящейся в test1.jpg, произойдет после того, как вы откроете (распакуете) и сохраните ее (снова сжали) со сжатием JPEG с потерями.

В некоторых случаях, тем не менее, открытие и сохранение изображения JPEG с таким жепрограммное обеспечение не вносит никаких изменений.

Взгляните на этот пример:

from PIL import Image
import os
import hashlib

def md5sum(fn):
    hasher = hashlib.md5()
    with open(fn, 'rb') as f:
        hasher.update(f.read())
        return hasher.hexdigest()

TMP_FILENAME = 'tmp.jpg'

orig = Image.open(INPUT_IMAGE_FILENAME)
orig.save(TMP_FILENAME)     # first JPG compression, standard quality

d = set()
for i in range(10000):

    # Compute file statistics
    file_size = os.stat(TMP_FILENAME).st_size
    md5 = md5sum(TMP_FILENAME)
    print ('Step {}, file size = {}, md5sum = {}'.format(i, file_size, md5))
    if md5 in d: break
    d.add(md5)

    # Decompress / compress
    im = Image.open(TMP_FILENAME)
    im.save(TMP_FILENAME, quality=95)

Он будет открывать и сохранять файл JPG несколько раз, пока не будет найден цикл (то есть, открытое изображение имеет точноте же данные, что и раньше).

В моем тестировании для достижения устойчивого состояния требуется от 50 до 700 циклов (когда открытие и сохранение изображения не приводит к потерям).Однако окончательное «устойчивое» изображение заметно отличается от оригинала.

Изображение после первого сжатия JPG:

Coke can lying on a beach in Ukraine

Resulting "устойчивое изображение после 115 циклов сжатия / распаковки:

Coke can lying on a beach in Ukraine (faded colors, lost sharpness)

Пример вывода:

Step 0, file size = 38103, md5sum = ea28705015fe6e12b927296c53b6d147
Step 1, file size = 71707, md5sum = f5366050780be7e9c52dd490e9e69316
...
Step 113, file size = 70050, md5sum = 966aabe454aa8ec4fd57875bab7733da
Step 114, file size = 70050, md5sum = 585ecdd66b138f76ffe58fe9db919ad7
Step 115, file size = 70050, md5sum = 585ecdd66b138f76ffe58fe9db919ad7

Так что, хотя я использовал относительновысокое качество настройки 95, как вы можете видеть, многократное многократное сжатие / декомпрессия заставило изображение терять свои цвета и резкость.Даже при настройке качества 100 результат будет очень похожим, несмотря на почти вдвое больший размер файла.

...