SVG를 PNG로 일괄 내보내기하는 방법이 있습니까?


18

나는 SVGS를 가지고 있으며 PNG 이미지로 내보내고 싶습니다. 잉크 스케이프로 내보낼 수는 있지만 각 파일을 열고 해당 파일을 PNG로 내 보내면 비효율적입니다 (수백 개가 있음).

어떻게해야합니까?

답변:


16

이전에 받아 들여진 대답에서 영감을 얻어이 하나의 라이너를 생각해 냈습니다.

Inkscape 버전 0.92.4 이하의 경우 :

for file in *.svg; do inkscape $file -e ${file%svg}png; done

이런 식으로 스크립트를 호출 할 필요가 없습니다. 원하는 경우 현재 디렉토리의 모든 svgs를 png로 변환하기위한 별명을 작성할 수 있습니다.

alias svgtopng='for file in *.svg; do inkscape $file -e ${file%svg}png; done'

Inkscape 버전 1.0 베타 이상 :

for file in *.svg; do inkscape $file -o ${file%svg}png; done

이런 식으로 스크립트를 호출 할 필요가 없습니다. 원하는 경우 현재 디렉토리의 모든 svgs를 png로 변환하기위한 별명을 작성할 수 있습니다.

alias svgtopng='for file in *.svg; do inkscape $file -o ${file%svg}png; done'

1
${file%svg}png좋은 트릭입니다! 나는 전에 그것을 보지 못했다.
체스터

파일 이름의 공백으로는 작동하지 않는다고 생각합니다.
Genom

26

커맨드 라인에서 Inkscape를 사용할 수 있습니다.

`#{INKSCAPE_PATH} -z -f #{source_svg} -w #{width} -j -e #{dest_png}`

자세한 내용은

모든 SVG 파일을 처리하기 위해 간단한 bash 스크립트를 작성할 수 있다고 생각합니다.

#!/bin/sh

for file in *.svg
do
     /usr/bin/inkscape -z -f "${file}" -w 640 -e "${file}.png"
done

위의 예는 현재 디렉토리의 모든 .svg 파일을 변환하여 출력 파일에 .png 확장자를 추가합니다.


수백 개의 svgs를 내보내려고하는데 이름을 유지하도록 내보내기 값 (대상)을 어떻게 설정할 수 있습니까? 이것은 소량으로는 잘 작동하는 것 같습니다.
Uri Herrera

@UriHerrera : 답변을 업데이트했습니다
Sergey

모든 파일이 {file} .png 대신 {file} .svg.png 형식으로 저장됩니까? 어떻게 고쳐? 또한 원본 SVG에서는 PNG로 변환 할 때 사라지는 오른쪽 하단에 작은 바로 가기 아이콘이 나타납니다 (아이콘 팩을 변환하려고 함)
Tosho

@Tosho 현재 Windows를 사용하고 있지만 다음과 같아야합니다. pastebin.com/TEDfvxPC
user31389

2
@Tosho 당신도 할 수 있습니다 ${file%svg}png. 더 많은 가능성을 보려면 여기 를 읽으 십시오 .
jja

5

노틸러스 그래픽 스크립트


개요

명령 행은 배치 변환에 유용하지만 GUI를 편안하게 사용하고 싶지 않은 경우가 있습니다. 그렇기 때문에 SVG 파일을 PNG 이미지로 일괄 변환하기 위해 GUI 기반 노틸러스 스크립트를 코딩했습니다. 사용자 지정 동작 (예 : Thunar)이있는 다른 파일 관리자도 지원해야합니다.

스크린 샷

여기에 이미지 설명을 입력하십시오

스크립트

#!/bin/bash

# NAME:         SVG2PNG
# VERSION:      0.1
# AUTHOR:       (c) 2014 Glutanimate (https://github.com/Glutanimate)
#
# DESCRIPTION:  Simple application to convert SVG files to PNG files based on DPI or resolution. 
#               Designed to work as a context menu script in file managers like Nautilus and Thunar.
#
# FEATURES:     - Converts SVG image file to PNG raster of a specific DPI or width
#               - SVG preview
#               - choose between converting the full SVG page or only the cropped image
#
# DEPENDENCIES: inkscape imagemagick yad
#               YAD (1) is an advanced for of Zenity with many improvements. It's not included in the
#               official Ubuntu repos yet (2) but can be installed from a webupd8 PPA (3)
#
# LICENSE:      MIT license (http://opensource.org/licenses/MIT)
#
# NOTICE:       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
#               INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
#               PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
#               LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
#               TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
#               OR OTHER DEALINGS IN THE SOFTWARE.
#
#
# USAGE:        SVG2PNG image1.svg image2.svg [..]
#               I recommend installing this script as a context menu action for your file manager.
#               Instructions for Nautilus may be found on AskUbuntu (4).
#
# NOTES:        The script uses convert for previews because it's faster. For optimal results
#               the actual conversion is done with inkscape's command line interface.
#
# LINKS:        (1) https://code.google.com/p/yad/
#               (2) https://bugs.launchpad.net/ubuntu/+bug/796633
#               (3) https://launchpad.net/~webupd8team/+archive/y-ppa-manager
#               (4) /ubuntu/236414/how-can-i-install-a-nautilus-script

############## DIALOGS ###################

TITLE="SVG to PNG"
ICON="svg"

############## USGCHECKS #################

# checks if user selected an item

