ImageMagick을 사용하여 안티 앨리어싱을 사용하여 SVG를 투명 PNG로 변환
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
참고로 투명성을 얻는 것이 약간 까다 롭다는 것을 알았습니다. transparent 를 사용하는 대신 none 을 사용해야했습니다 .
convert -background none in.svg out.png
사실, imagemagick 문서 읽기 :
-안티 앨리어스
글꼴과 선을 그릴 때 앤티 앨리어싱 픽셀 렌더링을 활성화 / 비활성화합니다. 기본적으로 개체 (예 : 텍스트, 선, 다각형 등)는 그릴 때 앤티 앨리어싱됩니다. 안티 앨리어싱 가장자리 픽셀의 추가를 비활성화하려면 + 앤티 앨리어싱을 사용합니다. 그러면
이미지에 추가되는 색상 수가 직접 그려지는 색상으로 만 줄어 듭니다 . 즉, 이러한 개체를 그릴 때 혼합 된> 색상이 추가되지 않습니다.
+의 앤티 앨리어싱은 참으로 비활성화 안티 앨리어싱을 것이다.
이 작업을 수행하는 방법을 배운 방법은 여기에있는 방법론에서이었습니다 . .eps 파일을 고품질 1024x1024 .jpg로 변환하는 방법은 무엇입니까?
inkscape
DPI를 먼저 잭업하는 @halfer의 솔루션과 동일한 아이디어 이지만 옵션을 imagemagick
사용하여 동일한 작업을 수행 할 수 있습니다 -density
.
convert -density 200 in.svg -resize 25x25 -transparent white out.png
-transparent white
옵션을 추가하면 특히 배경이 완전히 제거되지 않았기 때문에 문제가 해결 됩니다 (불행히도 밝은 그림자가 있음). 따라서 ImageMagic으로 배경을 완전히 제거하는 IMHO보다 명확한 솔루션을 사용 하고 있습니다.
convert -channel rgba -background "rgba(0,0,0,0)" in.svg out.png
RGBA 채널을 통해 완전히 투명한 검정색을 배경으로 설정합니다.
직사각형을 배경으로 추가합니다. 삽입 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
플래그가 필요하지 않습니다.
'Nice programing' 카테고리의 다른 글
Vue @click 이벤트 핸들러에 매개 변수를 전달하는 방법 (0) | 2020.11.29 |
---|---|
정규식으로 괄호 안의 텍스트를 제거하려면 어떻게해야합니까? (0) | 2020.11.29 |
Java 컴파일러 레벨이 설치된 프로젝트 패싯과 일치하지 않는 이유는 무엇입니까? (0) | 2020.11.29 |
std :: fill을 사용하여 증가하는 숫자로 벡터 채우기 (0) | 2020.11.29 |
C #에서 새 개체를 만들 때 {}가 ()처럼 작동합니까? (0) | 2020.11.29 |