如何透過 ImageMigick 命令製作網站圖標
當我們透過瀏覽器開啟網頁,在瀏覽器頁籤出現的小圖示就是「網站圖標」又稱為網站 Icon,今天的教學首先要先安裝 ImageMagick Library Tools,安裝完成以後會有 convert CLI 可以使用。由於目前標準的網站圖標需要很多種不同的格式,所以需要一系列的轉換工作。接下來準備好要製作圖標的透背 PNG 檔案,然後執行以下命令 ($SOURCE_PATH 請替換你的 PNG 圖片來源檔路徑)。
convert '$SOURCE_PATH/favicon.png' -background transparent -define icon:auto-resize=16,24,32,48,64,72,96,128,256 'favicon/favicon.ico' convert '$SOURCE_PATH/favicon.png' -resize 16x16 -gravity center -extent 16x16 'favicon/favicon-16x16.png' convert '$SOURCE_PATH/favicon.png' -resize 32x32 -gravity center -extent 32x32 'favicon/favicon-32x32.png' convert '$SOURCE_PATH/favicon.png' -resize 96x96 -gravity center -extent 96x96 'favicon/favicon-96x96.png' convert '$SOURCE_PATH/favicon.png' -resize 70x70 -gravity center -extent 70x70 'favicon/mstile-70x70.png' convert '$SOURCE_PATH/favicon.png' -resize 144x144 -gravity center -extent 144x144 'favicon/mstile-144x144.png' convert '$SOURCE_PATH/favicon.png' -resize 150x150 -gravity center -extent 150x150 'favicon/mstile-150x150.png' convert '$SOURCE_PATH/favicon.png' -resize 310x310 -gravity center -extent 310x310 'favicon/mstile-310x310.png' convert '$SOURCE_PATH/favicon.png' -resize 310x150 -gravity center -extent 310x150 'favicon/mstile-310x150.png' convert '$SOURCE_PATH/favicon.png' -resize 36x36 -gravity center -extent 36x36 'favicon/android-chrome-36x36.png' convert '$SOURCE_PATH/favicon.png' -resize 48x48 -gravity center -extent 48x48 'favicon/android-chrome-48x48.png' convert '$SOURCE_PATH/favicon.png' -resize 72x72 -gravity center -extent 72x72 'favicon/android-chrome-72x72.png' convert '$SOURCE_PATH/favicon.png' -resize 96x96 -gravity center -extent 96x96 'favicon/android-chrome-96x96.png' convert '$SOURCE_PATH/favicon.png' -resize 144x144 -gravity center -extent 144x144 'favicon/android-chrome-144x144.png' convert '$SOURCE_PATH/favicon.png' -resize 192x192 -gravity center -extent 192x192 'favicon/android-chrome-192x192.png' convert '$SOURCE_PATH/favicon.png' -resize 57x57 -gravity center -extent 57x57 'favicon/apple-touch-icon-57x57.png' convert '$SOURCE_PATH/favicon.png' -resize 60x60 -gravity center -extent 60x60 'favicon/apple-touch-icon-60x60.png' convert '$SOURCE_PATH/favicon.png' -resize 72x72 -gravity center -extent 72x72 'favicon/apple-touch-icon-72x72.png' convert '$SOURCE_PATH/favicon.png' -resize 76x76 -gravity center -extent 76x76 'favicon/apple-touch-icon-76x76.png' convert '$SOURCE_PATH/favicon.png' -resize 114x114 -gravity center -extent 114x114 'favicon/apple-touch-icon-114x114.png' convert '$SOURCE_PATH/favicon.png' -resize 120x120 -gravity center -extent 120x120 'favicon/apple-touch-icon-120x120.png' convert '$SOURCE_PATH/favicon.png' -resize 152x152 -gravity center -extent 152x152 'favicon/apple-touch-icon-152x152.png' convert '$SOURCE_PATH/favicon.png' -resize 180x180 -gravity center -extent 180x180 'favicon/apple-touch-icon-180x180.png'
除了透過上述命令產生各裝置需要的 Icon 格式以外,Android 系統還需要一支 manifest.json 檔案,檔案內容如下:
{ "name": "app", "icons": [ { "src": "\/android-chrome-36x36.png", "sizes": "36x36", "type": "image\/png", "density": 0.75 }, { "src": "\/android-chrome-48x48.png", "sizes": "48x48", "type": "image\/png", "density": 1 }, { "src": "\/android-chrome-72x72.png", "sizes": "72x72", "type": "image\/png", "density": 1.5 }, { "src": "\/android-chrome-96x96.png", "sizes": "96x96", "type": "image\/png", "density": 2 }, { "src": "\/android-chrome-144x144.png", "sizes": "144x144", "type": "image\/png", "density": 3 }, { "src": "\/android-chrome-192x192.png", "sizes": "192x192", "type": "image\/png", "density": 4 } ] }
完成以後把整個 favicon 放到你的網站 Document Root 目錄下,然後在首頁的網頁中 <HEAD> 標記中加入以下內容
<!-- Favicon --> <link rel="apple-touch-icon" sizes="57x57" href="/favicon/apple-touch-icon-57x57.png"> <link rel="apple-touch-icon" sizes="60x60" href="/favicon/apple-touch-icon-60x60.png"> <link rel="apple-touch-icon" sizes="72x72" href="/favicon/apple-touch-icon-72x72.png"> <link rel="apple-touch-icon" sizes="76x76" href="/favicon/apple-touch-icon-76x76.png"> <link rel="apple-touch-icon" sizes="114x114" href="/favicon/apple-touch-icon-114x114.png"> <link rel="apple-touch-icon" sizes="120x120" href="/favicon/apple-touch-icon-120x120.png"> <link rel="apple-touch-icon" sizes="144x144" href="/favicon/android-chrome-144x144.png"> <link rel="apple-touch-icon" sizes="152x152" href="/favicon/apple-touch-icon-152x152.png"> <link rel="apple-touch-icon" sizes="180x180" href="/favicon/apple-touch-icon-180x180.png"> <link rel="icon" type="image/png" href="/favicon/android-chrome-192x192.png" sizes="192x192"> <link rel="icon" type="image/png" href="/favicon/favicon-32x32.png" sizes="32x32"> <link rel="icon" type="image/png" href="/favicon/favicon-96x96.png" sizes="96x96"> <link rel="icon" type="image/png" href="/favicon/favicon-16x16.png" sizes="16x16"> <link rel="manifest" href="/favicon/manifest.json">
到這裡就算完成了,如果重新整理瀏覽器就可以順利看到圖標正確顯示在視窗中。
最後附上透過 PHP 產生網站圖標的程式碼,如果需要實做 SaaS 服務的人或許用的上:
<?php $binFilePath = 'convert'; $sourcePNGFile = 'favicon.png'; $faviconDir = '/var/www/html/favicon'; $command = sprintf( '%s \'%s\' -background transparent -define icon:auto-resize=16,24,32,48,64,72,96,128,256 \'%s/favicon.ico\'', $binFilePath, $sourcePNGFile . '/favicon.png', $faviconDir ); exec($command); // 正方形 $allPngFiles = [ 'favicon-16x16', 'favicon-32x32', 'favicon-96x96', 'mstile-70x70', 'mstile-144x144', 'mstile-150x150', 'mstile-310x310', 'mstile-310x150', 'android-chrome-36x36', 'android-chrome-48x48', 'android-chrome-72x72', 'android-chrome-96x96', 'android-chrome-144x144', 'android-chrome-192x192', 'apple-touch-icon-57x57', 'apple-touch-icon-60x60', 'apple-touch-icon-72x72', 'apple-touch-icon-76x76', 'apple-touch-icon-114x114', 'apple-touch-icon-120x120', 'apple-touch-icon-152x152', 'apple-touch-icon-180x180', ]; foreach ($allPngFiles as $filename) { if (preg_match('/.+?(\d+x\d+)/', $filename, $match)) { $command = sprintf( '%s \'%s\' -background transparent -resize %s -gravity center -extent %s \'%s/%s.png\'', $binFilePath, $sourcePNGFile, $match[1], $match[1], $faviconDir, $filename ); exec($command); } } ?>
Good Luck...