if [ $# -eq 0 ]
  then
      yad --title="$TITLE" \
          --image=dialog-error \
          --window-icon=dialog-error \
          --class="$WMCLASS" \
          --text="Error: no file selected" \
          --button="Ok":0
      echo "Error: no file selected"
      exit
fi

############### GLOBVAR ##################

SVGFILES="$@"
TEMPDIR=$(mktemp -d)
PREVIEWIMG="$TEMPDIR/svgpreview.png"

############### CLEANUP ##################

trap "rm -r $TEMPDIR" EXIT 

############## FUNCTIONS #################

converttosvg_dpi(){

echo "Converting based on DPI."

while [ $# -gt 0 ]; do

    echo "$# file(s) left to convert."
    SVGFILE="$1"
    FILESTEM="${SVGFILE%%.*}"
    PNGFILE="$FILESTEM".png
    inkscape "$SVGFILE" -z --export-dpi="$DPI" \
    --"$AREASETTING" --export-png="$PNGFILE"
    shift

done
echo "Done."

}

converttosvg_res(){

echo "Converting based on Width."

while [ $# -gt 0 ]; do

    echo "$# file(s) left to convert."
    SVGFILE="$1"
    FILESTEM="${SVGFILE%%.*}"
    PNGFILE="$FILESTEM".png
    inkscape "$SVGFILE" -z --export-width="$WIDTH" \
    --"$AREASETTING" --export-png="$PNGFILE"
    shift

done
echo "Done."

}

createpreview() {
convert -resize 128x "$1" "$PREVIEWIMG"
}

getsettings() {

SETTINGS=$(yad --window-icon "$ICON" --image "$PREVIEWIMG" --width 300 --height 200 --always-print-result \
--form --separator="|" --title="$TITLE" --text "Please choose the DPI or resolution to convert to." \
--field="DPI:NUM" 10[!80..600[!10]] --field="Width in px:NUM" 16[!16..4096[!16]] \
--field="Area:":CB "Drawing"\!"Page" \
--button="Convert based on DPI:2" --button="Convert based on Resolution:3" --button="gtk-cancel:1")

RET=$? # Exit code?

if [ "$RET" = 252 ] || [ "$RET" = 1 ]  # WM-Close or "Abort"
  then
      echo "Exiting..."
      exit
fi

DPI=$(printf %.0f $(cut -d "|" -f 1 <<<"$SETTINGS")) #round values
WIDTH=$(printf %.0f $(cut -d "|" -f 2 <<<"$SETTINGS"))
AREA=$(cut -d "|" -f 3 <<<"$SETTINGS")

case "$AREA" in

Drawing)
  AREASETTING="export-area-drawing"
  ;;

Page)
  AREASETTING="export-area-page"
  ;;

esac

echo "DPI set to $DPI"
echo "Width set to $WIDTH"
echo "Area set to $AREA"

}


################ MAIN ####################

createpreview "$1"
getsettings

case "$RET" in

2)
  echo 2
  converttosvg_dpi "$@"
  ;;

3)
  echo 3
  converttosvg_res "$@"
  ;;

esac

exit 0

이 답변을 업데이트하려고 시도하지만 최신 버전의 스크립트에 대해서는 Github 리포지토리 를 확인하십시오 .

설치

모든 노틸러스 스크립트에 대한 일반적인 설치 지침은 여기에 있습니다 . 다음 명령은 필요한 모든 종속성을 포함해야합니다.

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad inkscape imagemagick

자세한 내용은 위의 스크립트 헤더를 참조하십시오.

용법

스크립트를 설치 한 후 파일 관리자의 상황에 맞는 메뉴에서 스크립트를 호출 할 수 있어야합니다. SVG 파일을 하나 이상 선택하고 상황에 맞는 메뉴에서 해당 항목을 클릭하십시오. GUI 대화 상자에는 변환에 관한 몇 가지 옵션이 나타납니다.

DPI 또는 너비를 기준으로 SVG를 변환 할 수 있습니다. 두 경우 모두 종횡비가 보존됩니다. 변환 버튼을 클릭하기 전에 DPI 또는 선택한 너비를 제공하십시오.

전체 SVG 파일을 내보내거나 자른 도면 만 내보낼 수도 있습니다. SVG 캔버스에 빈 공간이 많은 경우 내보내기 옵션으로 "도면"을 선택하는 것이 좋습니다.


2

좀 더 읽기 쉬운 스크립팅 언어 인 파이썬과는 약간 다른 대안 솔루션이 있습니다. 모든 svgs를 일괄 적으로 내보낼 수 있습니다. Android 개발을 수행하고 단일 svg에서 여러 png를 만들어야하는 경우 특히 이상적입니다.

면책 조항 : 나는 lib를 썼습니다. 그것이 누군가를 돕기를 바랍니다.

여기를 클릭 하십시오 .

간단하게 사용하려면 라이브러리에 라이브러리를 다운로드하고 svgs를 동일한 폴더에 넣은 다음 실행하십시오.

python exporter.py

cd폴더로 이동 한 후 명령 행 / 터미널에 고급 옵션에 대해서는 README를 확인하십시오 .


감사합니다 David, 자세한 내용을 제공하기 위해 답변을 편집했습니다!
Kevin Lee

1

모든 파일이 아닌 특정 SVG 파일 만 PNG로 변환해야하는 경우 파일 이름을 자동으로 생성하는 데 사용할있습니다 sed.

inkscape --without-gui --export-width=1280 --export-png=`echo $1 |sed -e 's/svg$/png/'` $1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.