จะสร้างไฟล์ icns ด้วยตนเองโดยใช้ iconutil ได้อย่างไร?


106

เมื่อฉันตรวจสอบความถูกต้องของแอปฉันได้รับข้อผิดพลาดนี้:

แอปพลิเคชันบันเดิลไม่มีไอคอนในรูปแบบ ICNS ซึ่งมีทั้ง a 512x512และ512x512@2xรูปภาพ

ฉันใช้เพื่อสร้างไอคอน icns ด้วยแอพImg2icnsและจนถึงวันนี้มันก็ทำงานอย่างถูกต้องเสมอ แต่ตอนนี้ฉันได้รับข้อผิดพลาดนั้นและไม่มีวิธีใดที่จะทำให้มันใช้งานได้ ฉันพยายามรวมไฟล์ PNG สองไฟล์เข้าด้วยกัน ( 512x512และ1024x1024) ในImg2icnsแต่ฉันมักจะได้รับข้อผิดพลาดนั้น ฉันพยายามทำตามคำแนะนำใน OS X Human Interface Guideline ของ Apple ด้วย แต่เมื่อฉันพยายามสร้างชุดไอคอนฉันได้รับข้อผิดพลาดของเทอร์มินัลนี้:

-bash: ข้อผิดพลาดทางไวยากรณ์ใกล้กับโทเค็นที่ไม่คาดคิด 'newline'

ฉันไม่ค่อยถนัดกับคำสั่งเทอร์มินัลดังนั้นฉันอาจทำอะไรผิดพลาด ฉันเขียน:

iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>

หากใครสามารถช่วยได้จะขอบคุณมาก ขอบคุณ Massy


ฉันสร้างแอปที่รวม iconutil เพื่อให้ง่ายขึ้น: hobbyistsoftware.com/icontool
Confused Vorlon

คำตอบ:


63

ตรวจสอบคำแนะนำต่อไปนี้ ( ลิงค์ ):

ใช้ iconutil เพื่อสร้างไฟล์ icns ด้วยตนเอง

iconutilเครื่องมือบรรทัดคำสั่งแปลงiconsetโฟลเดอร์ที่จะใช้งานพร้อมความละเอียดสูงไฟล์ว่ายน้ำ (คุณสามารถค้นหาเอกสารทั้งหมดสำหรับเครื่องมือนี้ได้โดยป้อนman iconutilใน Terminal) การใช้เครื่องมือนี้จะบีบอัดicnsไฟล์ที่ได้ด้วยดังนั้นคุณจึงไม่จำเป็นต้องทำการบีบอัดเพิ่มเติม

ในการแปลงชุดไอคอนเป็นไฟล์ icns

ป้อนคำสั่งนี้ในหน้าต่าง Terminal:

iconutil -c icns <iconset filename>

ที่เป็นเส้นทางไปยังโฟลเดอร์ที่มีชุดของไอคอนที่คุณต้องการแปลง<iconset filename> icnsเอาต์พุตถูกเขียนไปยังตำแหน่งเดียวกับที่iconset fileเว้นแต่คุณจะระบุไฟล์เอาต์พุตดังที่แสดง:

iconutil -c icns -o <icon filename> <iconset filename>

กล่าวอีกนัยหนึ่งคุณต้องแทนที่<iconset filename>ด้วยเส้นทาง:

/Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset

เนื่องจากเส้นทางมีช่องว่างคุณจึงต้องใช้เครื่องหมายคำพูดคู่ตัวอย่างเช่น:

iconutil -c icns "/Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset"

คำสั่งนี้ควรทำงานได้อย่างถูกต้อง


2
คุณอาจไม่จำเป็นต้องใช้iconutilแม้ว่า คุณสามารถเพิ่มชุดไอคอนลงในโปรเจ็กต์ของคุณและปล่อยให้ Xcode แปลงให้คุณเป็นส่วนหนึ่งของงานสร้าง ซึ่งกล่าวถึงในส่วนก่อนหน้า (สั้นมาก) ทันที: developer.apple.com/library/mac/documentation/GraphicsAnimation/…
Peter Hosey

@Anne: ยกเว้นคำสั่ง iconutil จะรวมอยู่ใน OS เวอร์ชันที่ไม่ใช้ไฟล์ ICNS เท่านั้น ... ไม่มีความรักสำหรับพวกเราที่ใช้ OS10.6.8 V1.1 ... มันแย่ยิ่งกว่า 'ทางของเราหรือทางหลวง' สำหรับผู้พัฒนามากกว่าผู้ใช้
Henrik Erlandsson

@ แอน: ได้ผล ... ขอบคุณมาก! (ขอบคุณที่ตั้งคำถามอย่างถูกต้อง) Peace, Massy
Blue

@HenrikErlandsson: Mac OS X ทุกเวอร์ชันใช้ไฟล์. icns ย้อนไปจนถึง 10.0
Peter Hosey

10
ไฟล์ต่อไปนี้ควรมีอยู่: icon_16x16.png, icon_16x16@2x.png, icon_32x32.png, icon_32x32@2x.png, icon_128x128.png, icon_128x128@2x.png, icon_256x256.png, icon_256x256@2x.png ไฟล์ @ 2x ควรจัดเก็บที่ 144 พิกเซลต่อนิ้วในขณะที่ไฟล์อื่น ๆ ควรเก็บไว้ที่ 72 พิกเซลต่อนิ้ว
carmin

