icons - ¿Receta para crear archivos ICO de Windows con ImageMagick?
(8)
Me gustaría crear el icono .ico
para mi aplicación de Windows dinámicamente (desde el archivo SVG) usando ImageMagick. ¿Cómo puedo hacer eso?
Microsoft enumera varios requisitos de profundidad y tamaño de color 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 + es compatible con el icono de alta resolución de 256x256 incrustado en el mismo .ico
que puede (debería? Debe?) Ser un PNG comprimido. ¿Cómo puedo "unirme" a los íconos de Windows XP y este nuevo ícono de Vista en un solo archivo .ico
?
Aquí está la receta estándar de las Preguntas Frecuentes , modificada para tener todas las resoluciones mencionadas en el enlace msdn (excepto aquellas bajo "Tamaños adicionales ...") (la otra respuesta no tenía 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
Basándose en todas las respuestas anteriores y corrigiendo los siguientes errores:
- No use
-color=256
, ya que necesita versiones en color de 32 bits para todos los tamaños con versiones modernas de Windows (Vista +) - Los tamaños necesarios en Windows son 16, 24 , 32, 48 , 64, 128, 256. La mayoría de los scripts los olvidaron. No estoy seguro de si el 96 es realmente necesario, pero no duele.
- Debe incluir versiones de paleta de 4 y 8 bits para los tamaños 16, 24, 32 y 48 (aparentemente para admitir aplicaciones de Escritorio remoto en particular)
Todo en un solo script bash (comenzando desde logo.svg
y produciendo logo.ico
):
#!/bin/bash
for size in 16 24 32 48 64 96 128 256; do
inkscape -z -e $size.png -w $size -h $size logo.svg >/dev/null 2>/dev/null
done
for size in 16 24 32 48; do
convert -colors 256 +dither $size.png png8:$size-8.png
convert -colors 16 +dither $size-8.png $size-4.png
done
convert 16.png 24.png 32.png 48.png 16-8.png 24-8.png 32-8.png 48-8.png 16-4.png 24-4.png 32-4.png 48-4.png 64.png 96.png 128.png 256.png logo.ico
rm 16.png 24.png 32.png 48.png 16-8.png 24-8.png 32-8.png 48-8.png 16-4.png 24-4.png 32-4.png 48-4.png 64.png 96.png 128.png 256.png
Bash one-liner para convertir logo.svg
en logo.ico
, usando Inkscape para exportar las imágenes png en varios tamaños:
eval convert /
''<(inkscape -e /dev/stderr logo.svg -w ''{16,24,32,48,64,128,256}'' 2>&1 > /dev/null)'' /
logo.ico
Inspirado por la respuesta de Malcolm MacLeod , pero evitando el bucle explícito y los archivos temporales.
El stderr
y la redirección es para evitar que el mensaje de éxito de Inkscape en stdout
("Bitmap guardado como: / dev / stdout") termine en los datos de la imagen.
ImageMagick tiene una receta para esto en su documentación, ver Miniatura de enlace de la página web FavIcon
Esencialmente ejecutas lo 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
Puede modificar esto para incluir resoluciones más grandes según sea necesario y para cambiar elementos como el borde, la configuración de transparencia, etc.
Limpié la solución de Malcolm, solucioné un error y también hice las secuencias de comandos de salida del script para que pueda ejecutar tiff2icns en 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
Modificando la respuesta de hnasarat para usuarios de windows. La forma más sencilla de instalar InkScape e ImageMagick utilizando Chocolatey 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 favicons recomendados 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
No parece que ImageMagick solo pueda hacer esto, ya que no maneja el cambio de tamaño de SVG de forma sana (sino que cambia el tamaño del SVG solo después de la rasterización, lo que produce un resultado horrible)
Sin embargo, al utilizar inkscape para hacer la conversión, parece ser posible, por ejemplo, el siguiente forro debería darle un icono utilizable con todos los tamaños de iconos:
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;
Sin embargo, lo anterior no le dará íconos de 8 y 4 bits dentro del archivo (creo que solo son necesarios para versiones anteriores de Windows que ya no son compatibles). Con un poco más de trabajo, debería ser posible hacerlo si los necesita. .
magick convert in.jpg -define icon:auto-resize=16,48,256 -compress zip out.ico
http://imagemagick.org/script/command-line-options.php#define