2012-07-10 14 views
21

Chciałbym stworzyć ikonę .ico dla mojej aplikacji Windows dynamicznie (z pliku SVG) za pomocą ImageMagick. Jak mogę to zrobić?Przepis na tworzenie plików Windows ICO za pomocą ImageMagick?

Microsoft lists various color depth and size requirements za ikonę. ImageMagick ma opcje -depth i -colors, ale nie jestem pewien, jak z nich korzystać w tym przypadku.

Dodatkowo, wygląda na to, że Vista+ supports 256x256 hi-res icon jest osadzony w tym samym .ico, który może (powinien? Musi?) Być skompresowanym plikiem PNG. Jak "dołączyć" ikony Windows XP i tę nową ikonę Vista do pojedynczego pliku .ico?

+0

Jeśli zastanawiasz się, to jest ikona * aplikacji * (naklejona na samym pliku .exe). – Linas

Odpowiedz

26

ImageMagick ma przepis na to w ich dokumentacji, patrz FavIcon Web Page Link Thumbnail

Zasadniczo uruchomić następujące:

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 

można zmodyfikować tak, aby zawierały większe uchwał konieczna i zmienić rzeczy jak granicy, ustawienia przezroczystości itp.

+4

W rzeczywistości powinieneś być w stanie pominąć '-bordercolor white -border 0', jeśli użyjesz' -alpha remove' zamiast '-alfa off'. – sschuberth

+1

Z wyjątkiem tego, że autor chce to zrobić z SVG. Jak wskazano w mojej odpowiedzi, użycie tego polecenia w SVG całkowicie zniszczy jakość wyświetlanej ikony, ponieważ imagemagick zmienia wielkość SVG po rasteryzacji. –

+0

@MalcolmMacLeod Tak, masz rację, konwersja bezpośrednio z SVG przy użyciu tej metody daje straszne wyniki – RobV

9

To nie wydaje się ImageMagick sam może to zrobić, ponieważ nie obsługuje SVG zmiany rozmiaru w rozsądny sposób (lecz zmienia rozmiar SVG dopiero po Rasteryzacja która daje wynik koszmarny)

Korzystając Inkscape zrobić Konwersja wydaje się możliwa, np Poniższy jeden liner powinien dać użyteczną ikonę ze wszystkich rozmiarów ikon:

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; 

Powyższe nie będzie jednak daje 8 i 4-bitowe ikony w pliku (myślę, że są one potrzebne tylko dla starszych wersjach systemu Windows, które są nie jest już obsługiwany) Powinno być możliwe, aby trochę więcej pracy wymagało wykonania tych czynności, jeśli ich potrzebujesz.

+0

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

3

Oto standardowy przepis z FAQ, zmodyfikowany tak, aby wszystkie rozdzielczości wymienione w msdn link (z wyjątkiem tych pod „Dodatkowe rozmiary ...”) (druga odpowiedź nie miała wszystkie uchwały pożądane)

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

ja oczyścić rozwiązanie Malcolma, naprawiono błąd, a także dokonał TIFF wyjściowe skrypt, dzięki czemu można uruchomić w 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

Modyfikowanie odpowiedzi hnasarat dla użytkowników systemu Windows. Najprostszym sposobem jest zainstalowanie InkScape i ImageMagick przy użyciu Chocolatey, a następnie uruchomienie następujących w pliku wsadowym. (To nie jest tak elastyczny, jak innych odpowiedzi po prostu przekazać w jednym SVG ale Pompy wszystkie favikony zalecanych w 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

Dodałbym 32 i 64 do listy rozmiarów - wtedy myślę, że to jest idealne dla wszystkich systemów operacyjnych Windows : s –

+1

Nie zauważyłem żadnej różnicy z lub bez '-compress zip', ale –

+0

"convert.im6: szerokość lub wysokość przekracza limit" - ustalone przez pierwszą zmianę rozmiaru obrazu wejściowego na 256 × 256 pikseli. Ale przezroczyste części w oryginalnych pngs zmieniły kolor na biały. – Smylers

1

Bash jedna wkładka do konwersji logo.svg do logo.ico za pomocą Inkscape wyeksportować każdy z obrazów png w różnych rozmiarach:

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

Dostosuj listę rozmiarów jak sobie życzysz.

Zainspirowany przez Malcolm MacLeod's answer, ale unikając jawnej pętli i plików tymczasowych.

Po przekierowaniu w celu uniknięcia powodzenia komunikatu Inkscape na stdout ("Mapa bitowa zapisana jako:/dev/stdout") kończy się na danych obrazu.

Powiązane problemy