Старые решения ImageMagick часто предлагают использовать -units PixelsPerInch при изменении плотности PNG-изображения, то есть, например, -units PixelsPerInch -density 300, а не только -density 300.
Но в современном ImageMagick (7.1.1-33), согласно следующим тестам, -units PixelsPerInch для этого вроде бы уже не нужен. Это действительно так или я что-то неправильно понял?
Step 1
magick identify -format %xx%y a.png => 72x72
magick identify -units PixelsPerInch -format %xx%y a.png => 72x72
Step 2
magick a.png -density 300 a1.png
magick a.png -units PixelsPerInch -density 300 a2.png
Step 3
magick identify -format %xx%y a1.png => 300x300
magick identify -units PixelsPerInch -format %xx%y a1.png => 300x300
Step 4
magick identify -format %xx%y a2.png => 300x300
magick identify -units PixelsPerInch -format %xx%y a2.png => 300x300
@fmw42 «Кроме того, PNG всегда показывает единицы измерения в виде пикселей на дюйм. Если вы укажете единицы пикселей на дюйм, а затем посмотрите на выходные единицы, они будут преобразованы в эквивалентные пиксели на дюйм». - Не могли бы вы это объяснить? В настоящее время я не очень понимаю. В своем тесте я использую magick a.png -units PixelsPerInch -density 300 a2.png, а затем magick identify -format %xx%y a2.png. А вторая команда возвращает 300x300, что, как я полагаю, составляет 300x300 dpi, а не 300x300 dpcm (точек на сантиметр).
Смотрите мой ответ ниже.
Я думаю, ваша проблема в том, что вы пытаетесь изменить единицы измерения в операторе идентификации, который обычно следует использовать только для сообщения статистики, а не для ее изменения (вероятно, с неопределенного). Таким образом, он не определен, и его изменение не знает, что делать, кроме как вставить свои значения и неправильно преобразовать их в пиксели на дюйм. Если вы проверите единицы измерения, вы, скорее всего, увидите, что они «не указаны» или «не определены». Ваша попытка изменить единицы измерения с неуказанных на пиксели на дюйм игнорируется при идентификации. Вам нужно использовать магию, а не магическую идентификацию, чтобы перейти к юнитам.
Я использовал identify для определения разрешения, а не для его изменения :) Первый шаг (в моем тесте четыре шага) — определить текущее разрешение двумя разными способами. Второй шаг — изменить разрешение двумя разными способами. Третий и четвертый шаги заключаются в определении dpi новых изображений двумя разными способами.
Но вы никогда не проверяли блоки перед запуском, запуск которых, скорее всего, не указан. Опять же, вам не следует пытаться указать единицы измерения в магической идентификации.
@jsx Вы сказали: «Я использовал идентификацию для определения разрешения, а не для его изменения». Это не то, как это сделать. идентификация не распознает -единицы. При использовании -units ваша команда заключалась в том, чтобы попытаться изменить или установить единицы измерения. Если вы хотите узнать, какие это единицы измерения, вам нужно добавить %U в оператор -format. Это то, что я использовал в своем ответе ниже. См. imagemagick.org/script/escape.php




