此代码(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 = nil(错误)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];
}
}
答案 0 :(得分:3)
有一部分猜测解决方案,即使不是解决方案,也会改进代码的一部分......
CGImageDestinationCreateWithURL
中的图片数量错误;你应该传递你想要添加的图像数量。
给定循环,您显然希望添加一个或更多。根据您的输出,您实际上是在添加多个图像。
你说你会添加1张图片,然后你添加了不止一张。
我的猜测是错误信息不清楚/过于具体。错误说:
CGImageDestinationFinalize图像目标没有足够的图像
但我认为这意味着:
CGImageDestinationFinalize图像目标的图像数量与您承诺的数量不同
换句话说,问题不在于您提供的更少的图像比预期的少;这是你提供更多而不是预期,而且CGImageDestination没有区分越来越多。
更改CGImageDestinationCreateWithURL
来电,以提供您要添加的正确数量的图片。根据您问题中的代码,这应该是source.count
。
答案 1 :(得分:1)
通过-TIFFRepresentation
和CGImageSource
是非常迂回的。请改用the CGImageForProposedRect:context:hints:
method。