1

このコード (sourceNSMutableArraywithNSImageオブジェクト:

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 インスタンスがログに記録されます。

イメージIO: |エラー| 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];
    }
}
4

2 に答える 2

3

一部は解決策の推測であり、一部はコードを改善するための変更であり、それが解決策でなくても…</p>

の画像の数CGImageDestinationCreateWithURLが間違っています。追加する予定の画像の数を渡す必要があります。

ループが与えられた場合、明らかに 1つ以上の. 出力を考えると、実際には複数の画像を追加しています。

正確に 1 つの画像を追加すると言いましたが、複数の画像を追加しました。

私の推測では、エラー メッセージが不明確/過度に具体的であると思われます。エラーは言う:

CGImageDestinationFinalize イメージの宛先に十分なイメージがありません

しかし、それが意味することは次のとおりだと思います。

CGImageDestinationFinalize イメージの宛先に、約束した数とは異なる数のイメージがあります

つまり、問題は、提供した画像が予想よりも少なかったことではありません。それはあなたが予想以上に提供したことであり、CGImageDestination は多かれ少なかれ区別をしません。

呼び出しを変更して、CGImageDestinationCreateWithURL追加する正しい数の画像を提供します。質問のコードを考えると、これはsource.count.

于 2012-12-29T00:11:25.507 に答える
1

通り抜け-TIFFRepresentationCGImageSource非常にラウンドアバウトです。代わりCGImageForProposedRect:context:hints:メソッドを使用してください。

于 2012-12-28T09:01:11.250 に答える