2012-07-10 9 views
21

Me gustaría crear el icono .ico para mi aplicación de Windows dinámicamente (desde el archivo SVG) utilizando ImageMagick. ¿Cómo puedo hacer eso?¿Receta para crear archivos Windows ICO con ImageMagick?

Microsoft lists various color depth and size requirements para el icono. ImageMagick tiene las opciones -depth y -colors, pero no estoy seguro de cómo usarlas correctamente en este caso.

Además, parece que Vista+ supports 256x256 hi-res icon incrustado en el mismo .ico que puede (¿debe?) Ser un PNG comprimido. ¿Cómo puedo "unirme" a los iconos de Windows XP y a este nuevo ícono de Vista en un único archivo .ico?

+0

En caso de que se lo pregunte, este es el icono * application * (el que está pegado en el propio .exe). – Linas

Respuesta

26

ImageMagick tiene una receta para esto en su documentación, ver FavIcon Web Page Link Thumbnail

Esencialmente se ejecuta el siguiente:

convert image.png -bordercolor white -border 0 \ 
      \(-clone 0 -resize 16x16 \) \ 
      \(-clone 0 -resize 32x32 \) \ 
      \(-clone 0 -resize 48x48 \) \ 
      \(-clone 0 -resize 64x64 \) \ 
      -delete 0 -alpha off -colors 256 favicon.ico 

Usted puede modificar esto para incluir las resoluciones más grandes como sea necesario y para cambiar cosas como frontera, configuración de transparencia, etc.

+4

De hecho, debería poder omitir '-bordercolor white-border 0' si usa' -alpha remove' en lugar de '-alpha off'. – sschuberth

+1

Excepto que el autor quiere hacer esto con un SVG. Como señalé en mi respuesta al usar este comando en un SVG, se destruirá totalmente la calidad del ícono resultante, ya que imagemagick solo cambia el tamaño del SVG después de rasterizar. –

+0

@MalcolmMacLeod Sí, tiene toda la razón, la conversión directa de SVG con este método da resultados horribles – RobV

9

No parece como ImageMagick el único que puede hacer esto ya que no maneja SVG cambiar el tamaño de una manera sana (pero en vez cambia el tamaño del SVG sólo después de rasterización que produce un resultado horrible)

Mediante el uso de Inkscape que hacer la conversión parece ser posible, por ejemplo, por ejemplo El siguiente revestimiento debe darle un icono se puede usar con todos los tamaños de icono:

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; 

Lo anterior no obstante le dará 8 y 4 iconos de bits dentro del archivo (creo que estos sólo son necesarias para versiones anteriores de Windows que se ya no es compatible) Debería ser posible con un poco más de trabajo hacer que lo haga si lo necesita.

+0

http://stackoverflow.com/a/27886286/2079345 – chiliNUT

3

Aquí está la receta estándar del FAQ, modificada para tener todas las resoluciones mencionadas en el msdn link (excepto las de "Los tamaños adicionales ...") (la otra respuesta no tenían todas las resoluciones deseadas)

convert input.png -bordercolor white -border 0 (-clone 0 -resize 16x16) (-clone 0 -resize 24x24) (-clone 0 -resize 32x32) (-clone 0 -resize 40x40) (-clone 0 -resize 48x48) (-clone 0 -resize 64x64) (-clone 0 -resize 256x256) -delete 0 -alpha off -colors 256 output.ico 
6

Limpié solución de Malcolm, corregido un error, y también hizo los archivos TIFF de salida de secuencia de comandos para que pueda ejecutar en tiff2icns osx.

#! /bin/bash 
# converts the passed-in svgs to tiff and ico 

if [[ $# -eq 0 ]]; then 
    echo "Usage: $0 svg1 [svg2 [...]]" 
    exit 0 
fi 

temp=$(mktemp -d) 
declare -a res=(16 24 32 48 64 128 256 512) 
for f in $*; do 
    mkdir -p $temp/$(dirname $f) 
    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}") 
    for filetype in ico tiff; do 
     convert "${resm[@]}" ${f%%.*}.$filetype 
    done 
done 
rm -rf $temp 
1

Modificación de la respuesta de hnasarat para los usuarios de Windows. La forma más fácil es instalar InkScape e ImageMagick usando Chocolatey y luego ejecutar lo siguiente en un archivo por lotes. (No es tan flexible como las otras respuestas que acaba de pasar en un SVG pero bombea todos los iconos de página que se recomiendan en Favicon Cheat Sheet.

@ECHO off 

IF "%1"=="" (
    ECHO You must provide an svg file 
    EXIT /b 
) 

IF NOT EXIST favicons MD favicons 

SET "sizes=16 24 32 48 57 64 72 96 120 128 144 152 195 228 256 512" 

FOR %%s IN (%sizes%) DO (
    inkscape -z -e favicons/favicon-%%s.png -w %%s -h %%s %1 
) 

convert favicons/favicon-16.png favicons/favicon-24.png favicons/favicon-32.png favicons/favicon-48.png favicons/favicon-64.png favicons/favicon.ico 
6
convert in.jpg -define icon:auto-resize=16,48,256 -compress zip out.ico 

http://imagemagick.org/script/command-line-options.php#define

+1

Agregaría el 32 y el 64 a la lista de tamaños también, entonces creo que esto es perfecto para todos los sistemas operativos Windows : s –

+1

No noté ninguna diferencia con o sin '-compress zip', aunque –

+0

"convert.im6: ancho o alto excede el límite" - se arregló cambiando primero el tamaño de la imagen de entrada para que fuera de 256 × 256 píxeles. Pero las partes transparentes en los pngs originales se volvieron blancas. – Smylers

1

Bash de una sola línea para convertir logo.svg en logo.ico, usando Inkscape para exportar cada una de las imágenes PNG en varios tamaños:

eval convert \ 
    '<(inkscape -e /dev/stderr logo.svg -w '{16,32,64,128,256}' 2>&1 > /dev/null)' \ 
    logo.ico 

Ajustar la lista de tamaños como desées.

Inspirado por Malcolm MacLeod's answer, pero evitando el bucle explícito y los archivos temporales.

El stderr y la redirección evitan el mensaje de éxito de Inkscape en stdout ("Mapa de bits guardado como:/dev/stdout") que termina en los datos de la imagen.

Cuestiones relacionadas