Подтвердить что ты не робот

Рецепт создания файлов ICO Windows с помощью ImageMagick?

Я хочу создать значок .ico для моего приложения Windows динамически (из файла SVG) с помощью ImageMagick. Как это сделать?

Microsoft перечисляет различные значения глубины и размера цвета для значка. ImageMagick имеет -depth и -colors параметры, но я не уверен, как правильно их использовать в этом случае.

Дополнительно, похоже, Vista + поддерживает значок приветствия 256x256, встроенный в тот же самый .ico, который может (должен? должен?) быть сжатым PNG. Как "присоединиться" к значкам Windows XP и новому значку Vista в один файл .ico?

4b9b3361

Ответ 1

ImageMagick имеет рецепт для этого в своей документации, см. Значок веб-страницы FavIcon

По существу вы запускаете следующее:

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

Вы можете изменить это, чтобы при необходимости включать большие разрешения и изменять такие параметры, как границы, параметры прозрачности и т.д.

Ответ 2

Не похоже, что только ImageMagick может это сделать, поскольку он не обрабатывает SVG-изменение разумным образом (но вместо этого изменяет размер SVG только после растеризации, которая вызывает ужасный результат)

Используя inkscape для выполнения преобразования, возможно, это возможно, например, Следующий один вкладыш должен предоставить вам полезный значок со всеми размерами значков:

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;

Вышеупомянутое не даст вам 8 и 4-разрядных значков в файле (я думаю, что они нужны только для более старых версий Windows, которые больше не поддерживаются) Это должно быть возможно с немного большей работой, чтобы сделать это, если они вам понадобятся.

Ответ 3

Я очистил решение Malcolm, исправил ошибку, а также сделал выходные данные script, чтобы вы могли запускать 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

Ответ 5

Здесь стандартный рецепт FAQ, измененный, чтобы иметь все разрешения, упомянутые в msdn link (кроме тех, что указаны в разделе "Дополнительные размеры..." ) (в другом ответе не было всех желаемых разрешений)

 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

Bash one-liner для преобразования logo.svg в logo.ico, используя Inkscape для экспорта изображений PNG различных размеров:

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

Вдохновлен ответом Малкольма МакЛауда, но избегает явного цикла и временных файлов.

stderr и перенаправление должны предотвращать попадание сообщения об успехе Inkscape на стандартный stdout ("Bitmap сохранен как: /dev/stdout"), попадающего в данные изображения.

Ответ 7

Опираясь на все предыдущие ответы и исправляя следующие ошибки:

  • Не используйте -color=256, так как вам нужны 32-битные цветные версии для всех размеров с современными версиями Windows (Vista+)
  • Необходимые размеры в Windows - 16, 24, 32, 48, 64, 128, 256. Большинство сценариев забыли их. Я не уверен, действительно ли нужен 96, но это не больно.
  • Вам необходимо включить 4-битную и 8-битную версии палитры для размеров 16, 24, 32 и 48 (очевидно, для поддержки приложений удаленного рабочего стола в частности)

Все в одном скрипте bash (начиная с logo.svg и производя 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 

Ответ 8

Изменение ответа hnasarat для пользователей Windows. Самый простой способ - установить InkScape и ImageMagick с помощью Chocolatey, а затем запустить в пакетном файле следующее. (Это не так гибко, как другие ответы, которые вы просто передаете в одном svg, но он выкачивает все значки, рекомендованные в 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

Ответ 9

Чтобы создать файл ICO из SVG с сохранением соотношения сторон:

  1. ищите пропорции SVG (например, 1920x1080)
  2. для значка шириной не более 256 пикселей выполните пропорцию: [1920: 1080 = 256: x] → x = (1080 * 256)/1920 = 144
  3. наконец, используйте команду ImageMagick convert:

    конвертировать -background нет -resize 256x144 -gravity центр -extent 256x144 image.svg image.ico