уменьшение размера файла очень больших изображений без изменения размеров изображения

<p>рассмотрим приложение, обрабатывающее загрузку потенциально очень больших файлов png. </p><p>все загруженные файлы должны быть сохранены на диск для последующего поиска. тем не менее, файлы png могут иметь размер до 30 мб, но ограничение дискового пространства дает максимальный размер файла 1 мб.</p><p>проблема состоит в том, чтобы взять входной png размером до 30 мб и создать выходной png размером менее 1 мб.</p><p>эта операция, очевидно, будет с потерями - и снижение качества изображения, цветов и т.д. не является проблемой. тем не менее, одна вещь, которая не должна быть изменена, это размер изображения. следовательно, входной файл измерения 800x600 должен создать выходной файл измерения 800x600.</p><p>вышеуказанные требования являются строгими и не могут быть изменены.</p><p><b>используя imagemagick (или какой-либо другой инструмент с открытым исходным кодом), как бы вы сократили размер входных png-файлов размером ~ 30 мб максимум до 1 мб на файл без изменения размеров изображения?</b></p>

<p>png не является форматом изображений с потерями, поэтому вам, вероятно, потребуется преобразовать изображение в другой формат - скорее всего, в jpeg. jpeg имеет настраиваемый коэффициент качества - вы можете просто продолжать уменьшать коэффициент качества, пока не получите достаточно маленькое изображение. все это можно сделать без изменения разрешения изображения.</p><p>очевидно, что в зависимости от изображения потеря визуального качества может быть существенной. jpeg лучше всего подходит для изображений «настоящей жизни», таких как изображения с камер. это не так хорошо для логотипов, снимков экрана или других изображений с «резкими» переходами от светлого к темному. (png, с другой стороны, ведет себя противоположно - лучше всего подходит для логотипов и т.д.)</p><p>тем не менее, при разрешении 800x600, будет очень легко получить jpeg меньше 1 мб. (я был бы очень удивлен, увидев файл размером 30 мб при этих небольших размерах.) на самом деле, даже <em>uncompressed</em>, размер изображения будет всего около 1,4 мб:</p><pre><code>800 pixels * 600 pixels * 3 bytes / color = 1,440,000 bytes = 1.4mb </code></pre><p>таким образом, вам нужно только коэффициент сжатия 1,4: 1, чтобы уменьшить изображение до 1 мб. в зависимости от типа изображения сжатие png может очень хорошо обеспечить этот уровень сжатия. если нет, jpeg почти наверняка мог бы - коэффициенты сжатия jpeg порядка 10: 1 не редкость. опять же, качество/размер вывода будет зависеть от типа изображения.</p><p>наконец, хотя я некоторое время не использовал imagemagick, я почти уверен, что есть варианты повторного сжатия изображения с использованием определенного показателя качества. прочитайте документы и начните экспериментировать!</p><p>правка: похоже, что это должно быть действительно легко с imagemagick. из <a href="http://www.imagemagick.org/script/convert.php">документов</a> :</p><pre><code>$magick> convert input.png -quality 75 output.jpg </code></pre><p>просто продолжайте играть со значением качества, пока не получите подходящий результат.</p>

<p>ваш пример неприятен, потому что 30-мегабайтное изображение с разрешением 800x600 хранит <strong>500 бит на пиксель</strong>. явно дико нереально. пожалуйста, дайте нам реальные цифры.</p><p>между тем, «дешевый и веселый» подход, который я бы попробовал, заключался в следующем: уменьшите изображение в 6 раз, затем увеличьте в 6 раз, затем запустите сжатие png. если вам повезет, вы уменьшите размер изображения в 36 раз. если вам не повезет, экономия будет больше примерно на 6.</p><pre><code>pngtopng big.png | pnmscale -reduce 6 | pnmscale 6 | pnmtopng > big.png </code></pre><p>если этого недостаточно, вы можете бросить <code>ppmquant</code> в середине (на маленькое изображение), чтобы уменьшить количество цветов. (примерами являются <a href="http://netpbm.sourceforge.net/">netpbm</a> / <a href="http://acme.com/software/pbmplus/">pbmplus</a> , которые я всегда находил проще для понимания, чем imagemagick.)</p><p>чтобы узнать, является ли такое решение разумным, мы должны знать истинные цифры вашей проблемы.</p><p>кроме того, если вы действительно собираетесь навсегда выбрасывать информацию, вам почти наверняка лучше использовать сжатие jpeg, которое предназначено для разумной потери информации. есть ли какая-то причина, по которой jpeg не подходит для вашего приложения?</p>

