簡體   English   中英

如何使用 sip 或其他方式以編程方式制作具有 10 個不同圖像的 Mac OS X ICNS

[英]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()來覆蓋它。 包括鍵kCGImagePropertyDPIHeightkCGImagePropertyDPIWidth ,每個鍵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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM