Как улучшить качество функции 'image.save ()'? - PullRequest
0 голосов
/ 27 марта 2019

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

from PIL import ImageGrab
im = ImageGrab.grabclipboard()
im.save('somefile.png','PNG')

Я пытался добавить параметр 'quality=95' в im.save(), но он не работал.Исходное качество изображения 131K, а сохраненного изображения 112K.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

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

Обратите внимание, что параметр quality имеет другое значение при сохранении файлов JPEG и файлов PNG:

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

  • С PNG кодирование и декодирование без потерь.Качество - это подсказка декодеру о том, сколько времени нужно потратить на сжатие файла (всегда без потерь), а также о типах фильтрации / кодирования, которые могут подойти лучше всего.Это больше похоже на параметр gzip, например --best или --fast.

Более подробная информация о формате PNG * здесь, в Википедии .


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

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

  • Один кодер может использовать больший буфер и тратить больше времени на поиск повторяющихся рисунков в изображении,Для упрощенного примера представьте, что изображение имеет ширину 32 000 пикселей и каждая строка совпадает с приведенной выше.Если один кодировщик использует буфер 8 КБ, он никогда не обнаружит, что изображение просто повторяется снова и снова по странице, поэтому ему приходится кодировать каждую строку полностью, тогда как кодировщик с буфером 64 КБ может просто использовать 1 байт нав строке и используйте фильтрацию PNG, чтобы сказать «как в строке выше» .

  • Один кодировщик может принять решение по причине простоты кода или из-за недостатка места в коде, чтобы всегда кодировать данные в 16-битной версии, даже если бы она могла использовать всего 8 бит.

  • Один кодировщик может решить, что он всегда будет хранить альфа-слой, даже если оннепрозрачный, потому что это может упростить очистку кода / данных.

  • Один кодировщик всегда может отказаться от фильтрации, в то время как другой имеет код, необходимый для выполнения sub, up, average или Paeth фильтрация.

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

Я только что составил эти примеры - не воспринимайте их как Евангелие - я просто пытаюсь проиллюстрировать некоторые возможности.

0 голосов
/ 28 марта 2019

Чтобы воспроизвести точную копию файла из буфера обмена, единственный способ состоит в том, если буфер обмена содержит побайтовую копию оригинала. Этого не происходит, когда содержимое поступает из функции «Копировать» в программе.

Теоретически можно создать программу для этого, установив объект типа blob с копией исходного файла, но это будет крайне неэффективно и приведет к потере цели буфера обмена.

Некоторые баллы:
- При копировании в буфер обмена с помощью файлового менеджера в буфере обмена будет ссылка на исходный файл (а не на весь файл, который потенциально может быть намного больше, чем RAM)
- Большинство программ устанавливает содержимое буфера обмена в «полезную версию» отображаемых или выбранных данных. Это очень сильно зависит от интерпретации создателем программы.
- Анализ содержимого буфера обмена при чтении изображения снова зависит от прихотей библиотеки, используемой для обработки данных и упаковки их обратно в формат изображения.

Обычно, если вы хотите точно скопировать файл, лучше всего скопировать исходный файл.

Сказав это: оцените цель процесса копирования-вставки и решите, достаточно ли данных, которые вы получаете из буфера обмена, для намеченной цели. Очевидно, это зависит от того, для чего вы хотите его использовать.

...