Chuyển đổi hàng loạt hình ảnh SVG sang kích thước PNG hoặc ICO mong muốn


26

Tôi có một loạt các biểu tượng SVG mà tôi muốn sử dụng cho ứng dụng của mình được phát triển trong VB.Net 2010 và vì nó không hỗ trợ xử lý các biểu tượng SVG, nên tôi cần chuyển đổi các biểu tượng đó thành PNG hoặc ICO, ưu tiên độ phân giải đầu ra. Tôi đã tìm thấy công cụ dòng lệnh như vậy cho Ubuntu được gọi rsvgconvert. Chúng ta có công cụ nào như vậy cho Windows không ??

Câu trả lời:


12

ImageMagick có một công cụ dòng lệnh có sẵn cho Linux và Windows (và các công cụ khác). Công cụ chuyển đổi được gọi là "convert" một cách thuận tiện. Đây là một số tài liệu sử dụng .

Và đây là nơi bạn có thể có được trình cài đặt Windows .


Bạn cũng có thể tải thông qua Hệ thống con Windows cho Linux (WSL), vớiapt install imagemagick
antonyh

(điều này áp dụng cho linux, có thể áp dụng cho windows) nếu bạn bật -verbose trên IM thì có vẻ như chính IM sử dụng inkscape để tạo tệp eps trung gian. do đó tôi sẽ đề nghị câu trả lời của @ zetah
phía bắc-bradley

Đây là một trình chuyển đổi dựa trên ImageMagick nhỏ cho Windows: fosshub.com/SVG2PNG.html Nó đã cũ (từ 2014), nhưng vẫn hoạt động và bạn không phải đọc bất kỳ tài liệu nào.
8day

20

ImageMagick không nên liên kết ngay lập tức với bất kỳ tác vụ hàng loạt nào liên quan đến hình ảnh. Đặc biệt trong trường hợp này, ImageMagick là giải pháp kém cho chuyển đổi SVG.

Thử tốt hơn Inkscape trên dòng lệnh:

inkscape in.svg --export-png=out.png


8
Tại sao bạn nói inkscape tốt hơn ImageMagick? Tôi không đồng ý (hoặc đồng ý), chỉ tò mò để biết thêm chi tiết.
Sam

Lý do là imageMagick phù hợp để xử lý tốt hơn png, jpg, v.v. trong khi inkscape phù hợp hơn để xử lý hình ảnh vector (svg)
user93

1
Như hiện tại, điều này không trả lời câu hỏi về chuyển đổi hàng loạt , phải không?
HOẶC Mapper

Trong khi câu trả lời hoạt động, trên Windows InkScape khăng khăng hiển thị màn hình giật gân lấy nét với độ trễ, điều này khiến cho không thể chạy chế độ này trong chế độ hàng loạt trong nền.
Timwi

@Timwi Điều đó không xảy ra ở đây. Chỉ cần nhớ sử dụng -ztùy chọn.
Svish

5

Dòng lệnh không hoạt động ngoài hộp, cộng với tôi muốn chuyển đổi 100 tệp. Đây là cách tôi làm cho nó hoạt động với windows 7:

  1. cài đặt inkscape - không phải là di động!

  2. sao chép tất cả các tập tin svg của bạn trong một thư mục, ví dụ: "C: \ svss \" ở đó:

  3. bạn tạo một convert.battập tin với dòng này bên trong:

    FOR %%A IN (*.svg) DO "C:\Program Files (x86)\Inkscape\inkscape.exe" --export-png=%%A.png
    

    (chỉ vào thư mục chính xác của cài đặt của bạn):

  4. mở CMD với tư cách quản trị viên! Để làm như vậy, nhấn phím WIN, nhập cmd, nhấp chuột phải vào "cmd.exe" và chọn "Chạy với tư cách quản trị viên".

  5. điều hướng đến "C: \ svss \" và loại convert.bat - Tất cả các tệp svg sẽ được chuyển đổi thành PNG.

  6. Sử dụng Windows Explorer để tìm kiếm các tệp PNG đã chuyển đổi. Trên PC của tôi, chúng nằm trong thư mục:C:\Users\myname\AppData\Local\VirtualStore\Program Files (x86)\Inkscape\svgs

Mong rằng sẽ giúp.


Vì độ phân giải cho dòng lệnh chỉ có thể được đặt cố định theo như tôi có thể thấy, tôi đã kết thúc bằng công cụ InkscapeBatch . Ở đó tôi có thể thiết lập DPI để tăng tất cả các hình ảnh tương đối.

Bạn cần chỉ định các cài đặt chính xác nếu không nó sẽ không hoạt động. Đây là những gì tôi đã làm:

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

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

