![Как преобразовать файл PNG размером 32 МБ в файл размером 200 Кб без потери цветов](https://rvso.com/image/1070945/%D0%9A%D0%B0%D0%BA%20%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%84%D0%B0%D0%B9%D0%BB%20PNG%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BE%D0%BC%2032%20%D0%9C%D0%91%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%D0%BE%D0%BC%20200%20%D0%9A%D0%B1%20%D0%B1%D0%B5%D0%B7%20%D0%BF%D0%BE%D1%82%D0%B5%D1%80%D0%B8%20%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2.png)
У меня есть несколько изображений размером 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. Оно пытается округлить соседние пиксели, которые похожи друг на друга, до близких значений. Это приводит к потере деталей и блочности.
Это становится более заметным по мере увеличения уровня сжатия, чтоточночто вы делаете. Кроме того, вы делаете это в два этапа:
- Сжатие без потерь (PNG) в сжатие с потерями (JPEG).
- Сжатие с потерями.
Вы будетевероятнополучить лучший результат, перейдя от сжатия без потерь к сжатию с потерями в конечном качестве, таким образом применяя сжатие с потерями только один раз, например, используя 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
"