Ошибка ImageIO при создании файла ICNS

Этот код (source является NSMutableArray с NSImage объекты:

NSURL *fileURL = [NSURL fileURLWithPath:aPath];
CGImageDestinationRef dr = CGImageDestinationCreateWithURL((CFURLRef)fileURL,
                                                           kUTTypeAppleICNS,
                                                           1,
                                                           NULL);

for (NSImage *img in source) {

    NSLog(@"%@",img);
    CGImageRef i1 = [img CGImageForProposedRect:NULL context:nil hints:nil];
    CGImageDestinationAddImage(dr, i1, NULL);

}

CGImageDestinationFinalize(dr);
CFRelease(dr);

Результатом стал следующий вывод:

2012-12-26 13: 48: 57.682 Eicon [1131: 1b0f] | NSImage 0x1025233b0 Size = {11.52, 11.52} Reps = ("NSBitmapImageRep 0x10421fc30 Size = {11.52, 11.52} ColorSpace = (еще не загружен) BPS=8 BPP=(еще не загружено) Pixels=1024x1024 Alpha=NO Planar=NO Format=(еще не загружено) CurrentBacking= ноль (сбой) CGImageSource = 0x104221170 "

(...) <- здесь регистрируются другие экземпляры NSImage.

ImageIO: | ОШИБКА | CGImageDestinationFinalize пункт назначения изображения не имеет достаточно изображений

Любые идеи, почему это заканчивается с ошибкой в ​​конце? (Кстати, я думал об использовании IconFamily, но многие методы, которые он использует, устарели).

РЕДАКТИРОВАТЬ: Может быть, было бы более важно упомянуть код, который я использую для генерации изображений, я не удивлюсь, если этот код имеет проблемы (я нуб):

// Get images
[source removeAllObjects];
NSSize sizes[10];
sizes[0] = NSMakeSize(1024,1024);
sizes[1] = NSMakeSize(512,512);
sizes[2] = NSMakeSize(512,512);
sizes[3] = NSMakeSize(256,256);
sizes[4] = NSMakeSize(256,256);
sizes[5] = NSMakeSize(128,128);
sizes[6] = NSMakeSize(64,64);
sizes[7] = NSMakeSize(32,32);
sizes[8] = NSMakeSize(32,32);
sizes[9] = NSMakeSize(16,16);
for (int i=0 ; i<10 ; i++) {
    if ([[NSUserDefaults standardUserDefaults] boolForKey:[NSString stringWithFormat:@"Size%i",i+1]]) {
        NSBitmapImageRep *srcimg = [[NSBitmapImageRep alloc] initWithData:[NSData dataWithContentsOfFile:aFile]];
        [srcimg setPixelsHigh:sizes[i].height];
        [srcimg setPixelsWide:sizes[i].width];
        NSImage *newimg = [[NSImage alloc] initWithSize:NSZeroSize];
        [newimg addRepresentation:srcimg];
        if (![newimg isValid]) {
            [delegate error:@"Invalid file."];
        }
        else [source addObject:newimg];
    }
}

2 ответа

Одна часть предположения о решении, одна часть изменения, которая улучшит код, даже если это не решение…

Ваше количество изображений в CGImageDestinationCreateWithURL неправильно; Вы должны передать количество изображений, которые вы ожидаете добавить.

Учитывая цикл, вы явно ожидаете добавления одного или нескольких. Учитывая ваш вывод, вы фактически добавляете более одного изображения.

Вы сказали, что добавите ровно 1 изображение, а затем добавили более одного.

Я предполагаю, что сообщение об ошибке является неясным / слишком конкретным. Ошибка говорит:

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

Но я думаю, что это значит:

На изображении CGImageDestinationFinalize имеется другое количество изображений, чем вы обещали

Другими словами, проблема не в том, что вы предоставили меньше изображений, чем ожидалось; это то, что вы предоставили больше, чем ожидалось, и CGImageDestination не проводит различий между большим и меньшим количеством.

Измени свой CGImageDestinationCreateWithURL позвоните, чтобы указать правильное количество изображений, которые вы будете добавлять. Учитывая код в вашем вопросе, это должно быть source.count,

Проходя через -TIFFRepresentation а также CGImageSource очень окольный Используйте CGImageForProposedRect:context:hints: метод вместо.

Другие вопросы по тегам