284

นี่คือสคริปต์สำหรับแปลง 1024x1024 png (ชื่อ "Icon1024.png") เป็นไฟล์ icns ที่จำเป็น บันทึกลงในไฟล์ชื่อ "CreateICNS.src" ในโฟลเดอร์ที่ไฟล์ png ของคุณอยู่ในเทอร์มินัล "cd" ไปยังโฟลเดอร์เดียวกันแล้วพิมพ์ "source CreateICNS.src" เพื่อเรียกมันว่า:

mkdir MyIcon.iconset
sips -z 16 16     Icon1024.png --out MyIcon.iconset/icon_16x16.png
sips -z 32 32     Icon1024.png --out MyIcon.iconset/icon_16x16@2x.png
sips -z 32 32     Icon1024.png --out MyIcon.iconset/icon_32x32.png
sips -z 64 64     Icon1024.png --out MyIcon.iconset/icon_32x32@2x.png
sips -z 128 128   Icon1024.png --out MyIcon.iconset/icon_128x128.png
sips -z 256 256   Icon1024.png --out MyIcon.iconset/icon_128x128@2x.png
sips -z 256 256   Icon1024.png --out MyIcon.iconset/icon_256x256.png
sips -z 512 512   Icon1024.png --out MyIcon.iconset/icon_256x256@2x.png
sips -z 512 512   Icon1024.png --out MyIcon.iconset/icon_512x512.png
cp Icon1024.png MyIcon.iconset/icon_512x512@2x.png
iconutil -c icns MyIcon.iconset
rm -R MyIcon.iconset

3
สุดยอด. ฉันใส่ Icon1024.png บนเดสก์ท็อปและเพียงแค่เรียกใช้รหัสของคุณและมันก็ทำทั้งหมด
Logic

