Как преобразовать 32 МБ файла PNG в 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 МБ, и все остается прежним, но когда я использую 3-ю команду, она удаляет цвет фона в изображении и делает его в оттенках серого размытым.
Тем не менее, текст по-прежнему читается, а цвета и фоновый логотип — нет.
Как я могу добиться этого с помощью convert, mogrify или любого другого инструмента? Я пробовал все возможные вещи до сих пор.
2 ответа
Это из-за того, как работает сжатие JPEG. Он пытается округлить соседние пиксели, которые похожи друг на друга, до аналогичных значений. Это приводит к потере деталей и блочности.
Это становится более заметным, когда вы увеличиваете уровень сжатия, что вы и делаете. Кроме того, вы делаете это в два этапа:
- Сжатие без потерь (PNG) в формат с потерями (JPEG).
- Сжатие с потерями в сжатие с потерями.
Вы, вероятно, получите лучший результат, перейдя от без потерь к сжатию с потерями в конечном качестве, таким образом применяя сжатие с потерями только один раз, например, используя
jpeg:extent=300kb -strip -quality 90 -scale 90%в первой конверсии.
Кроме того, вы ничего не говорите о размере изображения и уровне детализации. Возможно, будет невозможно уменьшить его до 300 КБ и сохранить желаемое качество.
Чтобы избавиться от фоновых пятен, вы можете попробовать применить к документу пороговые значения в каком-либо программном обеспечении для редактирования изображений, заставив, например, все, что меньше определенного оттенка серого, быть белым.
Однако, что бы вы ни делали, сжатие из формата без потерь 30 МБ в формат с потерями 300 КБ приведет к заметному снижению качества.
я пытаюсь
find . -iname '*.png' -exec convert -resize 60% -quality 60 "*.jpg" {} +но это не работает.
Ссылка https://superuser.com/questions/71028/batch-converting-png-to-jpg-in-linux
$ ls -1 *.png | xargs -n 1 bash -c 'convert -quality 60 "$0" "${0%.*}.jpg"'
Преобразует мой пример 31MB.png в 1,4MB.jpg . ... Возможно, вам придется повторить, например,
$ ls -1 *.PNG | ...и т.п.
Ссылка комментарий @steeldriver : «немного лучше
xargs -d '\n' -n 1"

