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?
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:
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'
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}`
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ổ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
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.
Đâ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 cd
vào thư mục. Đối với các tùy chọn nâng cao hơn, hãy kiểm tra README .
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
${file%svg}png
là một mẹo hay! Tôi đã không nhìn thấy điều đó trước đây.