[英]How to programmatically make Mac OS X ICNS with 10 different images using sips or other
我的問題是我需要。 我需要以編程方式實現這一點。
因此,對於 mac os x,應用程序圖標應具有以下大小:
我有 10 張圖片。 每一個我都在右角放了一個徽章,這個徽章的位置和位置沒有縮放。 所以我有 10 個不同的圖像。
如何制作一個 ICNS?
我想使用 sips,但是 sips 只需要一個文件,它可以完成所有縮放: http ://cc.bingj.com/cache.aspx?q=mac+icns+sips+argument+list&d=5035141870911884&mkt=en-US& setlang =en-US&w=n3PZcWn6bEPxt4O96PPLd6nugtVq5jDz
有沒有辦法讓/usr/bin/sips
獲取我的 10 個圖像並從中制作一個 icns? 如果sips不能做到,還有其他方法嗎?
如果你想使用iconutil
,你可以這樣做。 至少在我的 10.9.5 系統上,它是基本操作系統的一部分。 它不是特殊安裝,如開發人員工具。 您可以使用以下方法驗證:
pkgutil --file-info /usr/bin/iconutil
在這里,輸出:
volume: /
path: /usr/bin/iconutil
pkgid: com.apple.pkg.BSD
pkg-version: 10.9.0.1.1.1306847324
install-time: 1402788942
uid: 0
gid: 0
mode: 755
重要的部分是 pkgid。 它是 BSD 包的一部分,BSD 包是基本操作系統的一部分。
也就是說,編寫一些代碼來做到這一點並不難。
您可以使用 CGDestination API。 使用CGImageDestinationCreateWithURL()
創建目的地。 對於type
,傳遞kUTTypeAppleICNS
。
鑒於您想從單個文件添加圖像,使用CGImageSourceCreateWithURL()
為每個文件創建一個CGImageSource
可能是最簡單的。 然后,您可以使用CGImageDestinationAddImageFromSource()
直接將圖像從源添加到目標。 在CFRelease()
每個源的圖像添加到目標后,不要忘記CFRelease()
。
然后,調用CGImageDestinationFinalize()
讓目的地將圖像寫出到 URL。 然后, CFRelease()
目標。
如果每個源圖像都設置了正確的 DPI,這將完整地復制到目的地。 如果源圖像沒有設置正確的 DPI,您可以通過將屬性字典傳遞給CGImageDestinationAddImageFromSource()
來覆蓋它。 包括鍵kCGImagePropertyDPIHeight
和kCGImagePropertyDPIWidth
,每個鍵kCGImagePropertyDPIHeight
一個具有所需 DPI 的CFNumber
對象的對應值。 對於正常分辨率的圖標,請使用 72 DPI。 對於高分辨率 (@2x) 圖標,請使用 144 DPI。
使用舊的 IconFamily API 也可以創建 ICNS 文件,但它有點麻煩。 此外,它不支持高分辨率圖標。
首先,為圖標系列創建一個句柄(指針到指針到可調整大小的緩沖區):
IconFamilyHandle iconFamily = (IconFamilyHandle)NewHandle(0);
然后,對於每個圖像大小(16、32、128、256 和 512),您為圖像數據的原始位圖創建一個句柄。 位圖應該是每像素 32 位,每組件 8 位,ARGB 非預乘數據,沒有填充。
int size = /* 16, 32, 128, 256, or 512 */;
Handle handle = NewHandle(size * size * 4);
// fill handle with image data; buffer pointer is *handle
然后,您可以通過如下調用將該句柄添加到圖標系列中:
SetIconFamilyData(iconFamily, kIconServices16PixelDataARGB, handle);
對於其他尺寸,將kIconServices16PixelDataARGB
的“16”替換為適當的值。
然后,您將圖標系列句柄的數據寫入文件。 通過簡單地取消引用句柄(即*iconFamily
)獲得指向數據的指針。 它的大小是通過調用GetHandleSize((Handle)iconFamily)
。
通過調用DisposeHandle()
處理您在此過程中創建的任何句柄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.