<p>это во многом зависит от того, что вы хотите в конце, я часто люблю уменьшать количество цветов, сохраняя при этом размер. во многих случаях уменьшенные цвета не имеют значения. вот пример уменьшения цвета до 254. </p><pre><code>convert -colors 254 in.png out.png </code></pre>

<p>поскольку размер файла изображения напрямую связан с размерами изображения и количеством цветов, кажется, у вас есть только один выбор: уменьшить количество цветов.</p><p>и ~ 30 мб до 1 мб - это<em> очень </em>большое сокращение.</p><p>было бы трудно достичь этого соотношения с переводом в монохромный режим.</p>

<p>вы можете попробовать утилиту <a href="https://pngquant.org/"><code>pngquant</code></a> . это очень просто установить и использовать. и это может сильно сжать ваши png без видимой потери качества.</p><p>после установки попробуйте что-то вроде этого:</p><pre><code>pngquant yourfile.png pngquant --quality=0-70 yourfile.png </code></pre><p>для моего демонстрационного изображения (созданного imagemagick) первая команда уменьшает 350kb до 110kb, а вторая уменьшает его до 65kb.</p>

<ul> <li>шаг 1: уменьшите изображение до 1/16 от его исходного размера.</li> <li>шаг 2: уменьшите количество цветов.</li> <li>шаг 3: увеличьте размер изображения до исходного размера. </li> </ul>

<p>я знаю, что вы хотите сохранить размер пикселя, но можете ли вы уменьшить размер пикселя и настроить dpi, сохраненный вместе с изображением, чтобы сохранить размер дисплея? это зависит от того, какой клиент вы будете использовать для просмотра изображений, но большинству следует это соблюдать. если вы используете изображения в интернете, вы можете просто установить размер пикселя тега <code><img></code>.</p>

<p>попробуйте imageoptim <a href="https://imageoptim.com/mac">https://imageoptim.com/mac</a> это бесплатно и с открытым исходным кодом</p>

<p>если вы хотите изменить размер изображения в ubuntu, вы можете попробовать "gimp" .... я пробовал несколько приложений для редактирования изображений в ubuntu, и это, кажется, лучшее из них.</p><p>как установить?</p><p>-открытый терминал</p><p>-тип: sudo apt-get установить gimp-plugin-registry</p><p>-дать пароль администратора. вам нужно сетевое соединение для этого.</p><p>-после установки откройте изображение с помощью редактора изображений gimp. затем перейдите: файл> экспортировать как> нажмите кнопку «экспорт» </p><p>-вы получите небольшое окно, где установлен флажок «показывать предварительный просмотр в окне изображения». после того, как вы отметите эту опцию, вы увидите текущий размер файла и уровень качества.</p><p>-настройка уровня качества для увеличения/уменьшения размера файла.</p><p>-после завершения настройки, нажмите кнопку «экспорт», чтобы сохранить файл.</p>

<p>использовать <code>optipng</code> уменьшить размер без потерь</p><p> <a href="http://optipng.sourceforge.net/">http://optipng.sourceforge.net/</a> </p>

<p>это зависит от типа изображения: это реальная картинка или изображение, сгенерированное компьютером, для реальных изображений png будет делать очень мало, может даже не сжиматься вообще, используйте jpg для этих изображений, если изображение имеет ограниченное количество различных цветов (он может иметь глубину изображения 24 бита, но число уникальных изображений будет небольшим) png может сжиматься довольно хорошо . png - это, в основном, реализация zip для изображений, поэтому, если много пикселей - это то же самое вы можете иметь довольно хороший коэффициент сжатия, если вам нужно сжатие без потерь, не делайте изменения размера.</p>