ImageMagick конвертировать SVG в PNG съедает самые правые и самые нижние пиксели - PullRequest
4 голосов
/ 13 октября 2011

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

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

convert diamond.svg diamond.png

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

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

1 Ответ

0 голосов
/ 20 августа 2012

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

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...