2011-01-30 44 views
0

這是我的圖像大小調整代碼:IKImageBrowserView如何以比我更快的速度調整圖像大小?

CALayer *newCALayer = [[CALayer layer] retain]; 
NSImage* image = [[NSImage alloc] initWithData:[NSData dataWithContentsOfFile:path]]; 
CGImageRef newCGImageFullResolution = [image CGImageForProposedRect:nil context:nil hints:nil]; 
CGContextRef context = CGBitmapContextCreate(NULL, drawRect.size.width, drawRect.size.height, 
              CGImageGetBitsPerComponent(newCGImageFullResolution), 
              CGImageGetBytesPerRow(newCGImageFullResolution), 
              CGImageGetColorSpace(newCGImageFullResolution), 
              CGImageGetAlphaInfo(newCGImageFullResolution)); 
CGContextDrawImage(context, CGRectMake(0, 0, drawRect.size.width, drawRect.size.height), newCGImageFullResolution); 
CGImageRef scaledImage = CGBitmapContextCreateImage(context); 
newCALayer.contents = (id)scaledImage; 
CGImageRelease(scaledImage); 
newCALayer.contentsGravity = kCAGravityResizeAspect; 
newCALayer.opacity = 0.0; 
newCALayer.anchorPoint = CGPointMake(0.0f,0.0f); 
newCALayer.frame = CGRectMake(0.0, 
      0.0, 
      [Singleton sharedSingleton].fullscreenRect.size.width, 
      [Singleton sharedSingleton].fullscreenRect.size.height); 
[newCALayer setAutoresizingMask:kCALayerWidthSizable | kCALayerHeightSizable]; 
//CGImageRelease(cgImageFullResolution); (bonus points if you can explain why I can't release this! I mean, I can release the scaled image ok??) 
CGContextRelease(context); 
[image release]; 

沒有,我做這一切從後臺線程以預載圖片,使我的GUI感覺瞬間。它花費了一些工作來獲得同步,並且沒有設置,所以CALayers結束了。

但我相信用於描述這種速度有多快的術語將是「它是一隻狗」。

與IKImageView相比 - 那東西比我可以滾動更快地縮小圖像的縮略圖。

有沒有人有如何處理這個問題比我現在做的更好?

換句話說,我的問題是我想要一個超快速的用戶體驗。我相信通過將事情預加載到CALayers(這可能是錯誤的?我試過NSImageView和一些IK-stuff,但至少CALayer比這更好)。

/長期讀者,第一次作家 - SO規則,我的意思是,你讓谷歌改變它的排名... omg! :)

+0

您是否需要OS X 10.5兼容性,還是僅支持10.6? (您發佈的代碼已經需要10.6,但是有助於澄清)。 – NSGod 2011-01-31 12:51:46

+0

只有10.6才行。應用程序商店中的兼容性點擊「重置」,不是嗎? :) – Torkel 2011-01-31 14:49:02

回答

1

ImageKit可能使用CGImageSourceCreateThumbnailAtIndex()快速獲取適合目標的圖像,而不是讀取整個圖像文件。

0

這裏:

NSImage *image = [[[NSImage alloc] initWithContentsOfFile:path] autorelease]; 
[image setScalesWhenResized:YES]; // * 
[image setDataRetained:YES]; // * 
[image setSize:desiredNewSize]; 

然後利用圖像,因爲它是。

至於爲什麼你的應用程序很慢,請在Instruments下運行。這會告訴你具體哪些地方花費了你使用的大部分處理器時間 - 畢竟這可能不在你的縮放代碼中。

*自10.6開始,這些消息沒有任何用處,因此不推薦使用,因此如果您需要Snow Leopard或更高版本,則可以忽略它們。

+0

謝謝你的回覆。我用這個替換了我的代碼,但速度是一樣的。出於某種原因,你的做事方式似乎只有在顯示視圖之前才能完成處理。 (所以,當視圖第一次被設置爲可見時,有一個巨大的(30秒)延遲,直到它可見)。現在就去試試樂器吧。 – Torkel 2011-01-31 09:03:15