icons imagemagick

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. .