Ответ 1
Inkscape сделает это:
inkscape \
--export-png=out.png --export-dpi=200 \
--export-background-opacity=0 --without-gui in.svg
Я хочу преобразовать SVG-изображения в PNG файлы с прозрачным фоном и сглаженными краями (используя полупрозрачные пиксели). К сожалению, я не могу заставить ImageMagick делать сглаживание, края всегда выглядят ужасно. Вот что я пробовал:
convert +antialias -background transparent in.svg -resize 25x25 out.png
Любые идеи или другой инструмент командной строки, который я мог бы использовать?
Inkscape сделает это:
inkscape \
--export-png=out.png --export-dpi=200 \
--export-background-opacity=0 --without-gui in.svg
В качестве побочной заметки я обнаружил, что получение прозрачности было несколько сложным. Вместо того, чтобы использовать прозрачный, я должен был использовать его.
convert -background none in.svg out.png
Собственно, чтение документации imagemagick:
-antialias
Включить/отключить рендеринг пикселей сглаживания при рисовании шрифтов и строк. По умолчанию объекты (например, текст, линии, многоугольники и т.д.) Сглаживаются при рисовании. использование + antialias, чтобы отключить добавление пикселей сглаживания края. Затем это уменьшит количество цветов, добавляемых к изображению, только к прямым рисункам. То есть, нет смешанные цвета добавляются при рисовании таких объектов.
+ antialias действительно отключит сглаживание.
Как я узнал, как это сделать, из методологии, найденной здесь: Как преобразовать файл .eps в высокое качество 1024x1024.jpg?
Это та же идея, что и решение @halfer с inkscape
- сначала включить DPI, но вы можете сделать то же самое только в imagemagick
с помощью опции -density
.
convert -density 200 in.svg -resize 25x25 -transparent white out.png
Добавление опции -transparent white
решает проблему, особенно в моем случае, потому что фон не удален полностью (к сожалению, присутствует легкая тень). Поэтому я использую ИМХО более четкое решение, которое полностью удаляет фон с помощью ImageMagic:
convert -channel rgba -background "rgba(0,0,0,0)" in.svg out.png
Он устанавливает полностью прозрачный черный цвет в качестве фона через канал RGBA.
Я добавляю прямоangularьник в качестве фона. Вставить CSS скрыть фон. Затем я ловлю его цвет для установки прозрачного атрибута ImageMagick.
Файл SVG:
<?xml version="1.0" ?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
<svg
version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="500px" height="500px"
viewBox="0 0 500 500"
enable-background="new 0 0 500 500"
>
<defs>
<style>
#background { display: none; }
</style>
</defs>
<rect id="background" x="0" y="0" width="500" height="500" fill="#e8e437"/>
<!-- beginning of the sketch -->
<g fill="#000" text-anchor="middle"font-size="112">
<text y="350" x="192">OK</text>
</g>
<!-- end of the sketch -->
</svg>
скрипт bash
#!/bin/bash
BASE_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )
SVG_DIR="$BASE_DIR/import"
PNG_DIR="$BASE_DIR/export"
for f in 'ls $SVG_DIR/*.svg'
do
g="$PNG_DIR/$(basename "$f" .svg).png"
BGCOLOR='grep 'id="background"' $f \
| sed 's/.* fill="\([^"]*\)".*/\1/''
convert $f -transparent "$BGCOLOR" $g
done
Я получаю лучшие, уже сглаженные результаты, если я заменю -resize
на -scale
. Тогда флаг antialias
даже не нужен.