2012-07-10 15 views
21

Mi piacerebbe creare l'icona .ico per la mia applicazione Windows in modo dinamico (dal file SVG) usando ImageMagick. Come lo faccio?Ricetta per la creazione di file Windows ICO con ImageMagick?

Microsoft lists various color depth and size requirements per l'icona. ImageMagick ha le opzioni -depth e -colors, ma non sono sicuro di come utilizzarle correttamente in questo caso.

Additionaly, sembra Vista+ supports 256x256 hi-res icon incorporato nello stesso .ico che può (dovrebbe? Dovere?) Essere un PNG compresso. Come faccio a "unire" le icone di Windows XP e questa nuova icona di Vista in un singolo file .ico?

+0

Nel caso ve lo stiate chiedendo, questa è l'icona * application * (quella appiccicata sul file .exe stesso). – Linas

risposta

26

ImageMagick ha una ricetta per questo nella loro documentazione, vedere FavIcon Web Page Link Thumbnail

In sostanza si esegue il seguente:

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 

È possibile modificare questo per includere risoluzioni più grandi, se necessario, e di cambiare le cose come confine, impostazioni di trasparenza ecc.

+4

In effetti dovresti essere in grado di omettere '-bordercolor white -border 0' se usi' -alpha remove' invece di '-alpha off'. – sschuberth

+1

Tranne che l'autore vuole farlo con un SVG. Come indicato nella mia risposta, l'uso di questo comando su un SVG distruggerà totalmente la qualità dell'icona risultante poiché imagemagick ridimensiona solo l'SVG dopo la rasterizzazione. –

+0

@MalcolmMacLeod Sì, hai perfettamente ragione, la conversione diretta da SVG con questo metodo offre risultati terribili – RobV

9

Non sembra come ImageMagick sola può fare questo in quanto non gestisce il ridimensionamento SVG in un modo sano di mente (ma invece ridimensiona l'SVG solo dopo la rasterizzazione, che produce un risultato orribile)

Utilizzando Inkscape per fare la conversione sembra essere possibile, ad es L'uno di linea seguente dovrebbe darvi un'icona utilizzabile con tutte le dimensioni delle icone:

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; 

È possibile che questo non sarà tuttavia darvi 8 e 4 bit icone all'interno del file (Penso che questi sono necessari solo per le vecchie versioni di Windows che sono non più supportato) Dovrebbe essere possibile con un po 'di lavoro in più per averlo fatto se necessario.

+0

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

3

Ecco la ricetta standard da FAQ, modificata per avere tutte le risoluzioni menzionate nello msdn link (eccetto quelle sotto "I formati supplementari ...") (l'altra risposta non avevano tutte le risoluzioni desiderati)

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

Ho ripulito la soluzione di Malcolm, corretto un bug, e anche fatto il TIFF output dello script in modo da poter eseguire in 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

Modifica della risposta di hnasarat per utenti Windows. Il modo più semplice per installare InkScape e ImageMagick utilizzando Chocolatey e quindi eseguire quanto segue in un file batch. (Non è flessibile come le altre risposte che basta passare in uno svg ma che le pompe tutte le favicon raccomandati nel 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

Vorrei aggiungere anche il 32 e 64 alla lista delle dimensioni - quindi penso che sia perfetto per tutti i sistemi operativi Windows : s –

+1

Non ho notato alcuna differenza con o senza '-compress zip', anche se –

+0

"convert.im6: larghezza o altezza supera il limite" - risolto prima ridimensionando l'immagine in ingresso a 256 × 256 pixel. Ma le parti trasparenti nei png originali sono diventate bianche. – Smylers

1

Bash one-liner per convertire logo.svg in logo.ico, utilizzando Inkscape per esportare ciascuna delle immagini PNG in diverse dimensioni:

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

Regolare l'elenco dei formati come vuoi.

Ispirato da Malcolm MacLeod's answer, ma evitando il ciclo esplicito e i file temporanei.

Il stderr e il reindirizzamento è per evitare il messaggio di successo di Inkscape su stdout ("Bitmap salvato come:/dev/stdout") che termina nei dati dell'immagine.

Problemi correlati