Читать качество сжатия jpg - PullRequest
0 голосов
/ 05 мая 2018

Обновление:

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

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

Оригинальный вопрос:

У меня есть небольшой сценарий Python, который проходит через определенные папки и сжимает определенные файлы .jpg до 60 с использованием библиотеки подушек.

Однако он работает во второй итерации и сжимает все изображения, которые уже были сжаты.

Так есть ли способ получить сжатие или качество, которое .jpg имеет в настоящее время, чтобы я мог пропустить файл, если он уже был сжат?

import os
from os.path import join, getsize
from PIL import Image

start_directory = ".\\test"

for root, dirs, files in os.walk(start_directory):
    for f in files:

        try:
            with Image.open(join(root, f)) as im:
                if im.quality > 60: # <= something like this
                    im.save(join(root, f),optimize=True,quality=60)
            im.close() # <= not sure if necessary
        except IOError:
            pass

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Есть способ, которым это может быть решено. Вы можете использовать бит на пиксель , чтобы проверить уровень сжатия JPEG.

Насколько я понимаю, метрика «качества» JPEG - это число от 0 до 100, где 100 представляет без потерь, а 0 - максимальное сжатие. Как вы говорите, фактические детали сжатия будут варьироваться от кодера к кодеру и (вероятно) от пиксельного блока к пиксельному блоку (макроблоки?). Применение 60 к изображению снизит качество изображения, но также уменьшит размер файла , предположительно, до 60% от исходного размера.

Все ваши изображения, вероятно, будут иметь разные размеры. То, что вы хотите посмотреть, это бит на пиксель .

Вопрос: почему вы сжимаете с фактором качества 60 в первую очередь? Это правильно для всех ваших изображений? Вы пытаетесь достичь определенного размера файла? Или вы счастливы, чтобы сделать их все меньше?

Если вместо этого вы стремитесь к определенному количеству бит на пиксель, тогда ваша проверка просто становится вычислением размера файла, деленного на количество пикселей на изображении, и проверяет это по вашим желаемым битам на пиксель. Если оно больше, примените сжатие.

Конечно, тогда вам придется быть немного более умным, чем выбирать фактор качества 60. Предположительно, 60 означает 60% от исходного размера файла или некоторую внутреннюю настройку. Если это первое, вы можете вычислить новое значение достаточно просто. Если это последнее, вам может понадобиться пробная версия и улучшение, чтобы получить желаемый размер файла.

0 голосов
/ 05 мая 2018

Вы спрашиваете о невозможном здесь. Качество JPEG зависит от двух факторов. Во-первых, выборка компонентов. Во-вторых, выбор таблиц квантования.

Некоторые JPEG-кодеры имеют настройки «качества», но они могут делать все что угодно. Некоторые используют диапазоны 0 .. 100 Другие используют 0..4. Я видел 0..8. Я видел: «высокий», «средний», «низкий».

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

...