2
เป็นไปได้ไหมที่สคริปต์เล็ก ๆ น้อย ๆ ที่สมบูรณ์แบบนี้ถูกทำลายใน El Capitan? อัปเกรด Mac ของฉันเป็น 10.11.3 แล้วตอนนี้สคริปต์นี้จะคืนค่า "error: Unsuported image format" แล้ว "/Users/IconScript/MyIcon-osx.iconset:error: ตัวแปรที่ชื่อ" icon "ไม่มีทรัพยากรรูปภาพ" แล้ว "MyIcon-osx.iconset: error: ล้มเหลวในการสร้าง ICNS" ลองใช้สคริปต์และไฟล์. png เดียวกันบน Mac ที่ไม่ได้อัปเดตเป็น El Capitan และใช้งานได้เช่นเคย ... = (
RanLearns

1
ใช่ @Henry ฉันเพิ่งลบชื่อโฟลเดอร์เพื่อพยายามทำให้ความคิดเห็นสะอาดขึ้นฉันกำลังเรียกใช้ใน Terminal จากภายในโฟลเดอร์ที่มีสคริปต์และไอคอน src สิ่งเดียวที่แตกต่างจากเมื่อก่อนคือ El Capitan vs Yosemite ... ฉันใช้สคริปต์อย่างแท้จริงก่อนที่จะอัปเดตระบบปฏิบัติการด้วยความสำเร็จจากนั้นทันทีหลังจากอัปเดต (ในโฟลเดอร์เดียวกันคำสั่ง Terminal เดียวกัน) และตอนนี้ส่งกลับข้อผิดพลาดนั้น คุณประสบความสำเร็จกับ El Capitan หรือไม่?
RanLearns

3
สิ่งสำคัญที่ควรทราบ:ชื่อไฟล์รูปภาพไอคอนของคุณต้องขึ้นต้นด้วย "icon_" รูปภาพต้องมีช่องอัลฟา คุณสามารถเพิ่มช่องอัลฟากับ ImageMagick convert abc.png -define png:color-type=6 abc_with_alpha.pngถ้าจำเป็น
David Grayson

1
พระเจ้าช่วย. การสร้างแอปอิเล็กตรอนและจัดการกับไอคอนเป็นเรื่องที่น่าปวดหัว บทเรียนบล็อกทั้งหมดชี้ให้เห็นถึงยูทิลิตี้ออนไลน์ที่ล้าสมัย สคริปต์ง่ายๆของคุณที่นี่ใน stackerflow ทำให้วันของฉัน ขอบคุณ!
nelsonenzo

26

ในขณะที่การใช้สคริปต์ทุกชนิดเพื่อแปลงPNGภาพความละเอียดสูงเป็นสำเนาของสำเนาความละเอียดต่ำที่แตกต่างกันอาจดูมีประโยชน์ (และก็เป็นเช่นนั้นจริงๆ) แต่อย่าลืมว่าการปรับขนาดอัตโนมัติประเภทนี้จะทำให้ได้ภาพที่ไม่สมบูรณ์อย่างเห็นได้ชัด

ความละเอียดน้อยลง - ทำให้ไอคอนเบลอ!

ฉันหมายความว่าฉันก็รักimagemagickเช่นกัน แต่มันไม่ใช่เครื่องมือที่เหมาะสมสำหรับงานนี้!

แต่คุณควรขอโลโก้ในรูปแบบเวกเตอร์จากนักออกแบบของคุณเสมอเช่นในSVG. ด้วยสิ่งนี้คุณสามารถเตรียมPNGไฟล์ที่สมบูรณ์แบบด้วยตนเองในความละเอียดที่ต้องการทั้งหมดจากนั้นสร้าง.icnsไฟล์เดียวซึ่งจะทำให้ไอคอนแอพของคุณดูสวยงามในทุกหน้าจอตั้งแต่ iPhone SE ราคาถูกไปจนถึงจอภาพ Retina ระดับไฮเอนด์รุ่นล่าสุด iMac คุณสามารถใช้ Photoshop, GIMP หรือเครื่องมืออื่น ๆ ที่คุณเลือกเพื่อสร้าง PNG เหล่านี้

จากแนวทางการเชื่อมต่อมนุษย์ล่าสุดของAppleในปี 2020 คุณควรเตรียมPNGไฟล์ต่อไปนี้:

+---------------------+--------------------+--------------+
|      filename       | resolution, pixels | density, PPI |
+---------------------+--------------------+--------------+
| icon_16x16.png      | 16x16              |           72 |
| icon_16x16@2x.png   | 32x32              |          144 |
| icon_32x32.png      | 32x32              |           72 |
| icon_32x32@2x.png   | 64x64              |          144 |
| icon_128x128.png    | 128x128            |           72 |
| icon_128x128@2x.png | 256x256            |          144 |
| icon_256x256.png    | 256x256            |           72 |
| icon_256x256@2x.png | 512x512            |          144 |
| icon_512x512.png    | 512x512            |           72 |
| icon_512x512@2x.png | 1024x1024          |          144 |
+---------------------+--------------------+--------------+

หลังจากเตรียมไฟล์ PNG ทั้งหมดแล้วให้วางลงในไดเร็กทอรีที่มี.iconsetนามสกุล ( Logos.iconsetตัวอย่าง) และดำเนินการต่อไปนี้จากTerminal:

iconutil --convert icns Logos.iconset

หากไม่มีข้อผิดพลาดหลังจากดำเนินการคำสั่งนี้ไฟล์ทั้งหมดจะได้รับการประมวลผลอย่างถูกต้องและคุณได้รับLogos.icnsไฟล์ในไดเร็กทอรีเดียวกันซึ่งมีโลโก้ที่สวยงามทั้งหมดสำหรับแอปของคุณซึ่งจะเหมาะกับหน้าจอสมัยใหม่


16

มีโมดูลโหนดบรรทัดคำสั่งที่ทำงานทั้งหมดในการแปลงไฟล์ PNG เป็นไดเร็กทอรีชุดไอคอน:

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns

9
ไม่รองรับอีกต่อไป :(
jamescampbell

13

คำสั่งเหล่านี้ (ป้อนใน Terminal) ใช้สำหรับฉันในการแปลงไฟล์ icns เก่าเป็นรูปแบบใหม่:

cd Folder_With_Icns_File
iconutil -c iconset Your_Icon_Name.icns 
rm Your_Icon_Name.icns 
iconutil -c icns Your_Icon_Name.iconset
rm -R Your_Icon_Name.iconset

อัปเดต

-cพารามิเตอร์ iconutil ไม่สนับสนุน ใช้--convertแทน:

cd Folder_With_Icns_File
iconutil --convert iconset Your_Icon_Name.icns 
rm Your_Icon_Name.icns 
iconutil --convert icns Your_Icon_Name.iconset
rm -R Your_Icon_Name.iconset

1
ขอบคุณที่แสดงสิ่งนี้ด้วยเหตุนี้ฉันจึงสามารถย้อนกลับจาก icns เพื่อรับ pngs ได้! :)
Noitidart

9

ความคิดเห็นเพิ่มเติมเมื่อคุณสร้างไฟล์. icns คุณต้องเปลี่ยนชื่อไฟล์ pic ทั้งหมดด้วยคำนำหน้า "icon_ " มิฉะนั้น iconutil จะล้มเหลวพร้อมข้อความแสดงข้อผิดพลาด: ".iconset: error: ล้มเหลวในการสร้าง ICNS" ซึ่งไม่ได้ให้ข้อมูลเลย


7

เหมือนกับ @Henry (ความคิดเห็นด้านบน) แต่ใช้เป็นอาร์กิวเมนต์ชื่อไฟล์ PNG และส่งออก ICNS ด้วยชื่อเดียวกัน

บันทึก :ชื่อไฟล์ PNG คาดว่าจะมีเพียง 1 จุดเพื่อแยกนามสกุลเช่น xpto.png

ดังนั้นบันทึกรหัสด้านล่างลงในไฟล์ชื่อ "CreateICNS.src" ในโฟลเดอร์ที่มีไฟล์ png ของคุณ

รหัส:

IFS='.' read -ra ADDR <<< "$1"
ICONSET=${ADDR[0]}.iconset
mkdir $ICONSET
sips -z 16 16     $1 --out $ICONSET/icon_16x16.png
sips -z 32 32     $1 --out $ICONSET/icon_16x16@2x.png
sips -z 32 32     $1 --out $ICONSET/icon_32x32.png
sips -z 64 64     $1 --out $ICONSET/icon_32x32@2x.png
sips -z 128 128   $1 --out $ICONSET/icon_128x128.png
sips -z 256 256   $1 --out $ICONSET/icon_128x128@2x.png
sips -z 256 256   $1 --out $ICONSET/icon_256x256.png
sips -z 512 512   $1 --out $ICONSET/icon_256x256@2x.png
sips -z 512 512   $1 --out $ICONSET/icon_512x512.png
cp $1 $ICONSET/icon_512x512@2x.png
iconutil -c icns $ICONSET
rm -R $ICONSET

วิธีใช้ :

จากนั้นในเทอร์มินัล "cd" ไปที่โฟลเดอร์เดียวกันแล้วพิมพ์:

source CreateICNS.src {PNG filename}

โดยที่ {PNG filename} คือชื่อไฟล์ PNG ของคุณเช่น xpto.png

หากไฟล์ของคุณตั้งชื่อว่า abc.png คุณจะใช้:

source CreateICNS.src abc.png

สุดยอด! ตายง่าย :) บางทีอาจจะทำให้เป็น. sh / script ก็จะยิ่งทำให้มากขึ้น :) ขอบคุณ!
Gutemberg Ribeiro

