2012-12-26 70 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)。 –