【问题标题】:ImageIO Error When Creating ICNS File创建 ICNS 文件时出现 ImageIO 错误
【发布时间】:2012-12-26 13:00:34
【问题描述】:

此代码(source 是带有 NSImage 对象的 NSMutableArray

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 大小={11.52, 11.52} 代表=( "NSBitmapImageRep 0x10421fc30 Size={11.52, 11.52} ColorSpace=(尚未加载) BPS=8 BPP=(尚未加载) Pixels=1024x1024 Alpha=NO Planar=NO Format=(尚未加载) CurrentBacking=nil (faulting) CGImageSource =0x104221170"

(...)

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];
    }
}

【问题讨论】:

  • 如果你记录你的 CGImageRef 会怎样?
  • -refFromImage: 是做什么的?它是否返回非零的东西?
  • 请编辑您的问题以包含refFromImage: 的代码。
  • 更新了!不确定如何记录 CGImageRef...
  • 我认为您可以使用NSLog 记录CGImageRef,如果不使用CFShow

标签: macos cocoa icons icns


【解决方案1】:

部分猜测解决方案,部分更改将改进代码,即使它不是解决方案......

您在CGImageDestinationCreateWithURL 中的图片数量错误;您应该传递您希望添加的图像数量。

给定一个循环,您显然希望添加一个或更多。鉴于您的输出,您实际上是在添加多个图像。

你说你只添加 1 张图片,然后你添加了不止一张。

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

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

但我认为它的意思是:

CGImageDestinationFinalize 图像目的地的图像数量与您承诺的不同

换句话说,问题不在于您提供的图片比预期的少;是您提供的更多超出了预期,而 CGImageDestination 没有区分更多和更少。

更改您的CGImageDestinationCreateWithURL 呼叫以提供您将要添加的正确数量的图像。鉴于您问题中的代码,这应该是source.count

【讨论】:

  • 好吧,既然这解决了,我会给你赏金。现在,当我尝试添加 1024x1024 图像时,它显示 "ImageIO: _CGImagePluginWriteICNS unsupported image size (1024 x 1024) - scaling factor: 1"
  • 我必须等待 10 个小时才能授予你赏金,然后:)
  • @Korion:IconFamily 图像中的 1024 像素 @ 1x 元素自 Mountain Lion 起已弃用。它们应添加为 512 点 @ 2x(相同的像素大小,但标记为 512 @ 2x 而不是 1024 @ 1x)。
  • 哦,好的!愚蠢的问题,但是如何标记图像?
  • @Korion:你不知道。您可以通过将 1024 像素图像的点大小设置为 512 x 512 来做到这一点; CGImageDestination 的 IconFamily 编写器将从像素大小与点大小的比率推断出正确的缩放因子/分辨率。
【解决方案2】:

经过-TIFFRepresentationCGImageSource 是高度迂回的。请改用the CGImageForProposedRect:context:hints: method

【讨论】:

  • 是的,我看到您在stackoverflow.com/questions/2548059/… 中提到了这一点,将修改我的代码。
  • @Korion:请编辑您的问题以显示您修改后的代码以及由此产生的结果。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
相关资源
最近更新 更多