6

ฉันได้เขียน bash script สำหรับสร้าง icns จากไฟล์ svg:

#!/usr/bin/env bash 
sizes=(16 32 64 128 256 512)
largfile='icon_512x512@2x.png'
if [ ! -f "$largfile" ]; then
  convert -background none -resize 1024x1024 "$1" "$largfile"
fi
for s in "${sizes[@]}"; do
  echo $s
  convert -background none -resize ${s}x${s} "$largfile" "icon_${s}x$s.png"
done

cp 'icon_32x32.png'     'icon_16x16@2x.png'
mv 'icon_64x64.png'     'icon_32x32@2x.png'
cp 'icon_256x256.png'   'icon_128x128@2x.png'
cp 'icon_512x512.png'   'icon_256x256@2x.png'

mkdir icon.iconset
mv icon_*x*.png icon.iconset
iconutil -c icns icon.iconset

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง imagemagick พร้อมการรองรับ librsvg บน Mac:

brew install imagemagick --with-librsvg

สคริปต์นี้ทำหน้าที่ฉันได้ดีทีเดียว


อัปเดต

เพื่อการรักษาที่ละเอียดยิ่งขึ้นฉันได้สร้างเครื่องมือบรรทัดคำสั่ง (เขียนด้วย Swift) สำหรับสร้าง AppIcon.appiconsetด้วยเค้าโครงและรูปแบบที่ถูกต้อง:

https://github.com/kindlychung/genicon


5

ฉันได้ปรับแต่งสคริปต์ของ @ Henry เพื่อให้ดูดีขึ้น:

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -c icns $DIR
rm -frv $DIR

อัปเดต

-cพารามิเตอร์ iconutil ไม่สนับสนุน ใช้-—convertแทน:

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -—convert icns $DIR
rm -frv $DIR

4
เวอร์ชันดั้งเดิมนั้นเรียบง่ายและสามารถทำซ้ำกระบวนการด้วยตนเองในเชลล์ใดก็ได้
Denis Barmenkov

1
หากคุณต้องการทำสิ่งต่างๆด้วยตนเองคุณไม่จำเป็นต้องใช้คอมพิวเตอร์เลย
dardo82

5

ตายง่ายๆ. png 👉 .icns

  1. ดาวน์โหลดIconMaker.app - เป็นเพียง. applescript จะไม่กัด
  2. ลากและวาง. png ของคุณไปยัง IconMaker.app ที่คุณเพิ่งสร้างขึ้น

ข้อมูลเพิ่มเติม : http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

การอัปเดต High sierra iconutilนั้นเข้มงวดมากขึ้นเกี่ยวกับขนาด. png ของแหล่งที่มา เพิ่มเติมเกี่ยวกับเรื่องนี้ในบล็อกโพสต์หลังการกระโดด ✌️


3

เมื่อฉันตรวจสอบความถูกต้องของแอปฉันได้รับข้อผิดพลาดนี้:

แอปพลิเคชันบันเดิลไม่มีไอคอนในรูปแบบ ICNS ซึ่งมีทั้งรูปภาพ 512x512 และ 512x512 @ 2x

ฉันไม่ค่อยถนัดกับคำสั่งเทอร์มินัลและบางทีฉันอาจทำอะไรผิดพลาด ฉันเขียน:

iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>

ประการหนึ่งตามที่ฉันกล่าวไว้ในความคิดเห็นเกี่ยวกับคำตอบของแอนน์คุณอาจไม่จำเป็นต้องใช้ iconutil คุณควรจะเพิ่มชุดไอคอนลงในโปรเจ็กต์ของคุณได้และปล่อยให้ Xcode แปลงเป็นส่วนหนึ่งของบิลด์

ไม่ว่าจะด้วยวิธีใดนี่อาจเป็นปัญหาของคุณ:

ฉันพยายามใส่ไฟล์ PNG สองไฟล์ (512x512 และ 1024x1024) ... แต่ฉันมักจะได้รับข้อผิดพลาด