Единицы PNG всегда преобразуются в эквивалентные пиксели-процентиметры, если единицы правильно указаны при указании плотности и не помечены как «неопределенные». Так например
magick identify -format %xx%y-%U lena.png
72x72-Undefined
magick lena.png -units pixelsperinch -density 72x72 x.png
magick identify -format %xx%y-%U\n x.png
28.339999999999999858x28.339999999999999858-PixelsPerCentimeter
Ваша проблема, скорее всего, заключается в том, что единицы измерения не указаны, и вы пытаетесь изменить их с помощью магического идентификатора, который, вероятно, игнорирует аргумент -units. Если единицы измерения не указаны, плотность или разрешение отображается как 72x72.
Хоть я и отметил вопрос как решенный, на самом деле я до сих пор в нем толком не разбираюсь. У меня есть файл a.png с плотностью около 72x72 точек на дюйм, и я хочу изменить его плотность примерно до 300 точек на дюйм. Я использую слово «вокруг», потому что его фактическая плотность измеряется в пикселях на сантиметр, и поэтому ее невозможно точно преобразовать в пиксели на дюйм. Шаг 1: magick identify -format %xx%y a.png. Отчет по Шагу 1 72x72. Шаг 2: magick a.png -density 300 a.png. Шаг 3: Повторите Шаг 1. Отчет по Шагу 3 300x300.
И тогда какой смысл добавлять -units PixelsPerInch перед -density при изменении плотности PNG-изображений? То есть какой смысл использовать magick input.png -units PixelsPerInch -density <density> output.png вместо magick input.png -density <density> output.png? Разве добавление -units PixelsPerInch не усложняет ситуацию?
@jsx Imagemagick не знает, какие единицы измерения вам нужны, когда вы указываете плотность. Плотность представляет собой всего лишь число и не передает никаких единиц автоматически. Если вам требуется XX dpi, вы должны указать -единицы, а также -плотность. Большинство людей думают в dpi, но PNG всегда показывает dpc. Таким образом, Imagemagick будет знать, что это PNG, и автоматически выполнит преобразование. Но вам нужно указать единицы измерения, иначе он будет считать, что вам нужен dpc, если dpc, а не «unspecified», уже был там.
Я провел несколько дополнительных тестов, чтобы лучше понять, что вы сказали, и опубликовал их в качестве ответа. Прозаические описания команд там верны?
И есть еще одна связанная с этим вещь, которую я пока не понимаю. Иногда magick identify -format %xx%y-%U image.png сообщает что-то вроде 72x72-PixelsPerInch. Но поскольку изображение имеет формат PNG, как возможно, что его плотность указывается в пикселях на дюйм, а не в пикселях на сантиметр или, по крайней мере, не указана? А как преобразовать PNG-файл, по которому magick identify отчитывается 72x72-Unspecified, в тот, за который будет отчитываться 72x72-PixelsPerInch?
@jsx Понятия не имею. Он отлично работает для меня. Опубликуйте имеющееся у вас изображение PNG с размером 72x72-PixelsPerInch. Вы уверены, что это PNG?
Вот он: github.com/jsx97/test/blob/main/…. Или любой другой снимок экрана macOS, который я создаю с помощью Shift-Command-4. По любому из них magick identify сообщает 144x144-PixelsPerInch
Я могу воспроизвести это, но не понимаю, когда/почему вы получаете эквивалент в пикселях на дюйм, когда магическая идентификация -verbose показывает пиксели на дюйм. Мой тестовый файл показывает ту же подробную информацию, но сообщает о пикселях в процентах для %U. Возможно, дело в метаданных PNG. Мне придется опубликовать вопрос на форуме Imagemagick GIT.
Я вижу одно отличие в подробной информации. Ваш файл имеет тип цвета PNG 6, а мой тестовый файл имел тип цвета 2. Я не знаю, в этом ли проблема. Оба файла имеют PNG-тег png:pHYs: x_res=5669, y_res=5669, units=1. Так что это не объясняет этого.
«Но не понимаю, когда/почему вы получаете эквивалент в пикселях на дюйм, когда магическая идентификация -verbose показывает пиксели на дюйм». - magick identify -format %xx%y-%U image.png возвращается 144x144-PixelsPerInch. И magick identify -verbose image.png возвращает это: github.com/jsx97/test/issues/1
Что насчет таблицы, которую я создал ниже? Насколько я понимаю, magick a.png -units PixelsPerInch -density 300x300 a1.png в переводе на прозу — это то же самое, что если мы попросим ImageMagick «увеличить плотность, чтобы она была примерно 300 пикселей на дюйм»? То есть плотность будет увеличена в сантиметрах, но мы для удобства ее указали как 300 пикселей на дюйм ?
Когда вы указываете -units PixelsPerInch и некоторую плотность для PNG-файла, Imagemagick преобразует эту плотность в эквивалент в пикселях на дюйм и сохраняет значения плотности для эквивалентных пикселей на дюйм в файле.
Большое спасибо. Кажется, я имел в виду именно это.
Что касается нашей дискуссии о том, почему magick identify сообщает XX-PixelsPerInch для некоторых изображений PNG, я открыл вопрос здесь: stackoverflow.com/q/78654336
Я уже открывал его по адресу github.com/ImageMagick/ImageMagick/discussions/7420. Не дублируйте вопросы.
P.S. Вы можете добавить к моему сообщению, если у вас есть что-то имеющее отношение к вопросу, который я не опубликовал.
Спасибо, я сначала не заметил. Помимо того, что мы обсуждаем на GitHub, не могли бы вы объяснить, допустимо ли изображение (PNG или JPEG) с Units как Unspecified (вместо того, чтобы они были указаны как PixelsPerInch или PixelsPerCentimeter)?
Некоторые программные инструменты не устанавливают единицы измерения или плотность автоматически.
Ниже приведены некоторые дополнительные тесты, объясняющие то, что сказал fmw42.
Входной файл — a.png. magick identify -format %xx%y-%U a.pngотчеты72x72-Unspecified.
В третьем столбце таблицы показано, что magick identify -format %xx%y-%U <filename> сообщает о результирующем файле.
identify вывод
magick a.png -density 300x300 a0.png
Увеличьте числовое значение плотности
300x300-Undefinedmagick a.png -units PixelsPerInch -density 300x300 a1.png
Увеличьте плотность, чтобы она была примерно 300 пикселей на дюйм.
118.11x118.11-PixelsPerCentimeter, что составляет около 300x300 пикселей на дюйм.
magick a.png -units PixelsPerCentimeter -density 118x118 a2.png
Увеличьте плотность так, чтобы она составляла ровно 118 пикселей на сантиметр.
118x118-PixelsPerCentimeterИ своеобразный ответ:
Но в современном ImageMagick (7.1.1-33), согласно следующим тестам, -units PixelsPerInch для этого вроде бы уже не нужен. Это действительно так или я что-то неправильно понял?
Нет, при изменении плотности PNG-изображения не рекомендуется опускать -units PixelsPerInch. И вот почему:
Если magick identify -format %xx%y-%U <yourimage> возвращает <density>-Unspecified или <density>-PixelsPerInch†, пропуск -units PixelsPerInch при изменении его плотности не принесет вреда.
Но если он вернет <density>-PixelsPerCentimeter, то пропуск -units PixelsPerInch будет означать, что magick input.png -density 300 output.png изменит плотность не на 300 пикселей на дюйм, как вы, скорее всего, хотели сделать, а на 300 пикселей на сантиметр.
† Обновление: отчет о плотности изображений PNG, поскольку <density>-PixelsPerInch оказался ошибкой ImageMagick, см. https://github.com/ImageMagick/ImageMagick/discussions/7420. В более новых версиях ImageMagick magick identify -format %xx%y-%U <PNG image> сообщит либо <density>-PixelsPerCentimeter, либо <density>-Unspecified (в зависимости от изображения (конечно)).
Если ваши единицы измерения отличаются от пикселей на дюйм, вам может потребоваться использовать их, если вы хотите, чтобы результат был пикселями на дюйм. Также PNG всегда показывает единицы измерения в пикселях-процентах. Если вы укажете единицы пикселей на дюйм, а затем посмотрите на выходные единицы, они будут преобразованы в эквивалентные пиксели на дюйм.