¿"Hornear" una imagen SVG en un PNG a una resolución dada?

20

Estoy en Linux y me gustaría tomar un archivo SVG y convertirlo en un archivo PNG con una resolución dada (escala). ¿Hay alguna manera de hacer esto de manera rápida y efectiva desde la línea de comandos?

Estoy buscando algo como esto:

svg2png --width 128 --height 128 input.svg output.png

¿Hay alguna herramienta para esto?

Naftuli Kay
fuente

Respuestas:

20

Utilice la conversión de ImageMagick :

convert -resize 128x128 input.svg output.png

Si el tamaño del lienzo de entrada es menor que el tamaño dado, esto aumentará la salida sin volver a muestrear. Para obtener un resultado de mayor calidad, agregue el -densityparámetro:

convert -density 500 -resize 128x128 input.svg output.png

ImageMagick trama imágenes vectoriales a su resolución de lienzo a una densidad predeterminada de 72 ppp.
Para aumentar la escala con un muestreo adecuado, puede especificar un valor demasiado alto, como 500 ppp en la muestra anterior.

Usar una densidad de trama demasiado alta puede ser un problema de rendimiento con un lienzo de gran tamaño. La densidad de trama más baja e ideal es: raster_density = raster_size / original_size * original_density

Esta densidad de ráster ideal generará la imagen directamente al tamaño esperado (no es -resizenecesario). Pero como pueden ocurrir aproximaciones de números flotantes, se recomienda un valor ligeramente mayor y un cambio de tamaño para obtener un resultado perfecto en píxeles.

Puede obtener el tamaño y la densidad originales con los escapes porcentuales de ImageMagick :

 convert input.svg -format "%w %h %[resolution.x] %[resolution.y]" info:

Tenga en cuenta que ImageMagick no maneja las especificaciones completas de SVG. Si tiene problemas con las formas representadas incorrectamente, mire este hilo sobre cómo seleccionar el renderizador SVG de ImageMagick .

Mihai Rotaru
fuente
Genial gracias. Descubrí rsvgla respuesta a continuación por mi cuenta, pero es hora de que empiece a usar ImageMagick.
Naftuli Kay
1
No funcionó para mi imagen svg. Al principio recibí convert: unable to read font (nulo) '@ error / annotate.c / RenderFreetype / 1153.` errores que resolví brew install gs, pero incluso cuando la conversión se ejecutó limpiamente, la imagen resultante es basura.
Lloyd Dewolf
@LloydDewolf, puedes intentar limpiar el svg primero.
Mihai Rotaru
Tuve que agregar -background transparent, de lo contrario convertir utiliza fondo blanco.
hgoebl
(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 usar Inkscape directamente con: inkscape in.svg --export-png=out.png(ejemplo de superuser.com/a/493028/316154 )
northern-bradley
9

Ambos rsvgy inkscapepueden:

$ rsvg
Usage: rsvg [OPTIONS...] file.svg file.png
  -d, --dpi-x=<float>          pixels per inch
  -p, --dpi-y=<float>          pixels per inch
  -x, --x-zoom=<float>         x zoom factor
  -y, --y-zoom=<float>         y zoom factor
  -w, --width=<int>            width
  -h, --height=<int>           height
  -q, --quality=<int>          JPEG quality
  -f, --format=[png, jpeg]     save format
  -v, --version                show version information

Help options:
  -?, --help                   Show this help message
  --usage                      Display brief usage message

Y:

$ inkscape --help
Usage: inkscape [OPTIONS...] [FILE...]

Available options:
  -V, --version                             Print the Inkscape version number
  -z, --without-gui                         Do not use X server (only process
                                            files from console)
  -g, --with-gui                            Try to use X server (even if
                                            $DISPLAY is not set)
  -f, --file=FILENAME                       Open specified document(s) (option
                                            string may be excluded)
  -p, --print=FILENAME                      Print document(s) to specified
                                            output file (use '| program' for
                                            pipe)
  -e, --export-png=FILENAME                 Export document to a PNG file
  -d, --export-dpi=DPI                      The resolution used for exporting
                                            SVG into bitmap (default 90)
  -a, --export-area=x0:y0:x1:y1             Exported area in SVG user units
                                            (default is the canvas; 0,0 is
                                            lower-left corner)
  -D, --export-area-drawing                 Exported area is the entire
                                            drawing (not canvas)
  -C, --export-area-canvas                  Exported area is the entire canvas
      --export-area-snap                    Snap the bitmap export area
                                            outwards to the nearest integer
                                            values (in SVG user units)
  -w, --export-width=WIDTH                  The width of exported bitmap in
                                            pixels (overrides export-dpi)
  -h, --export-height=HEIGHT                The height of exported bitmap in
                                            pixels (overrides export-dpi)
  -i, --export-id=ID                        The ID of the object to export
  -j, --export-id-only                      Export just the object with
                                            export-id, hide all others (only
                                            with export-id)
  -t, --export-use-hints                    Use stored filename and DPI hints
                                            when exporting (only with
                                            export-id)
  -b, --export-background=COLOR             Background color of exported
                                            bitmap (any SVG-supported color
                                            string)
  -y, --export-background-opacity=VALUE     Background opacity of exported
                                            bitmap (either 0.0 to 1.0, or 1 to
                                            255)
  -l, --export-plain-svg=FILENAME           Export document to plain SVG file
                                            (no sodipodi or inkscape
                                            namespaces)
  -P, --export-ps=FILENAME                  Export document to a PS file
  -E, --export-eps=FILENAME                 Export document to an EPS file
  -A, --export-pdf=FILENAME                 Export document to a PDF file
  -T, --export-text-to-path                 Convert text object to paths on
                                            export (EPS)
  -F, --export-embed-fonts                  Embed fonts on export (Type 1
                                            only) (EPS)
  -B, --export-bbox-page                    Export files with the bounding box
                                            set to the page size (EPS)
  -X, --query-x                             Query the X coordinate of the
                                            drawing or, if specified, of the
                                            object with --query-id
  -Y, --query-y                             Query the Y coordinate of the
                                            drawing or, if specified, of the
                                            object with --query-id
  -W, --query-width                         Query the width of the drawing or,
                                            if specified, of the object with
                                            --query-id
  -H, --query-height                        Query the height of the drawing
                                            or, if specified, of the object
                                            with --query-id
  -S, --query-all                           List id,x,y,w,h for all objects
  -I, --query-id=ID                         The ID of the object whose
                                            dimensions are queried
  -x, --extension-directory                 Print out the extension directory
                                            and exit
      --vacuum-defs                         Remove unused definitions from the
                                            defs section(s) of the document
      --verb-list                           List the IDs of all the verbs in
                                            Inkscape
      --verb=VERB-ID                        Verb to call when Inkscape opens.
      --select=OBJECT-ID                    Object ID to select when Inkscape
                                            opens.

Help options:
  -?, --help                                Show this help message
      --usage                               Display brief usage message
Dan D.
fuente
Estaba teniendo un sinfín de problemas con Imagemagick. No tenía idea de que podía usar rsvg directamente (el binario se llamaba rsvg-convert en mi caso en Mac Homebrew) y esto está funcionando fantásticamente. Gracias.
tembloroso
El uso de inkscape evitó un problema que tenía con imagemagick: la conversión SVG -> PNG usando imagemagick recortó el cuadro delimitador invisible para la imagen (utilizado para preservar el centrado y las dimensiones relativas) pero inkscape funcionó bien. ¡Muchas gracias!
cutculus