Conversión por lotes de imágenes SVG al tamaño deseado PNG o ICO


26

Tengo un montón de íconos SVG que me gustaría usar para que mi aplicación se desarrolle en VB.Net 2010, y dado que no tiene soporte para manejar íconos SVG, necesito convertir esos íconos en PNG o ICO, con preferencia resolución de salida. He encontrado esa herramienta de línea de comandos para Ubuntu llamada rsvgconvert. ¿Tenemos alguna herramienta para Windows también?

Respuestas:


12

ImageMagick tiene una herramienta de línea de comandos que está disponible para Linux y Windows (y otros). La herramienta de conversión se llama convenientemente "convertir". Aquí hay alguna documentación de uso .

Y aquí es donde puede obtener un instalador de Windows .


También puede obtenerlo a través del Subsistema de Windows para Linux (WSL), conapt install imagemagick
antonyh

(esto se aplica a Linux, puede aplicarse a Windows) si activa -verbose en IM, entonces parecería que IM utiliza Inkscape para crear un archivo eps intermedio. por lo tanto, sugeriría la respuesta de @ zetah
northern-bradley

Aquí hay un pequeño convertidor basado en ImageMagick para Windows: fosshub.com/SVG2PNG.html Es antiguo (de 2014), pero aún funciona y no tiene que leer ningún documento.
días

20

ImageMagick no debe asociarse inmediatamente a cualquier tarea por lotes que involucre imágenes. Especialmente en este caso donde ImageMagick es una solución pobre para la conversión de SVG.

Mejor intente Inkscape en la línea de comando:

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


8
¿Por qué dices que inkscape es mejor que ImageMagick? No estoy en desacuerdo (o de acuerdo), solo tengo curiosidad por obtener más detalles.
Sam

El motivo por el que imageMagick es adecuado para manejar mejor png, jpg, etc., mientras que inkscape es más adecuado para manejar imágenes vectoriales (svg)
user93

1
Tal como está, esto no responde la pregunta sobre la conversión por lotes , ¿verdad?
O Mapper el

Si bien la respuesta funciona, en Windows InkScape insiste en mostrar una pantalla de bienvenida que capta el foco con un retraso, lo que hace que sea imposible ejecutar esto en modo por lotes en segundo plano.
Timwi

@Timwi Eso no sucede aquí. Solo recuerda usar la -zopción.
Svish

5

La línea de comando no funcionó de fábrica, además quería que se convirtieran 100 archivos. Así es como lo hice funcionar con Windows 7:

  1. instale inkscape , ¡no el portátil!

  2. copie todos sus archivos svg en una carpeta, por ejemplo, "C: \ svgs \" allí:

  3. crea un convert.batarchivo con esta línea dentro:

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

    (señale la carpeta correcta de su instalación):

  4. abre el CMD como administrador! Para hacerlo, presione la tecla WIN, escriba cmd, haga clic derecho en "cmd.exe" y seleccione "Ejecutar como administrador".

  5. navegue a su "C: \ svgs \" y escriba convert.bat - Todos los archivos svg se convertirán a PNG.

  6. Use el Explorador de Windows para buscar los archivos PNG convertidos. En mi PC estaban en la carpeta:C:\Users\myname\AppData\Local\VirtualStore\Program Files (x86)\Inkscape\svgs

Espero que ayude.


Como la resolución de la línea de comando solo podía establecerse fija hasta donde pude ver, terminé usando la herramienta InkscapeBatch . Allí podría establecer el DPI para aumentar todas las imágenes relativamente.

Debe especificar la configuración correcta o no funcionará. Aquí esta lo que hice:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Después de presionar "Finalizar", debe presionar el botón "Iniciar el convertidor por lotes ..." en la barra de herramientas:

ingrese la descripción de la imagen aquí


1
Su comando por lotes probablemente carece de otro %%A(como un nombre de archivo de entrada). Además, ¿por qué supone que solo debería funcionar en modo administrador?
O Mapper

Entonces, ¿cómo es esto mejor que usar ImageMagick?
reinierpost

Lamentablemente, este enlace parece haber muerto también. (agosto de 2017)
Ideograma

@Ideogram He encontrado otro proveedor de la descarga. softsea.com/download/InkscapeBatch.html
Kai Noack

para especificar el ppp necesita agregar esta opción --export-dpi=100donde 100 es el valor de ppp
Xsmael


3