Sau khi bạn nhấn "Kết thúc", bạn cần nhấn nút "Bắt đầu chuyển đổi hàng loạt ..." trên thanh công cụ:

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


1
Lệnh batch của bạn có thể thiếu một tên khác %%A(như một tên tệp đầu vào). Ngoài ra, tại sao bạn cho rằng nó chỉ nên hoạt động trong chế độ quản trị viên?
HOẶC Mapper

Vậy làm thế nào là tốt hơn so với sử dụng ImageMagick?
Revierpost

Đáng buồn thay, liên kết này dường như cũng đã chết. (tháng 8 năm 2017)
Ideogram

@Ideogram Tôi đã tìm được một nhà cung cấp khác về việc tải xuống. softsea.com/doad/InkscapeBatch.html
Kai Noack

để chỉ định dpi, bạn cần thêm tùy chọn này trong --export-dpi=100đó 100 là giá trị thứ của dpi
Xsmael


3

Để chuyển đổi SVG sang PNG, tôi thấy cairosvg ( https://cairosvg.org/ ) hoạt động tốt hơn ImageMagick. Các bước để cài đặt và chạy trên tất cả các tệp trong thư mục của bạn.

pip3 install cairosvg

Mở shell python trong thư mục chứa tệp .svg của bạn và chạy:

import os

for file in os.listdir('.'):
    name = file.split('.svg')[0]
    cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 

Điều này cũng sẽ đảm bảo bạn không ghi đè lên các tệp .svg ban đầu của mình, nhưng sẽ giữ nguyên tên. Sau đó, bạn có thể di chuyển tất cả các tệp .png của mình sang thư mục khác với:

$ mv *.png [new directory]

Câu trả lời này là câu duy nhất hoạt động cho tệp SVG khá lớn của tôi, cảm ơn !!!
Ben Sandeen

1

Sau khi vật lộn với điều này trong gần 2 giờ, tôi đã giải quyết với Inkscape. Vì tôi cần phải chuyển đổi hàng loạt các tệp ở nhiều độ phân giải khác nhau, tôi đã tạo một tập lệnh Powershell. Với 106 SVG, máy tính của tôi bị đóng băng trong khoảng 5 giây, vì vậy hãy cẩn thận khi sử dụng.

# ENTER THE FULL PATH TO THE INKSCAPE EXECUTABLE
$inkscapeExe = "C:\Program Files\Inkscape\inkscape.exe"
# ENTER THE PATH TO THE FOLDER CONTAINING THE SVGs
$svgFolder = "C:\Images\SVG"
# ENTER THE DESIRED WIDTH
$width = 120
# ENTER THE DESIRED HEIGHT
$height = 120

$svgFiles = Get-ChildItem $svgFolder -Filter *.svg
foreach ($svgFile in $svgFiles)
{
    $inputParam  = $svgFile.FullName 
    $outputParam = "--export-png=" + $svgFile.FullName + "-" + $width + "x" + $height + ".png" 
    $widthParam  = "-w" + $width
    $heightParam = "-h" + $height

    & $inkscapeExe $inputParam $outputParam $widthParam $heightParam
}

Của tôi đóng băng trong hơn một vài giây. Các &nhà khai thác bắt đầu một quá trình mới và tiếp tục ngay lập tức, vì vậy kịch bản này sẽ tạo bao nhiêu quá trình inkscape.exe mới là bạn có file svg. Hóa ra điều này làm cho máy tính của bạn khá chậm trong một thời gian.
Rory

Nếu bạn đặt | Out-Nullở cuối dòng bắt đầu với &nó, nó sẽ buộc nó chạy lệnh inkscape.exe một lần, hoạt động tốt hơn nhiều đối với tôi.
Rory

1

Bạn có thể sử dụng các mục sau trong Bash / Ubuntu cho Windows, trong thư mục bạn có các SVG tại. Tuy nhiên, có vẻ như ImageMagick lần đầu tiên rasterize sau đó thay đổi kích thước, dẫn đến kết quả là tạo tác lạ

find -name "*.svg" -exec convert {} -background none -density 300 -resize 256x256 -define icon:auto-resize -alpha remove -colors 256 {}.ico \;

Cũng xem đây là giải pháp dựa trên Inscape dường như đang hoạt động tốt (từ một luồng khác, liên kết bị mất): mkdir temp; declare -a res=(16 24 32 48 64 128 256); for f in *.svg; do for r in "${res[@]}"; do inkscape -z -e temp/${f}${r}.png -w $r -h $r $f; done; resm=( "${res[@]/#/temp/$f}" ); resm=( "${resm[@]/%/.png}" ); convert "${resm[@]}" ${f%%.*}.ico; done; rm -rf temp;


1
+1 Tôi đã sử dụng nó với inkscape trong một phiên bản rất đơn giản find -name "*.svg" -exec inkscape {} -e {}.png \;Mặc dù tôi thích phiên bản này hơn: ls | grep ".svg" | xargs -I file inkscape file -e file.pngvì các tệp được xử lý theo thứ tự bảng chữ cái - đây không phải là trường hợp, khi sử dụngfind
lov.by.Jesus


0

Tôi không thể tìm thấy một lệnh duy nhất hoạt động để chạy một lô vì vậy tôi đã làm cho nó hoạt động bằng cách tạo danh sách tệp và tạo một loạt lệnh. Các hướng dẫn này sẽ hoạt động cho tất cả các phiên bản Windows. Tất cả các hướng dẫn gõ loại trừ trích dẫn và bao gồm tất cả mọi thứ giữa chúng.

Để làm điều này, bạn sẽ cần Inkscape, MS Excel hoặc trình soạn thảo bảng tính tương đương và trình tạo danh sách. Có một trình tạo danh sách phần mềm miễn phí nhỏ tuyệt vời tại đây: https://www.portablefreeware.com/?id=1171

  • Hardlink, sao chép hoặc di chuyển tất cả các tập tin svg vào một thư mục.
  • Tạo một danh sách tập tin của thư mục đó và xuất sang csv.
  • Mở csv trong Excel và xóa tất cả các cột trừ cột tên tệp. Đồng thời xóa các tiêu đề cột như [Đường dẫn] và văn bản tóm tắt ở phía dưới.
  • Nếu tên tệp chưa có trong cột thứ hai, hãy cắt và dán chúng vào đó.
  • Trong ô đầu tiên của kiểu cột đầu tiên inkscape theo sau là khoảng trắng và đường dẫn thư mục chứa các tệp svg của bạn bao gồm dấu gạch chéo ngược (ví dụ: "inkscape C: \ SVG \"). Sau đó sao chép ô này, chọn tất cả các ô bên dưới nó trước tên tệp và dán để tất cả chúng có cùng một văn bản.
  • Trong loại cột thứ ba --export-png = trong ô đầu tiên theo sau là thư mục đích bạn muốn lưu chúng vào. Tôi chỉ sử dụng cùng một thư mục. Để cú pháp được chính xác, hãy đảm bảo thêm một khoảng trắng ở đầu nhưng giữ phần còn lại của văn bản (ví dụ: "--export-png = C: \ PNG \"). Sao chép và dán này cho tất cả các hàng giống như cột đầu tiên
  • Sao chép toàn bộ cột thứ hai và dán nó vào cột thứ tư. Với cột thứ tư được chọn Nhấn Ctrl + H (Tìm & Thay thế). Trong loại tìm trường ".svg" Trong loại trường thay thế ".png", sau đó chọn Thay thế tất cả.

Nếu bạn đã thực hiện điều này một cách chính xác, bạn sẽ có một hàng cho mỗi tên tệp trông như thế này: | inkscape C: \ SVG \ | Filename1.svg | --export-png = C: \ PNG \ | Tên tệp1.png |

  • Trong ô đầu tiên của cột thứ năm, gõ "= concatenate (a2, b2, c2, d2)". Điều này giả định rằng cột tiêu đề đã không bị xóa. Các số ô trong ngoặc phải đồng ý với số hàng hiện tại. Nếu tên tệp đầu tiên của bạn là B2, công thức trên là chính xác. Mặt khác, tên ô trong ngoặc để khớp với hàng của tên tệp đầu tiên (ví dụ a1, b1, c1 ...)
  • Sao chép và dán ô này để điền vào tất cả bên dưới nó giống như cột 1 và 3.
  • Bây giờ sao chép toàn bộ cột thứ năm đó và sử dụng Dán Đặc biệt> Giá trị để dán văn bản được tạo bởi các công thức vào cột thứ sáu. Cột thứ sáu này là tiền bắn của bạn. Sao chép toàn bộ cột thứ sáu, Mở Notepad và dán cột cuối cùng vào đó. Nếu bạn đã thực hiện điều này một cách chính xác, bạn sẽ có một dòng lệnh để chuyển đổi từng tệp svg của bạn thành pngs.
  • Lưu tệp Notepad vào thư mục Inkscape dưới dạng tệp bó. Khi cửa sổ lưu dưới dạng mở ra, hãy thay đổi loại Lưu dưới dạng thành "Tất cả tệp" và lưu dưới dạng tệp .bat (ví dụ: "C: \ Chương trình tệp \ Inkscape \ SVGBatch.bat"
  • Tất cả những gì còn lại phải làm là vào thư mục đó và nhấp đúp vào tệp bó bạn vừa lưu. Nó sẽ mở một dấu nhắc lệnh và chuyển đổi tất cả các tập tin.

Hy vọng rằng làm cho cuộc sống của ai đó dễ dàng hơn. James


0

Câu trả lời của Kai rất gần, nhưng không hiệu quả với tôi. Tuy nhiên, với một vài điều chỉnh nhỏ, lần đầu tiên nó hoạt động hoàn hảo:

  1. Sao chép SVG của bạn vào một vị trí thuận tiện
  2. Tạo một tệp văn bản trong cùng một thư mục và đổi tên nó convert.bat
  3. Mở convert.battrong trình soạn thảo văn bản / mã yêu thích của bạn và nhập thông tin sau:

FOR %%A IN (*.svg) DO "C:\Program Files\Inkscape\inkscape.exe" %%A --export-png=%%A.png

(Lưu ý rằng inkscape.exevị trí phải khớp với vị trí chương trình thực thi trên PC của bạn và thứ hai trước đó --export-png%%A- đó là tệp SVG đang được chuyển đổi)

  1. Nhấp đúp convert.batđể chạy và nó sẽ hiện ra kết quả của các chuyển đổi.

Lưu ý rằng bạn có thể cần làm mới thư mục Windows của mình để xem các tệp mới, nhưng tất cả chúng phải được tạo ở cùng vị trí với các SVG gốc.


0

Không thể có được hình ảnh hoặc inkscape để làm việc cho tôi vì một số lý do. Tôi chỉ có 12 tệp để chuyển đổi chỉ sử dụng trang web này theo cách thủ công: http://svgtopng.com/ đã làm việc một điều trị.


0

Đây là một giải pháp dựa trên ImageMagick để chuyển đổi tất cả các tệp svg trong một thư mục đã cho thành các tệp ico:

mogrify -format ico -density 1200 -background transparent -trim -resize 256x256 -gravity center -extent 256x256 -define icon:auto-resize *.svg

Giải trình:

  • mogrify: Thích convert, nhưng cho phép bạn xử lý hàng loạt nhiều tệp.
  • -format ico: Định dạng tệp mục tiêu của chúng tôi. Tạo .icotập tin thay vì ghi đè tập tin gốc (theo cách mặc định sẽ làm theo mặc định).
  • -density 1200: Vì chúng tôi không thể chỉ định kích thước pixel mục tiêu mà ImageMagick nên rasterize SVG (trước tiên nó sẽ raster với mật độ mặc định và sau đó chia tỷ lệ), chúng tôi rasterize SVG với độ phân giải cực cao (1200dpi), để đảm bảo rằng hình ảnh sẽ được hạ thấp xuống 256x256 thay vì tăng giá.
  • -background transparent: Nền sẽ được hiển thị dưới dạng trong suốt.
  • -trim: Xóa đường viền hiện có xung quanh hình ảnh.
  • -resize 256x256: Chia tỷ lệ hình ảnh, đảm bảo rằng cạnh dài nhất có 256px, giữ tỷ lệ khung hình.
  • -gravity center -extent 256x256: Phóng to khung vẽ, đảm bảo rằng cạnh ngắn cũng có 256px. Hình ảnh hiện tại được căn giữa. Điều này là cần thiết bởi vì chúng ta cần một hình ảnh vuông làm cơ sở cho một tệp ICO.
  • -define icon:auto-resize: Bao gồm không chỉ hình ảnh 256x256 mà còn bao gồm tất cả các độ phân giải được đề xuất giảm (ví dụ 32x32) trong tệp ICO.

0

Hầu hết các câu trả lời được đưa ra ở đây bỏ qua phần kích thước mong muốn của câu hỏi. Tôi không thể có được kết quả hài lòng convertkhi sử dụng khi "nâng cấp" một SVG. inkscapelàm một công việc tốt hơn và cũng bảo tồn nền minh bạch.

Tùy thuộc vào trường hợp sử dụng của bạn, sử dụng một trong các tùy chọn sau:

  1. xuất tại DPI được chỉ định: inscape in.svg -d 300 -e out.png
  2. xuất ở độ rộng quy định (duy trì tỷ lệ khung hình): inscape in.svg -w 800 -e output.png
  3. xuất ở độ cao đã chỉ định (duy trì tỷ lệ khung hình): inscape in.svg -h 600 -e output.png

Lưu ý rằng việc chỉ định cả chiều rộng và chiều cao không bảo toàn tỷ lệ khung hình.

Để chuyển đổi nhiều tệp cùng một lúc, hãy điều chỉnh các mục sau cho trường hợp sử dụng của bạn (trong bashhoặc tương thích):

for f in *.svg; do
  inkscape $f -d 300 -e ${f%.*}.png
done
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.