Có cách nào để xuất hàng loạt SVG sang PNG không?


18

Tôi có các SVGS này và tôi muốn xuất chúng thành hình ảnh PNG, tôi có thể xuất chúng bằng Inkscape nhưng điều đó có nghĩa là mở từng tệp và xuất tệp đó sang PNG không hiệu quả (tôi có hàng trăm tệp).

Tôi có thể làm cái này như thế nào?

Câu trả lời:


16

Lấy cảm hứng từ câu trả lời được chấp nhận trước đây, tôi đã đưa ra một lớp lót này:

Đối với Inkscape phiên bản 0.92.4 trở về trước:

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

Bằng cách này, bạn không cần phải gọi một kịch bản. Nếu bạn muốn, bạn có thể tạo một bí danh để chuyển đổi tất cả các Svss trong thư mục hiện tại thành pngs:

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

Đối với Inkscape phiên bản 1.0 Beta trở lên:

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

Bằng cách này, bạn không cần phải gọi một kịch bản. Nếu bạn muốn, bạn có thể tạo một bí danh để chuyển đổi tất cả các Svss trong thư mục hiện tại thành pngs:

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

1
${file%svg}pnglà một mẹo hay! Tôi đã không nhìn thấy điều đó trước đây.
Chester

Tôi nghĩ rằng điều này không làm việc với không gian trong tên tập tin.
Genom

26

Dường như bạn có thể sử dụng Inkscape từ dòng lệnh:

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

biết thêm chi tiết

Tôi tưởng tượng bạn có thể viết một tập lệnh bash đơn giản để xử lý tất cả các tệp SVG:

#!/bin/sh

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

ví dụ trên chuyển đổi tất cả các tệp .svg trong thư mục hiện tại, thêm phần mở rộng .png vào các tệp đầu ra.


Tôi đang cố gắng xuất hàng trăm svss, làm cách nào tôi có thể đặt giá trị xuất (mệnh) để họ giữ tên của họ? bởi vì điều này dường như hoạt động tốt cho một số lượng nhỏ.
Uri Herrera

@UriHerrera: Tôi đã cập nhật câu trả lời
Sergey

tất cả các tệp được lưu định dạng {file} .svg.png thay vì {file} .png? Làm thế nào để khắc phục điều đó? và cũng trên SVG ban đầu, nó xuất hiện một biểu tượng phím tắt nhỏ ở góc dưới bên phải, nó biến mất khi nó được chuyển đổi thành PNG (Tôi đang cố gắng chuyển đổi gói biểu tượng)
Tosho

@Tosho Hiện tại tôi đang ở trên Windows, nhưng nó phải giống như thế này: pastebin.com/TEDfvxPC
user31389

2
@Tosho Bạn cũng có thể làm được ${file%svg}png. Bạn có thể đọc ở đây để có nhiều khả năng hơn.
jja

5

Tập lệnh đồ họa Nautilus


Tổng quat

Dòng lệnh rất tốt cho chuyển đổi hàng loạt nhưng đôi khi bạn không muốn để lại sự thoải mái cho GUI của mình. Đó là lý do tại sao tôi mã hóa tập lệnh Nautilus dựa trên GUI để chuyển đổi hàng loạt tệp SVG thành hình ảnh PNG. Các trình quản lý tệp khác có hành động tùy chỉnh (ví dụ Thunar) cũng nên được hỗ trợ.

Ảnh chụp màn hình

nhập mô tả hình ảnh ở đây

Kịch bản

#!/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

Tôi sẽ cố gắng cập nhật câu trả lời này nhưng vui lòng kiểm tra kho Github của tôi để biết phiên bản mới nhất của tập lệnh.

Cài đặt

Hướng dẫn cài đặt chung cho tất cả các tập lệnh Nautilus có thể được tìm thấy ở đây . Các lệnh sau sẽ bao gồm tất cả các phụ thuộc cần thiết:

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

Để biết thêm thông tin xin vui lòng tham khảo tiêu đề kịch bản ở trên.

Sử dụng

Sau khi cài đặt tập lệnh, bạn sẽ có thể gọi nó từ menu ngữ cảnh của trình quản lý tệp. Chỉ cần chọn một hoặc nhiều tệp SVG và nhấp vào mục thích hợp trong menu ngữ cảnh của bạn. Một hộp thoại GUI sẽ xuất hiện với một số tùy chọn che giấu chuyển đổi.

Bạn có thể chuyển đổi SVG dựa trên DPI hoặc chiều rộng. Tỷ lệ khung hình sẽ được bảo tồn trong cả hai trường hợp. Đảm bảo cung cấp DPI hoặc chiều rộng của sự lựa chọn trước khi nhấp vào các nút chuyển đổi.

Bạn cũng có thể chọn giữa xuất tệp SVG đầy đủ hoặc chỉ bản vẽ được cắt. Nếu khung vẽ SVG của bạn có nhiều khoảng trống, bạn nên chọn "Vẽ" làm tùy chọn xuất.


2

Đây là một giải pháp thay thế hơi khác trong một ngôn ngữ kịch bản dễ đọc hơn - python. Nó có thể xuất hàng loạt tất cả các Svss của bạn. Đặc biệt lý tưởng nếu bạn đang làm Android dev và phải tạo nhiều png từ một svg.

Disclaimer: Tôi đã viết lib. Hy vọng nó sẽ giúp được ai đó.

Nhấn vào đây .

Để sử dụng đơn giản, hãy tải thư viện vào một thư mục, đặt các Svss vào cùng một thư mục, sau đó chạy

python exporter.py

trong dòng lệnh / terminal sau khi bạn cdvào thư mục. Đối với các tùy chọn nâng cao hơn, hãy kiểm tra README .


Cảm ơn David, tôi đã chỉnh sửa câu trả lời của mình để cung cấp thêm chi tiết!
Kevin Lee

1

Nếu không phải tất cả các tệp, nhưng chỉ một số tệp SVG nhất định cần được chuyển đổi thành PNG, người ta có thể sử dụng sedđể tự động tạo tên tệp:

inkscape --without-gui --export-width=1280 --export-png=`echo $1 |sed -e 's/svg$/png/'` $1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.