Para la conversión de SVG a PNG, encontré que cairosvg ( https://cairosvg.org/ ) funciona mejor que ImageMagick. Pasos para instalar y ejecutar todos los archivos en su directorio.

pip3 install cairosvg

Abra un shell de Python en el directorio que contiene sus archivos .svg y ejecute:

import os

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

Esto también asegurará que no sobrescriba sus archivos .svg originales, pero mantendrá el mismo nombre. Luego puede mover todos sus archivos .png a otro directorio con:

$ mv *.png [new directory]

Esta respuesta es la única que funcionó para mi archivo SVG bastante grande, ¡gracias!
Ben Sandeen

1

Después de luchar con esto durante casi 2 horas, me instalé con Inkscape. Como necesitaba convertir por lotes un montón de archivos en muchas resoluciones diferentes, he creado un script Powershell. Con 106 SVG, mi computadora se congeló durante unos 5 segundos, así que tenga cuidado al usar esto.

# 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
}

La mía se congeló por más de unos segundos. El &operador inicia un nuevo proceso y continúa de inmediato, por lo que este script creará tantos procesos nuevos inkscape.exe como archivos svg. Resulta que esto hace que su computadora sea bastante lenta por un tiempo.
Rory

Si lo coloca | Out-Nullal final de la línea que comienza con &él, lo obligará a ejecutar el comando inkscape.exe de uno en uno, lo que me funciona mucho mejor.
Rory

1

Puede usar lo siguiente en Bash / Ubuntu para Windows, en la carpeta en la que tiene los SVG. Sin embargo, parece que ImageMagick primero rasteriza y luego cambia el tamaño, lo que resulta en extraños artefactos ...

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

También vea aquí la solución basada en Inscape que parece estar funcionando bien (desde otro hilo, enlace perdido): 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 Lo utilicé con Inkscape en una versión muy simplificada. find -name "*.svg" -exec inkscape {} -e {}.png \;Aunque prefiero esta versión: ls | grep ".svg" | xargs -I file inkscape file -e file.pngporque los archivos se procesan alfabéticamente, este no es el caso cuando usofind
loved.by.Jesus


0

No pude encontrar un solo comando que funcionara para ejecutar un lote, así que lo hice funcionar generando una lista de archivos y creando una serie de comandos. Estas instrucciones deberían funcionar para todas las versiones de Windows. Todas las instrucciones de mecanografía excluyen las citas e incluyen todo entre ellas.

