ImageMagick преобразование SVG в PNG потребляет самые правые и самые нижние пиксели

#imagemagick

#imagemagick

Вопрос:

При преобразовании SVG-файла в PNG с помощью ImageMagick (я использую 6.3.7) кажется, что строка пикселей справа и внизу теряется при преобразовании.

Например, рассмотрим этот простой SVG, который представляет алмаз, идеально вписывающийся в геометрию SVG 60×60. При преобразовании в SVG с

 convert diamond.svg diamond.png
  

он генерирует этот PNG (также размером 60×60 пикселей). Углы ромба в крайнем правом и нижнем углу были срезаны в формате PNG. Кроме того, ромб кажется немного увеличенным на 1 пиксель.

Может кто-нибудь подтвердить это поведение, возможно, предоставить какое-то обоснование и, возможно, предоставить исправление?

Комментарии:

1. Вы когда-нибудь проверяли мой ответ?

Ответ №1:

«Может ли кто-нибудь подтвердить это поведение, возможно, предоставить какое-то обоснование и, возможно, предоставить исправление?»

  1. SVG — это векторный формат и, как таковой, не знает пикселей (ну, если вы не вставляете пиксельные изображения в SVG …).

  2. Размеры ваших путей SVG, однако, определяются в пикселях. Вот почему его размер задан как 60×60.

  3. Когда вы визуализируете SVG (отображаете его в Inkscape или любом средстве просмотра SVG), вы можете незаметно масштабировать изображение, и вы никогда не обнаружите пикселизации (если только вы не используете лупу, чтобы увидеть пиксели экрана вашего монитора).

  4. Однако PNG не является векторным форматом, это формат растрового изображения, состоящий из пикселей. Для рисования диагональных черных краев необходимо использовать черные пиксели в «лестничной клетке» (возможно, сглаженные путем добавления нескольких пикселей в оттенках серого между ними для достижения эффекта сглаживания).

  5. Когда вы просите ImageMagick преобразовать ваш алмаз в формат PNG размером 60×60 пикселей, у него есть только сетка 60×60 для создания диагоналей.

  6. Теперь посчитайте: как вы можете поместить «совершенную» пиксельную лестницу, которая поднимается с высоты 1 пикселя до высоты 30 пикселей (это 31-й шаг, вы его посчитали?) и обратно до высоты 1 пикселя (это будет 61-й шаг, вы его посчитали?)) в такую сетку ?!? — Вы не можете!

  7. Единственное возможное «исправление» для сохранения идеальной формы (без «срезания» эффектов, как вы заметили) — это масштабирование PNG до размера 61×61 (или 122×122):

     convert diamond.svg -resize 61x61  antialias diamond.png
    
    rsvg-convert -w 61 -h 61 -o diamond-rsvg.png diamond.svg
      
  8. Преобразование векторной графики в пиксельную графику всегда что-то «потеряет» и всегда потребует от вас принятия какого-либо компромисса!