2015-01-06 6 views
0

내 문제는 내가 필요하다는 것입니다. 이 프로그래밍 방식으로 달성해야합니다. 프로그래밍 방식으로 10 가지 이미지로 Mac OS X ICNS를 작성하는 방법

내가 10 개 개의 이미지가 있습니다

그래서 맥 OS에 대한 응용 프로그램 아이콘이이 크기를 가져야한다 X. 각 하나는 오른쪽 구석에 배지를 배치했는데이 배지의 배치와 위치는 축척되지 않았습니다. 그래서 나는 10 개의 서로 다른 이미지를 가지고있다.

어떻게 ICNS를 만들까요? 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을 만들 수있는 방법이 있나요 :

는 그러나 나는 단지 모금 한 파일을 소요하고는 모든 스케일링을 수행, 모금을 사용하는 줄 알았는데? 모금을 할 수 없다면 다른 방법이 있습니까?

답변

2

iconutil을 사용하려는 경우이를 수행 할 수 있습니다. 적어도 내 10.9.5 시스템에서는 기본 OS의 일부입니다. 개발자 도구와 같이 특별한 설치가 아닙니다. 다음을 사용하여 확인할 수 있습니다 :

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입니다. 이것은 기본 OS의 일부인 BSD 패키지의 일부입니다.

그렇긴하지만 이렇게하기 위해 약간의 코드를 작성하는 것이 어렵지 않습니다.

CGDestination API를 사용할 수 있습니다. CGImageDestinationCreateWithURL()을 사용하여 대상을 만듭니다. type의 경우 kUTTypeAppleICNS을 전달하십시오.

개별 파일의 이미지를 추가하려는 경우 CGImageSourceCreateWithURL()을 사용하여 각각에 대해 CGImageSource을 만드는 것이 가장 쉽습니다. 그런 다음 CGImageDestinationAddImageFromSource()을 사용하여 원본에서 대상으로 직접 이미지를 추가 할 수 있습니다. 이미지를 대상에 추가 한 후에는 각 소스 CFRelease()을 잊지 마세요.

그런 다음 CGImageDestinationFinalize()으로 전화를 걸어 목적지로 이미지를 URL에 쓰도록하십시오. 그런 다음 CFRelease() 대상.

각 원본 이미지에 적절한 DPI가 설정되어 있으면 대상으로 그대로 복사됩니다. 원본 이미지에 적절한 DPI 집합이 없으면 속성 사전을 CGImageDestinationAddImageFromSource()에 전달하여 재정의 할 수 있습니다. kCGImagePropertyDPIHeightkCGImagePropertyDPIWidth 키를 포함하고 각각은 해당 DPI가있는 CFNumber 개체의 해당 값을가집니다. 일반 해상도 아이콘의 경우 72 DPI를 사용하십시오. 고해상도 (@ 2x) 아이콘의 경우 144 DPI를 사용하십시오.


ICNS 파일 만들기는 이전 IconFamily API를 사용하여 수행 할 수도 있지만 약간 털이 있습니다. 또한 고해상도 아이콘을 지원하지 않습니다.

먼저, 사용자가 핸들을 생성 (포인터 - 대 - 포인터로 크기 조정 버퍼) 아이콘 가족 :

이어서
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()을 호출하여 도중에 생성 한 핸들을 삭제합니다.

+1

정말 대단합니다! Ken 감사합니다 !! CoreFoundation 코드를 작성하려고합니다. 어쨌든 OSTX 이후 iconutil을 사용할 수 있는지 알고 있습니까? 이 주제는 여기에 일부 Mac에서 누락 된 것으로 보인다 : [StackOverflow :: iconset 명령 줄 도구 'iconutil'은 어디에 있습니까?] (http://stackoverflow.com/questions/12281309/where-is-the-iconset) -command-line-tool-iconutil-located) – Noitidart

+1

죄송합니다.'iconutil '이 도입 된시기를 모르겠습니다. 그래도 좋은/중요한 관심사입니다. 얼마나 멀리 다시 배포 하시겠습니까? CGImageDestination은 10.6에서 ICNS를 지원하기 시작한 것 같지만 버그였습니다. 그래서, 당신은 단지 10.7에서 사용하려고 노력해야합니다. –

+0

'CGImageDestination'에 대한 중요한 메모를 보았습니다. 나는 OSX> = 10.5에서 지원되는 Firefox 4+를위한 addon에서 이것을 사용하고있다. 혹시 10.5의 CGImageDestination에 대한 해결 방법을 알고 계신가요? – Noitidart