ไม่มีขนาดจุด 1024 x 1024 ตอนนี้องค์ประกอบ 1024 x 1024 พิกเซล (ซึ่งเป็น 1024 จุดก่อน Mountain Lion) ถูกใช้สำหรับ 512 x 512 จุด @ 2x

ไฟล์ PNG ของคุณต้องตั้งชื่ออย่างเหมาะสม: icon_512x512@2x.png


3

Icon Composer รุ่นเก่าของ Apple เวอร์ชัน 2.2 ใช้งานได้ดีเพียงแค่เปิด. ICNS ในนั้นกดปุ่ม 1024x1024 และเพิ่มรูปภาพของคุณ


ฉันไม่สามารถพูดแทนผู้ถามเดิมได้ แต่คำตอบนี้เป็นสิ่งที่ฉันต้องการ ขอบคุณ!
pestophagous

3
เอกสารของ Apple ระบุว่า "หมายเหตุ: อย่าใช้ Icon Composer เพราะจะสร้างไฟล์ icns ความละเอียดสูงไม่ได้" นั่นคือไอคอน @ 2x ไม่สามารถทำได้ด้วยวิธีนั้น
Clay Bridges

Icon Composer ดูเหมือนจะทำงานได้ดีโดยจัดส่งแยกต่างหากจากไซต์นักพัฒนาของ Apple โดยเป็นส่วนหนึ่งของแพ็คเกจ Graphics Tools for Xcode ดูเพิ่มเติมที่นี่
Michiel Kauw-A-Tjoe

3

รหัสเชลล์ของ @ dardo82 นั้นดีและใช้งานได้ นี่คือสิ่งที่ง่ายกว่าใน sh (สำหรับ * nix ทั้งหมด) และเร็วกว่า (เหมือนสำคัญจริงๆ):

#!/bin/sh
#   This runs silent, be as verbose as you wish
NAME=$(basename ${1} .png)
DIR="${NAME}.iconset"
mkdir -p ${DIR}
for i in 16 32 128 256 512 ; do
    x=""
    for p in $i $(($i+$i)) ; do
        sips -z $p $p ${1} --out "${NAME}.iconset/icon_${i}x${i}${x}.png"
        x="@2x"
    done
done >/dev/null  # /dev/null in lieu of a "-s" silent option
iconutil -—convert icns $DIR
rm -r $DIR

ขอบคุณสำหรับการเปลี่ยนแปลงในสคริปต์ของฉันตอนนี้ฉันไม่แน่ใจด้วยซ้ำว่าทำไมฉันถึงใช้ zsh
dardo82

1

นี่คือฟังก์ชั่นที่อิงจากตัวอย่างของ Henryเป็นส่วนใหญ่(อาจมีประโยชน์ใน~/.bash_profile):

mkicns() {
    if [[ -z "$*" ]] || [[ "${*##*.}" != "png" ]]; then
        echo "Input file invalid"
    else
        filename="${1%.*}"
        mkdir "$filename".iconset
        for i in 16 32 128 256 ; do
            n=$(( i * 2 ))
            sips -z $i $i "$1" --out "$filename".iconset/icon_${i}x${i}.png
            sips -z $n $n "$1" --out "$filename".iconset/icon_${i}x${i}@2x.png
            [[ $n -eq 512 ]] && \
            sips -z $n $n "$1" --out "$filename".iconset/icon_${n}x${n}.png
            (( i++ ))
        done
        cp "$1" "$filename".iconset/icon_512x512@2x.png
        iconutil -c icns "$filename".iconset
        rm -r "$filename".iconset
    fi
}

การใช้งาน :

$ mkicns "filename.png"  # double-quote if spaces exist in filename

สร้าง 10 ขนาดตั้งแต่16x16ถึง512x512@2x; ยอมรับภาพที่ป้อนใน .pngรูปแบบเท่านั้น


1

วิ่ง iconutil -c icns Icon.iconset

บันทึก

  • Icon.iconset คือโฟลเดอร์
  • ชื่อขึ้นต้นด้วยตัวพิมพ์เล็ก icon_
  • เมื่อคุณเห็นIcon.icnsด้วยภาพที่ถูกต้องคุณจะรู้ว่ามันใช้งานได้

ใส่คำอธิบายภาพที่นี่


ทำไม3x? Apple ไม่ต้องการมัน
Neurotransmitter

1

มี 2 ​​งาน:
- สร้างไฟล์ icns 10 ไฟล์ที่ถูกต้อง
- รับโปรเจ็กต์ Xcode ของคุณเพื่อใช้งานได้อย่างถูกต้อง

เนื่องจากฉันมีปัญหานานหลายชั่วโมงกับงานทั้งสองนี้และไม่ชอบเมื่อฉันไม่ 'เห็น' สิ่งที่เกิดขึ้นนี่เป็นเส้นทางสำหรับคนที่ระมัดระวัง:

สร้างไฟล์ icns 10 ไฟล์ที่ถูกต้อง:
ฉันใช้สคริปต์ด้านบนจาก Henry: มันยังคงใช้ได้กับ HighSierra และ Xcode 9.2 รวมถึงคำสั่ง 'c'
ไฟล์ icns ที่ฉันได้รับปรากฏเป็นขนาดไอคอนเดียวใน Finder / Quicklook และใน Preview แสดงเพียง 8 จาก 10 ขนาด
ดังนั้นฉันจึงใช้เทอร์มินัลไปกับ cd ไปที่โฟลเดอร์ของฉันและใช้คำสั่ง: iconutil -c iconset (ชื่อไฟล์ icns) บนไฟล์ icns ที่เพิ่งสร้างขึ้นเพื่อเปลี่ยนไฟล์ icns กลับไปที่โฟลเดอร์ iconset และ - lo & behold - ฉันเห็น ไฟล์ไอคอน 10 ไฟล์ที่สร้างขึ้นใหม่ของฉัน ด้วยการใช้ Quick look ในโฟลเดอร์ชุดไอคอน (และใช้โหมดเต็มหน้าจอเพื่อให้สามารถซูมผ่านได้ด้วยแถบเลื่อน) ฉันสามารถตรวจสอบได้ว่าทุกขนาดดูดีมาก

นอกเหนือจากนี้: พวกเขาดูดีกว่าความพยายามในการปรับขนาดของฉันกับ PSE ส่วนใหญ่เป็นเพราะฉันไม่ได้ใช้เวลาในการเล่นกับตัวเลือกการปรับขนาดทั้งหมดใน PSE หากคุณใช้ PSE ตรวจสอบให้แน่ใจว่าไฟล์ png ของคุณได้รับการบันทึกโดยไม่มีโปรไฟล์สี นอกจากนี้ฉันสารภาพว่าฉันไม่รู้สำหรับฉันไฟล์ 256x256 @ 2 นั้นเหมือนกับไฟล์ 512x512 - ทั้งใน 72dpi การพยายามทำตามความคิดเห็น 144 dpi ด้านบนไม่ได้ผลสำหรับฉัน

รับโปรเจ็กต์ Xcode ของคุณเพื่อใช้อย่างถูกต้อง:
ก่อนอื่นฉันลบความพยายามที่ไร้ผลทั้งหมดของฉันภายใน Xcode และยืนยันเวอร์ชันที่สะอาดไปยังที่เก็บ git (สิ่งที่จะฉลาดได้คือการยอมรับเวอร์ชันที่สะอาดก่อน - ก่อนที่ฉันจะเริ่มไอคอนอย่างเมามัน นอกจากนี้ odyssee)
ฉันตรวจสอบให้แน่ใจด้วยว่าในไฟล์ info.plist ไม่มีตัวชี้ที่เชื่อมโยงกับรายการ "ไฟล์ไอคอน" และในการตั้งค่าโครงการทั่วไปของฉันฉันได้เลือก AppIcon สำหรับไอคอนแอป
จากนั้นฉันก็เพิ่มแคตตาล็อก assets.asset และภายในแค็ตตาล็อกสินทรัพย์มีโฟลเดอร์ AppIcon 'AppIcons and Launch Images' ใหม่สำหรับ OS
จากนั้นฉันคัดลอก (ลากแล้วปล่อยโดยกดตัวเลือก) จากโฟลเดอร์ iconset แต่ละไฟล์รูปภาพ png ไปยัง AppIcon Spaceholder ตามลำดับ อีกครั้งฉันได้เห็นสิ่งที่เกิดขึ้น Xcode แปลงเป็นไฟล์ icns หรืออาจจะเป็น - เป็นโฟลเดอร์ชุดไอคอนของฉันที่ได้มาจากโฟลเดอร์ icns - ยอมรับรูปแบบไฟล์แล้ว

จากนั้นเก็บถาวรและตรวจสอบความถูกต้องและจะไม่มีข้อผิดพลาดในการอัปโหลดหรือตรวจสอบความถูกต้อง


จัดรูปแบบ! คำตอบของคุณอาจดี แต่อ่านไม่ออก ใช้ย่อหน้าและการกลับแคร่
Nic3500

0

ฉันต้องการสิ่งนี้ แต่สำหรับ CMake ฉันยังต้องการตัวเลือกในการให้ SVG

นี่คือส่วนสำคัญ: https://gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

และรหัส CMake:

# LICENSE: CC0 - go nuts.

# Hi :) This is what I used to generate the ICNS for my game, Tide.
# Both input formats (SVG vs PNG) work just fine, but in my experience
# the SVG came out with noticeably better results (although PNG wasn't
# a catastrophe either). The logo for the game was simple enough that
# SVG was indeed an option.

# To use:
#
#    make_icns( INPUT "path/to/img.{svg,png}"
#               OUTPUT ICNS_PATH )
#
# Then add it as a custom target or use it as a
# dependency somewhere - I give you that option.
#
# For example:
#
#    add_custom_target( my-icns ALL DEPENDS "${ICNS_PATH}" )
#
# For the associated utilities:
#
# - PNG: brew install imagemagick
# - SVG: brew cask install inkscape
#
# Enjoy!

