@JRBRO

Как ужимать jpeg без потери цветов?

наваял сия чудо, чтобы ужимать джипеги в еще меньшие джипеги с разным dpi.

код
import os
import sys
from PIL import Image
import io

i = 1

def calc_size(image, quality):
    buffer = io.BytesIO()
    image.save(buffer, format='JPEG', quality=quality)
    return buffer.tell()

def find_quality(image, target_filesize):
    lo = 0
    hi = 100
    mid = (lo + hi) // 2
    actual_size = calc_size(image, mid)

    while lo <= hi:
        mid = (lo + hi) // 2
        actual_size = calc_size(image, mid)
        if actual_size == target_filesize:
            return mid
        elif actual_size > target_filesize:
            hi = mid - 1
        else:
            lo = mid + 1

    return mid

def res_img(image, size, name, target_filesize, part):
    image.thumbnail(size, Image.LANCZOS)
    quality = find_quality(image, target_filesize)
    filename = f'{name}-{part}-{i+1}.jpeg'
    image.save(filename, format='JPEG', quality=quality, subsampling=0, optimize=True)
    print(f'{filename} done.')

def main():
    target_size = (4000, 4000)
    target_filesize2 = 200 * 1024
    part2 = 'KB'

    for i, file in enumerate(os.listdir()):
        if file.endswith('.jpeg') or file.endswith('.jpg'):
            try:
                image = Image.open(file)
                if image.size != target_size:
                    image = image.resize(target_size)
                name = file.split('-')[0]
                res_img(image, target_size, name, target_filesize2, part2)
            except Exception as e:
                print(f'{e}')

if __name__ == '__main__':
    main()


Но в 200кб версии он убивает цвета. Можно ли как-то обработать сия дело, чтобы дпи, кач-во падало, но краски он не трогаль?
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 3
dimonchik2013
@dimonchik2013
non progredi est regredi
пробуйте что-то вроде
https://engineeringblog.yelp.com/2017/06/making-ph...

в общем случае - нет
он же "сжимает" не от хорошей жизни и не от сырости, а усредняя цветовое представления пикселей к меньше палитре и последущему их архивированию, так что цвета будут меняться
Ответ написан
phaggi
@phaggi
лужу, паяю, ЭВМы починяю
Как ужимать jpeg без потери цветов?

В общем случае никак. Потому что сжатие там предусматривает обязательные потери.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Не очень понятен смысл твоей экономии. Что ты хочешь выторговать?

Скорее всего цвет страдает при использовании цветовой модели Y(Cb)(Cr). В этом режиме
отдельно кодируется черно-белая яркость одним каналом. И еще двумя другими каналами
кодируются цветовые разности. На них идет жосткая экономия. Прореживают и по разрешающей
способности (chroma subsampling) и еще возможно по квантизации. Короче экономят на красках.
Это не ново. Это цветовая психо-физиология. Подтверждено экспериментами на людях. Об
этом знали еще в 20м веке когда строили телевизионные системы типа PAL/Secam.

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

Я не помню поддерживает ли JPEG RGB модель. Но поищи. И начни искать в фотошопе а не в этой
стрёмной библиотеке PIL. Кстати почитай насколько глубоко она работает с JPEG. Использует
ли она сишный libJPEG или у нее самопальный алгоритм. По идее в RGB модели должно
быть более равномерные потери для цвета и яркости. Но результат будет не лучше.

Еще посмотри в направление форматов webp. Если ты такой жадный дизайнер - то там будут
улучшеные алгоритмы кодирования-декодирования основанные прогнозе следующего цветового
фрейма.

Посмотри в JPEG2000 который умер так и не родившись. Но возможно там будут идеи которые тебе будут
интересны.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы