'-units PixelsPerInch' при изменении плотности изображения PNG

Старые решения 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

Если ваши единицы измерения отличаются от пикселей на дюйм, вам может потребоваться использовать их, если вы хотите, чтобы результат был пикселями на дюйм. Также PNG всегда показывает единицы измерения в пикселях-процентах. Если вы укажете единицы пикселей на дюйм, а затем посмотрите на выходные единицы, они будут преобразованы в эквивалентные пиксели на дюйм.

fmw42 20.06.2024 17:56

@fmw42 «Кроме того, PNG всегда показывает единицы измерения в виде пикселей на дюйм. Если вы укажете единицы пикселей на дюйм, а затем посмотрите на выходные единицы, они будут преобразованы в эквивалентные пиксели на дюйм». - Не могли бы вы это объяснить? В настоящее время я не очень понимаю. В своем тесте я использую magick a.png -units PixelsPerInch -density 300 a2.png, а затем magick identify -format %xx%y a2.png. А вторая команда возвращает 300x300, что, как я полагаю, составляет 300x300 dpi, а не 300x300 dpcm (точек на сантиметр).

user25418595 20.06.2024 18:12

Смотрите мой ответ ниже.

fmw42 20.06.2024 19:50

Я думаю, ваша проблема в том, что вы пытаетесь изменить единицы измерения в операторе идентификации, который обычно следует использовать только для сообщения статистики, а не для ее изменения (вероятно, с неопределенного). Таким образом, он не определен, и его изменение не знает, что делать, кроме как вставить свои значения и неправильно преобразовать их в пиксели на дюйм. Если вы проверите единицы измерения, вы, скорее всего, увидите, что они «не указаны» или «не определены». Ваша попытка изменить единицы измерения с неуказанных на пиксели на дюйм игнорируется при идентификации. Вам нужно использовать магию, а не магическую идентификацию, чтобы перейти к юнитам.

fmw42 20.06.2024 19:56

Я использовал identify для определения разрешения, а не для его изменения :) Первый шаг (в моем тесте четыре шага) — определить текущее разрешение двумя разными способами. Второй шаг — изменить разрешение двумя разными способами. Третий и четвертый шаги заключаются в определении dpi новых изображений двумя разными способами.

user25418595 20.06.2024 20:04

Но вы никогда не проверяли блоки перед запуском, запуск которых, скорее всего, не указан. Опять же, вам не следует пытаться указать единицы измерения в магической идентификации.

fmw42 20.06.2024 20:14
@jsx Вы сказали: «Я использовал идентификацию для определения разрешения, а не для его изменения». Это не то, как это сделать. идентификация не распознает -единицы. При использовании -units ваша команда заключалась в том, чтобы попытаться изменить или установить единицы измерения. Если вы хотите узнать, какие это единицы измерения, вам нужно добавить %U в оператор -format. Это то, что я использовал в своем ответе ниже. См. imagemagick.org/script/escape.php
fmw42 20.06.2024 23:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
109
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Единицы 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.

user25418595 20.06.2024 21:42

И тогда какой смысл добавлять -units PixelsPerInch перед -density при изменении плотности PNG-изображений? То есть какой смысл использовать magick input.png -units PixelsPerInch -density <density> output.png вместо magick input.png -density <density> output.png? Разве добавление -units PixelsPerInch не усложняет ситуацию?

user25418595 20.06.2024 21:42

@jsx Imagemagick не знает, какие единицы измерения вам нужны, когда вы указываете плотность. Плотность представляет собой всего лишь число и не передает никаких единиц автоматически. Если вам требуется XX dpi, вы должны указать -единицы, а также -плотность. Большинство людей думают в dpi, но PNG всегда показывает dpc. Таким образом, Imagemagick будет знать, что это PNG, и автоматически выполнит преобразование. Но вам нужно указать единицы измерения, иначе он будет считать, что вам нужен dpc, если dpc, а не «unspecified», уже был там.

fmw42 20.06.2024 22:56

Я провел несколько дополнительных тестов, чтобы лучше понять, что вы сказали, и опубликовал их в качестве ответа. Прозаические описания команд там верны?

user25418595 21.06.2024 12:10

