Компрессия PNG с PIL и CV2 - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь сделать компрессор изображений в моем проекте django.Я хорошо справился с jpg, но получил много проблем с png.Для сжатия я использую PIL и cv2, но не могу получить результат лучше, чем 16% сжатия для больших файлов PNG (> 1 МБ).Я попытался объединить обе библиотеки, и это все еще не новшество.Вот простой код моего взгляда:

(код выше для сжатия jpg)

elif picture.mode == ('RGBA'):
            if photo.image.size < 1000000:
                colorsloss = picture.convert(mode="P", palette=Image.ADAPTIVE)
                colorsloss.save('media/new/'+name,"PNG",quality=75, optimize=True, bits=8)
            else:
                originalImage = cv.imread(str('/home/andrey/sjimalka'+ photo.image.url))
                cv.imwrite('media/new/'+name, originalImage,[cv.IMWRITE_PNG_COMPRESSION, 9])
                cvcompressed = Image.open('media/new/'+name)
                cvcompressed.convert(mode="RGB")
                cvcompressed.save('media/new/'+name,"PNG",quality=75, optimize=True)

Итак, у меня есть 2 большие проблемы: 1) Если у меня изображение маленького размера (<1 мб), я использую режим P в подушке.Это прекрасно работает, но если я сжимаю изображение с градиентом, я могу увидеть некоторые искажения в местах, где я получил градиент.<a href="https://i.stack.imgur.com/hwu9N.png" rel="nofollow noreferrer">original compressed У меня хорошее сжатие (что-то вроде 85%), но пока не знаю, как это исправить.

2) Не могу получить хорошеесжатие больших файлов PNG.Моя лучшая цель - 16%, с действительно хорошим качеством, но это все еще не новшество.Мб, я делаю что-то не так, или я должен использовать любую другую библиотеку или технологию, чтобы сделать это лучше.Я хочу получить список 50% сжатия с большими файлами PNG.

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

1 Ответ

0 голосов
/ 03 октября 2018

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

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

Кроме того, настройка качества не такая, как для JPEG - это больше похоже на параметр --fast или --best для gzip.

Одна вещь, которую вы можете сделать, если у вас большие области прозрачности, как у вас, это сделать черными все пиксели, которые на 100% прозрачны.Это поможет им лучше сжиматься.См. пример здесь .

...