Para hacer esto, necesitará Inkscape, MS Excel o un editor de hojas de cálculo comparable y un generador de listas. Hay un pequeño generador de listas de freeware aquí: https://www.portablefreeware.com/?id=1171

  • Enlace permanente, copie o mueva todos los archivos svg a una carpeta.
  • Genere una lista de archivos de esa carpeta y expórtela a csv.
  • Abra el csv en Excel y elimine todas las columnas excepto la columna del nombre del archivo. También elimine los encabezados de columna como [Ruta] y el texto de resumen en la parte inferior.
  • Si los nombres de los archivos no están en la segunda columna, córtelos y péguelos allí.
  • En la primera celda de la primera columna, escriba inkscape seguido de un espacio y la ruta de la carpeta donde sus archivos svg incluyen una barra diagonal inversa (por ejemplo, "inkscape C: \ SVG \"). Luego copie esta celda, seleccione todas las celdas debajo de ella que preceden a un nombre de archivo y péguelas para que todas tengan el mismo texto.
  • En la tercera columna, escriba --export-png = en la primera celda seguida de la carpeta de destino en la que desea guardarlos. Acabo de usar la misma carpeta. Para que la sintaxis sea correcta, asegúrese de agregar un espacio al principio, pero mantenga el resto del texto junto (por ejemplo, "--export-png = C: \ PNG \"). Copie y pegue esto para todas las filas al igual que la primera columna
  • Copie toda la segunda columna y péguela en la cuarta columna. Con esa cuarta columna seleccionada, presione Ctrl + H (Buscar y reemplazar). En el campo de búsqueda, escriba ".svg" En el campo de reemplazo, escriba ".png", luego seleccione Reemplazar todo.

Si ha hecho esto correctamente, debería tener una fila para cada nombre de archivo que se vea así: | inkscape C: \ SVG \ | Filename1.svg | --export-png = C: \ PNG \ | Filename1.png |

  • En la primera celda de la quinta columna, escriba "= concatenar (a2, b2, c2, d2)". Esto supone que la columna de encabezado no se ha eliminado. Los números de celda entre paréntesis deben coincidir con el número de fila actual. Si su primer nombre de archivo está en B2, la fórmula anterior es precisa. De lo contrario, los nombres de celda entre paréntesis son correctos para que coincidan con la fila del primer nombre de archivo (por ejemplo, a1, b1, c1 ...)
  • Copie y pegue esta celda para llenar todo debajo de ella al igual que las columnas 1 y 3.
  • Ahora copie toda la quinta columna y use Pegado especial> Valores para pegar el texto producido por las fórmulas en la sexta columna. Esta sexta columna es su oportunidad de dinero. Copie toda la sexta columna, abra el Bloc de notas y pegue la última columna en ella. Si ha hecho esto correctamente, tendrá una línea de comando para convertir cada uno de sus archivos svg en pngs.
  • Guarde el archivo del Bloc de notas en el directorio de Inkscape como un archivo por lotes. Cuando se abre la ventana Guardar como, cambie el tipo Guardar como a "Todos los archivos" y guárdelo como un archivo .bat (por ejemplo, "C: \ Archivos de programa \ Inkscape \ SVGBatch.bat"
  • Todo lo que queda por hacer es ir a esa carpeta y hacer doble clic en el archivo por lotes que acaba de guardar. Debería abrir un símbolo del sistema y convertir todos los archivos.

Espero que eso haga la vida de alguien más fácil. James


0

La respuesta de Kai es cercana, pero no funcionó para mí. Sin embargo, con un par de pequeños ajustes, esto funcionó a la perfección la primera vez:

  1. Copie sus SVG en una ubicación práctica
  2. Cree un archivo de texto en la misma carpeta y cámbiele el nombre convert.bat
  3. Abra convert.baten su editor de texto / código favorito e ingrese lo siguiente:

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

(Tenga en cuenta que la inkscape.exeubicación debe coincidir con la ubicación del programa ejecutable en su PC; y el segundo antes --export-pnges %%A: ese es el archivo SVG que se está convirtiendo)

  1. Haga doble clic convert.batpara ejecutar, y debería hacer eco de los resultados de las conversiones.

Tenga en cuenta que es posible que deba actualizar su carpeta de Windows para ver los nuevos archivos, pero todos deberían haberse creado en la misma ubicación que los SVG originales.


0

No pude hacer que imagemagick o inkscape me funcionen por alguna razón Solo tenía 12 archivos para convertir, solo utilicé este sitio manualmente: http://svgtopng.com/ funcionó de maravilla.


0

Aquí hay una solución basada en ImageMagick para convertir todos los archivos svg en un directorio dado a archivos ico:

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

Explicación:

  • mogrify: Me gusta convert, pero le permite procesar por lotes múltiples archivos.
  • -format ico: Nuestro formato de archivo de destino. Crea .icoarchivos en lugar de sobrescribir el archivo original (como lo haría mogrify de forma predeterminada).
  • -density 1200: Dado que no podemos especificar un tamaño de píxel objetivo en el que ImageMagick debería rasterizar el SVG (primero rasterizaría con una densidad predeterminada y luego escalar), rasterizamos el SVG con una resolución increíblemente alta (1200 ppp), para garantizar que la imagen será a escala reducida a 256x256 en lugar de mejorar la resolución.
  • -background transparent: El fondo se representará como transparente.
  • -trim: Elimina el borde existente alrededor de la imagen.
  • -resize 256x256: Escale la imagen, asegurándose de que el lado más largo tenga 256 píxeles, manteniendo la relación de aspecto.
  • -gravity center -extent 256x256: Agrande el lienzo y asegúrese de que el lado corto también tenga 256 píxeles. La imagen existente está alineada al centro. Esto es necesario porque necesitamos una imagen cuadrada como base para un archivo ICO.
  • -define icon:auto-resize: Incluya no solo la imagen de 256x256 sino también todas las resoluciones reducidas recomendadas (por ejemplo, 32x32) en el archivo ICO.

0

La mayoría de las respuestas dadas aquí ignoran la parte del tamaño deseado de la pregunta. No pude obtener resultados satisfactorios convertal "escalar" un SVG. inkscapehace un mejor trabajo y también preserva la transparencia de fondo.

Dependiendo de su caso de uso, use una de las siguientes opciones:

  1. exportar a DPI especificado: inscape in.svg -d 300 -e out.png
  2. exportar al ancho especificado (manteniendo la relación de aspecto): inscape in.svg -w 800 -e output.png
  3. exportar a la altura especificada (manteniendo la relación de aspecto): inscape in.svg -h 600 -e output.png

Tenga en cuenta que especificar tanto el ancho como la altura no conserva la relación de aspecto.

Para convertir muchos archivos a la vez, ajuste lo siguiente a su caso de uso (en basho compatible):

for f in *.svg; do
  inkscape $f -d 300 -e ${f%.*}.png
done
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.