2012-12-26 51 views
1

此代码(sourceNSMutableArrayNSImage对象:ImageIO的错误时创建文件ICNS

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 = (尚未加载)像素= 1024×1024阿尔法= NO平面= NO格式=(尚未加载)CurrentBacking =零(断层)CGImageSource = 0x104221170"

(...)< - 这里的其他NSImage中实例记录。

ImageIO:| ERROR | 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]; 
    } 
} 
+0

如果你记录你的CGImageRef怎么办? – JWWalker

+1

'-refFromImage:'做什么?它是否返回非零? – paulmelnikow

+0

请编辑您的问题以包含您的'refFromImage:'代码。 –

回答

1

经过-TIFFRepresentationCGImageSource是非常迂回。改为使用the CGImageForProposedRect:context:hints: method

+0

是的,我看到你在http://stackoverflow.com/questions/2548059/turning-an-nsimage-into-a-cgimageref中提到过,将适应我的代码。 – Fatso

+0

改编的代码,没有运气,但我没有想到任何。 – Fatso

+0

@Korion:请编辑您的问题以显示您的修改代码以及它的结果。 –

3

的解决方案,一个部分的变化,一部分猜测,这将提高代码,即使它不是解决......

你在CGImageDestinationCreateWithURL图像的数量是错误的;你应该传递你期望添加的图片数量。

给定一个循环,你显然希望增加一个或更多。考虑到你的输出,你实际上添加了多个图像。

你说你会添加一个图像,然后你添加了多个。

我的猜测是错误信息不清楚/过于具体。错误说:

CGImageDestinationFinalize图像目标没有足够的图像

但我认为它的意思是:

CGImageDestinationFinalize图像目标都有不同数量的比你答应图片

换句话说,问题不在于你提供了减少图像比预期;这是你提供了更多的比预期,和CGImageDestination之间的差异更多和更少。

更改CGImageDestinationCreateWithURL调用它来提供你会被添加图像的正确数目。鉴于你的问题中的代码,这应该是source.count

+0

好,既然解决了它,我会给你赏金。现在,当我尝试添加一个1024x1024的图像,它说*“的ImageIO: _CGImagePluginWriteICNS不支持的图像尺寸(1024×1024) - 比例因子:1” * – Fatso

+0

我必须等待10小时才能授予您的奖金将这样做,那么: ) – Fatso

+0

@Korion:IconFamily图像中的1024像素@ 1x元素在Mountain Lion中不推荐使用。它们应该被添加为512点@ 2x(相同的像素尺寸,但标记为512 @ 2x而不是1024 @ 1x)。 –