Как создать иконку ICNS программно?

ОК, это то, что я хочу:

  • Возьми немного NSImage s
  • Добавьте их в ICNS файл
  • Сохрани это

Это то, что я сделал до сих пор (чисто в качестве теста):

- (CGImageRef)refFromImage:(NSImage*)img
{
    CGImageSourceRef source;

    source = CGImageSourceCreateWithData((CFDataRef)[img TIFFRepresentation], NULL);
    CGImageRef maskRef =  CGImageSourceCreateImageAtIndex(source, 0, NULL);

    return maskRef;
}

- (void)awakeFromNib
{
    NSImage* img1 = [NSImage imageNamed:@"image1"];
    NSImage* img2 = [NSImage imageNamed:@"image2"];

    NSLog(@"%@",img1);
    CGImageRef i1 = [self refFromImage:img1];
    CGImageRef i2 = [self refFromImage:img2];

    NSURL *fileURL = [NSURL fileURLWithPath:[@"~/Documents/final.icns" stringByExpandingTildeInPath]]; 
    CGImageDestinationRef dr = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeAppleICNS , 1, NULL);

    CGImageDestinationAddImage(dr, i1, NULL);
    CGImageDestinationAddImage(dr, i2, NULL);
    /* Even tried adding 'multiple' times

    CGImageDestinationAddImage(dr, i1, NULL);
    CGImageDestinationAddImage(dr, i2, NULL);
    CGImageDestinationAddImage(dr, i1, NULL);
    CGImageDestinationAddImage(dr, i2, NULL);

    */

    CGImageDestinationFinalize(dr);

    CFRelease(dr);
}

Но это все еще продолжает выдавать ошибку:

ImageIO: CGImageDestinationFinalize пункт назначения изображения не имеет достаточно изображений

Что не так с моим кодом?


Я посмотрел на ответы ниже, но все еще ничего:

1 ответ

Решение

Вы можете использовать IconFamily.

IconFamily - это оболочка Cocoa/Objective-C для типа данных "семейство значков" в Mac OS X Carbon API. Его основная цель - позволить приложениям Какао легко создавать пользовательские значки файлов из экземпляров NSImage и, таким образом, использовать преимущества форматов пиктограмм RGBA высокого разрешения Mac OS X для обеспечения подробного предварительного просмотра миниатюр содержимого файлов.

NSImage *mImage = [[NSImage alloc] initWithContentsOfFile:@"/Users/Username/Desktop/WhiteTiger.jpg"];
IconFamily *fam = [IconFamily iconFamilyWithThumbnailsOfImage:mImage];    
[fam writeToFile:@"/Users/Username/Desktop/WhiteTiger.icns"];
Другие вопросы по тегам