Как преобразовать файл PNG размером 32 МБ в файл размером 200 Кб без потери цветов

Как преобразовать файл PNG размером 32 МБ в файл размером 200 Кб без потери цветов

У меня есть несколько изображений размером 32 МБ, и я хочу изменить их размер с 32 МБ до 100 Кб или любого другого размера в Кб, не влияя на их цвета.

Команды, которые я пробую, следующие:

muhammad@muhammad-mohsin:~/scans$ find . -iname '*.png' -exec mogrify -format jpg "*.png" {} +


muhammad@muhammad-mohsin:~/$ find . -type f -iname \*.png -delete


muhammad@muhammad-mohsin:~/$ find . -iname '*.jpg' -exec mogrify -define jpeg:extent=300kb -strip -quality 90 -scale 90% *.jpg {} +

Здесь сначала я конвертирую PNG в JPG, что уменьшает его размер с 32 Мб до 5,8 Мб, и все остается прежним, но когда я использую третью команду, она удаляет фоновый цвет в изображении и делает его размытым в оттенках серого.

Тем не менее, текст по-прежнему читаем, а вот цвета и фон логотипа — нет.

Как я могу добиться этого с помощью convert, mogrify или любого другого инструмента? Я перепробовал все возможные варианты.

Это часть оригинального изображения

Это часть измененного изображения после команды

решение1

Это из-за того, как работает сжатие JPEG. Оно пытается округлить соседние пиксели, которые похожи друг на друга, до близких значений. Это приводит к потере деталей и блочности.

Это становится более заметным по мере увеличения уровня сжатия, чтоточночто вы делаете. Кроме того, вы делаете это в два этапа:

  1. Сжатие без потерь (PNG) в сжатие с потерями (JPEG).
  2. Сжатие с потерями.

Вы будетевероятнополучить лучший результат, перейдя от сжатия без потерь к сжатию с потерями в конечном качестве, таким образом применяя сжатие с потерями только один раз, например, используя jpeg:extent=300kb -strip -quality 90 -scale 90%при первом преобразовании.

Более того, вы ничего не говорите о размере изображения и уровне детализации. Может оказаться невозможным уменьшить его до 300 кБ и сохранить желаемое качество.

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

Однако, что бы вы ни делали, сжатие из формата без потерь размером 30 МБ в формат с потерями размером 300 КБволяпривести к заметному снижению качества.

решение2

Я пытаюсь, find . -iname '*.png' -exec convert -resize 60% -quality 60 "*.jpg" {} +но это не работает.

Ссылка.https://superuser.com/questions/71028/пакетное-преобразование-png-в-jpg-в-linux

$ ls -1 *.png | xargs -n 1 bash -c 'convert -quality 60 "$0" "${0%.*}.jpg"'

Конвертирует мой пример 31MB.png в 1.4MB.jpg. ... Возможно, вам придется повторить с eg $ ls -1 *.PNG | ...и т. д.

Ссылка на комментарий @steeldriver: "немного лучше xargs -d '\n' -n 1"

Связанный контент