function (make_icns_from_png)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    find_program (
        convert_exe
        NAMES "convert" "convert.exe"
        DOC "Path to ImageMagick convert")
    if (NOT convert_exe)
        message (FATAL_ERROR "Could not find ImageMagick's 'convert' - is ImageMagick installed?")
    endif ()

    get_filename_component (ARG_INPUT_ABS "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    get_filename_component (ARG_INPUT_ABS_BIN "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    get_filename_component (ARG_INPUT_FN "${ARG_INPUT_ABS_BIN}" NAME_WE)
    get_filename_component (ARG_INPUT_DIR "${ARG_INPUT_ABS_BIN}" DIRECTORY)

    set (sourceimg "${ARG_INPUT_ABS}")

    set (basepath "${ARG_INPUT_DIR}/${ARG_INPUT_FN}")
    set (output_icns "${basepath}.icns")
    set (iconset "${basepath}.iconset")

    set (deplist "")

    foreach (size IN ITEMS 16 32 128 256 512)
        math (EXPR size2x "2 * ${size}")

        set (ipath "${iconset}/icon_${size}x${size}.png")
        set (ipath2x "${iconset}/icon_${size}x${size}@2x.png")

        list (APPEND deplist "${ipath}" "${ipath2x}")

        add_custom_command (
            OUTPUT "${ipath}"
            COMMAND "${convert_exe}" ARGS "${sourceimg}" -resize "${size}x${size}" "${ipath}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath}"
            VERBATIM)

        add_custom_command (
            OUTPUT "${ipath2x}"
            COMMAND "${convert_exe}" ARGS "${sourceimg}" -resize "${size2x}x${size2x}" "${ipath2x}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath2x}"
            VERBATIM)
    endforeach ()

    add_custom_command (
        OUTPUT "${output_icns}"
        COMMAND iconutil ARGS --convert icns --output "${output_icns}" "${iconset}"
        MAIN_DEPENDENCY "${sourceimg}"
        DEPENDS ${deplist}
        COMMENT "ICNS: ${output_icns}"
        VERBATIM)

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${output_icns}" PARENT_SCOPE)
    endif ()
endfunction ()

function (make_icns_from_svg)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    set (CMAKE_FIND_APPBUNDLE NEVER) # otherwise, it'll pick up the app bundle and open a shit ton of windows
    find_program (
        inkscape_exe
        NAMES "inkscape" "inkscape.exe"
        DOC "Path to Inkscape"
        PATHS "/usr/local/bin" "/usr/bin")

    message (STATUS "Inkscape path: ${inkscape_exe}")

    if (NOT inkscape_exe)
        message (FATAL_ERROR "Could not find Inkscape - is it installed?")
    endif ()

    get_filename_component (ARG_INPUT_ABS "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    get_filename_component (ARG_INPUT_ABS_BIN "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    get_filename_component (ARG_INPUT_FN "${ARG_INPUT_ABS_BIN}" NAME_WE)
    get_filename_component (ARG_INPUT_DIR "${ARG_INPUT_ABS_BIN}" DIRECTORY)

    set (sourceimg "${ARG_INPUT_ABS}")

    set (basepath "${ARG_INPUT_DIR}/${ARG_INPUT_FN}")
    set (output_icns "${basepath}.icns")
    set (iconset "${basepath}.iconset")

    set (deplist "")

    foreach (size IN ITEMS 16 32 128 256 512)
        math (EXPR size2x "2 * ${size}")

        set (ipath "${iconset}/icon_${size}x${size}.png")
        set (ipath2x "${iconset}/icon_${size}x${size}@2x.png")

        list (APPEND deplist "${ipath}" "${ipath2x}")

        add_custom_command (
            OUTPUT "${ipath}"
            COMMAND "${inkscape_exe}" ARGS -z -e "${ipath}" -w ${size} -h ${size} "${sourceimg}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath}"
            VERBATIM)

        add_custom_command (
            OUTPUT "${ipath2x}"
            COMMAND "${inkscape_exe}" ARGS -z -e "${ipath2x}" -w ${size2x} -h ${size2x} "${sourceimg}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath2x}"
            VERBATIM)
    endforeach ()

    add_custom_command (
        OUTPUT "${output_icns}"
        COMMAND iconutil ARGS --convert icns --output "${output_icns}" "${iconset}"
        MAIN_DEPENDENCY "${sourceimg}"
        DEPENDS ${deplist}
        COMMENT "ICNS: ${output_icns}"
        VERBATIM)

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${output_icns}" PARENT_SCOPE)
    endif ()
endfunction ()

function (make_icns)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    if (NOT ARG_INPUT)
        message (FATAL_ERROR "INPUT is required")
    endif ()

    if (NOT IS_ABSOLUTE "${ARG_INPUT}")
        get_filename_component (ARG_INPUT "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    endif ()

    if (NOT EXISTS "${ARG_INPUT}")
        message (FATAL_ERROR "INPUT does not exist: ${ARG_INPUT}")
    endif ()

    file (RELATIVE_PATH ARG_INPUT "${CMAKE_CURRENT_SOURCE_DIR}" "${ARG_INPUT}")

    get_filename_component (ARG_INPUT_EXT "${ARG_INPUT}" EXT)
    if ("${ARG_INPUT_EXT}" STREQUAL ".png")
        make_icns_from_png (INPUT "${ARG_INPUT}" OUTPUT child_output)
    elseif ("${ARG_INPUT_EXT}" STREQUAL ".svg")
        make_icns_from_svg (INPUT "${ARG_INPUT}" OUTPUT child_output)
    else ()
        message (FATAL_ERROR "INPUT must refer to a .png or .svg, but a ${ARG_INPUT_EXT} was provided")
    endif ()

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${child_output}" PARENT_SCOPE)
    endif ()
endfunction ()

-1

สวัสดีสำหรับความต้องการของฉันฉันสร้างหยดน้ำที่ทำงานในไอคอนลากและวางเพียงอย่างเดียวหรือไอคอนเพื่อค้นหาในโฟลเดอร์ (ฉัน จำกัด เฉพาะโฟลเดอร์เนื่องจากการค้นหาปริมาตรของไอคอนทั้งหมดอาจใช้เวลานาน) ดังนั้นในการลากและวางคุณสามารถวางโฟลเดอร์หรือแอปพลิเคชันอะไรก็ได้ที่มีไอคอน ชุดไอคอนที่สร้างขึ้นมีชื่อของไอคอนดั้งเดิมซึ่งจะอยู่ในไดเร็กทอรี "/ aaaicones" และเส้นทางของไอคอน ตัวอย่างในโฟลเดอร์ "/ aaaicones หากคุณส่ง xcode.app คุณจะพบ" /aaaicones/Applications/xcode.app/access.iconset "และ /aaaicones/Applications/xcode.app/access.icns (ไอคอนที่สร้างขึ้นใหม่) ที่นั่นจะ เป็นไฟล์ข้อความที่มีการติดตามเส้นทางแบบเต็มของไอคอนและเส้นทางไปยังตัวอย่างชุดไอคอนที่เกี่ยวข้อง "/Applications/xcode.app/Contents/Applications/Instruments

on open draggedItems
    set input to draggedItems
    set fich to draggedItems


    set media to {}

    set theInfo to {}

    set n to "0"
    repeat with currentItem in draggedItems
        set dirchoisi to POSIX path of fich
        if ".icns" is not in dirchoisi then
            if "Volumes" is not in dirchoisi then

                set origi to do shell script "echo   /aaaicones" & dirchoisi
                set fich to do shell script "echo " & fich & " | xxd -p -c 100000 | sed 's#3a#2f#g' | xxd -r -p | sed 's#" & dirchoisi & "#" & "/aaaicones" & dirchoisi & "#g' | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"
                tell application "Finder"
                    if exists (folder fich) then
                        set nn to "0"
                        repeat with nn from 1 to 5
                            set origi to do shell script "echo  " & origi & "/" & " | sed 's#//#" & nn & "/" & "#'"
                            set fich to do shell script "echo " & fich & " | sed 's#:aaaicones*.*#" & origi & "#'" & " | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"

                            if not (exists folder (fich as Unicode text)) then
                                try
                                    set origi to do shell script "echo  " & origi
                                    exit repeat
                                end try
                            end if
                        end repeat
                    end if
                end tell
                tell application "Finder"
                    if not (exists folder (fich as Unicode text)) then
                        do shell script "mkdir -p -m 0777 " & quoted form of origi
                    end if
                end tell
                try
                    set theInfo to do shell script "find " & (quoted form of dirchoisi) & " -name *.icns "
                end try




                set AppleScript's text item delimiters to return

                set theList to text items of theInfo

                set AppleScript's text item delimiters to ""

                set n to count theList
                repeat with i from 1 to n
                    if "Volumes" is not in item i of theList then
                        set end of media to item i of theList
                    end if
                end repeat
                set n to count media
                set cheminicns to do shell script " > " & quoted form of (origi & "aalisticones.txt") & " |  chmod 777 " & quoted form of (origi & "aalisticones.txt")
                set cheminicns to do shell script "ls " & quoted form of (origi & "aalisticones.txt")

                tell application "Finder"
                    set letext to (POSIX file cheminicns as alias)
                    set label index of letext to 2
                end tell



                repeat with i from 1 to n

                    set hdd to item i of media
                    try

                        set input to do shell script "echo   " & hdd & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
                        do shell script "echo   " & quoted form of input & " >>" & quoted form of cheminicns
                        set png to do shell script "echo " & quoted form of input & " | sed 's#.*/##' "

                        do shell script "cp -f " & quoted form of input & " " & quoted form of origi
                        set input to do shell script "iconutil -c iconset  " & quoted form of (origi & png)
                        do shell script "echo   " & quoted form of (origi & png) & " | sed 's#.icns#.iconset#' >>" & quoted form of cheminicns
                    end try
                end repeat
                tell application "Finder"
                    if exists (folder fich) then
                        open fich
                    end if
                end tell

            end if
        else

            set input to do shell script "echo   " & dirchoisi & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
            set png to do shell script "echo " & quoted form of input & " | sed 's#.*/##' "
            set origi to do shell script "echo " & quoted form of ("/aaaicones/aIconeseule/" & input) & " | sed 's#/Volumes/##; s#" & quoted form of png & "##'"
            do shell script "mkdir -p -m 0777 " & quoted form of origi
            do shell script "echo   " & quoted form of input & " >>" & quoted form of origi & "aalisticones.txt"

            do shell script "cp -f " & quoted form of input & " " & quoted form of origi
            set input to do shell script "iconutil -c iconset  " & quoted form of (origi & png)
            do shell script "echo   " & quoted form of (origi & png) & " >>" & quoted form of origi & "aalisticones.txt"
        end if
    end repeat
end open
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.