И есть еще одна связанная с этим вещь, которую я пока не понимаю. Иногда magick identify -format %xx%y-%U image.png сообщает что-то вроде 72x72-PixelsPerInch. Но поскольку изображение имеет формат PNG, как возможно, что его плотность указывается в пикселях на дюйм, а не в пикселях на сантиметр или, по крайней мере, не указана? А как преобразовать PNG-файл, по которому magick identify отчитывается 72x72-Unspecified, в тот, за который будет отчитываться 72x72-PixelsPerInch?

user25418595 21.06.2024 12:28

@jsx Понятия не имею. Он отлично работает для меня. Опубликуйте имеющееся у вас изображение PNG с размером 72x72-PixelsPerInch. Вы уверены, что это PNG?

fmw42 21.06.2024 17:29

Вот он: github.com/jsx97/test/blob/main/…. Или любой другой снимок экрана macOS, который я создаю с помощью Shift-Command-4. По любому из них magick identify сообщает 144x144-PixelsPerInch

user25418595 21.06.2024 18:12

Я могу воспроизвести это, но не понимаю, когда/почему вы получаете эквивалент в пикселях на дюйм, когда магическая идентификация -verbose показывает пиксели на дюйм. Мой тестовый файл показывает ту же подробную информацию, но сообщает о пикселях в процентах для %U. Возможно, дело в метаданных PNG. Мне придется опубликовать вопрос на форуме Imagemagick GIT.

fmw42 21.06.2024 18:48

Я вижу одно отличие в подробной информации. Ваш файл имеет тип цвета PNG 6, а мой тестовый файл имел тип цвета 2. Я не знаю, в этом ли проблема. Оба файла имеют PNG-тег png:pHYs: x_res=5669, y_res=5669, units=1. Так что это не объясняет этого.

fmw42 21.06.2024 18:57

«Но не понимаю, когда/почему вы получаете эквивалент в пикселях на дюйм, когда магическая идентификация -verbose показывает пиксели на дюйм». - magick identify -format %xx%y-%U image.png возвращается 144x144-PixelsPerInch. И magick identify -verbose image.png возвращает это: github.com/jsx97/test/issues/1

user25418595 21.06.2024 19:03

Что насчет таблицы, которую я создал ниже? Насколько я понимаю, magick a.png -units PixelsPerInch -density 300x300 a1.png в переводе на прозу — это то же самое, что если мы попросим ImageMagick «увеличить плотность, чтобы она была примерно 300 пикселей на дюйм»? То есть плотность будет увеличена в сантиметрах, но мы для удобства ее указали как 300 пикселей на дюйм ?

user25418595 21.06.2024 19:45

Когда вы указываете -units PixelsPerInch и некоторую плотность для PNG-файла, Imagemagick преобразует эту плотность в эквивалент в пикселях на дюйм и сохраняет значения плотности для эквивалентных пикселей на дюйм в файле.

fmw42 21.06.2024 21:02

Большое спасибо. Кажется, я имел в виду именно это.

user25418595 21.06.2024 21:04

Что касается нашей дискуссии о том, почему magick identify сообщает XX-PixelsPerInch для некоторых изображений PNG, я открыл вопрос здесь: stackoverflow.com/q/78654336

user25418595 21.06.2024 22:37

Я уже открывал его по адресу github.com/ImageMagick/ImageMagick/discussions/7420. Не дублируйте вопросы.

fmw42 21.06.2024 23:26

P.S. Вы можете добавить к моему сообщению, если у вас есть что-то имеющее отношение к вопросу, который я не опубликовал.

fmw42 22.06.2024 00:47

Спасибо, я сначала не заметил. Помимо того, что мы обсуждаем на GitHub, не могли бы вы объяснить, допустимо ли изображение (PNG или JPEG) с Units как Unspecified (вместо того, чтобы они были указаны как PixelsPerInch или PixelsPerCentimeter)?

user25418595 22.06.2024 13:26

Некоторые программные инструменты не устанавливают единицы измерения или плотность автоматически.

fmw42 22.06.2024 18:53

Ниже приведены некоторые дополнительные тесты, объясняющие то, что сказал fmw42.

Входной файл — a.png. magick identify -format %xx%y-%U a.pngотчеты72x72-Unspecified.

В третьем столбце таблицы показано, что magick identify -format %xx%y-%U <filename> сообщает о результирующем файле.

Команда ImageMagick Та же команда в прозе 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 (в зависимости от изображения (конечно)).

Другие вопросы по теме