2011-01-30 10 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と比較すると、画像のサムネイルがスクロールできるよりも速く飛び出します。

誰も私が今行っているよりも、これをよりうまく処理する方法についていくつか提案していますか?

つまり、私の問題は超高速UXを使いたいということです。私はこれを達成する方法がCALayersにプリロードすることであると信じています(これは間違っているかもしれませんか?NSImageViewといくつかのIKを試しましたが、少なくともCALayerはそれより優れています)。

/長時間読者、初回作家 - SOのルール、私はあなたがGoogleのランキングを変更したことを意味... omg! :)ここで

+0

OS X 10.5との互換性が必要ですか、または10.6のみでOKですか? (投稿したコードにはすでに10.6が必要ですが、明確にするのに役立ちます)。 – NSGod

+0

10.6のみが問題ありません。互換性に関するヒット "リセット"のアプリストアの並べ替え、いいえ? :) – Torkel

答えて

1

ImageKitはおそらくCGImageSourceCreateThumbnailAtIndex()を使用して、画像ファイル全体を読み込むのではなく、目的地に適した画像をすばやく取得します。

+0

面白い!!私はNSImageを使いたいと思っていました。なぜなら、そこにある画像ファイルの形式をちょうど読むことができるように思われるからです。しかし、CGImageSourceを介してファイルを読み込み可能な場合には、まずテストを行い、失敗した場合にはNSImageを使用してください。スピードを比較してみましょう。 – Torkel

+0

'CGImageSourceCreateThumbnailAtIndex()'が違うことを理解していることを確認してください。ポイントは、大きな画像の全体を扱わなくても済むことです。 –

+0

これは答えです。この機能は驚くほど高速です。しかし私は私の人生が何かを作ることはできませんが、それから非常にぼやけたイメージを作る。 (私は数百万にkCGImageSourceThumbnailMaxPixelSizeを入れようとしました - まだぼやけています)。また、それについて考えると、iPhotoは約0.3秒かかって画像を読み込む。画像をロードする方法の可能な組み合わせをすべてテストしたところ、画像をロードしてスケーリングするのにどれだけの時間がかかると思います。 – Torkel

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

+0

インストゥルメントはそれほど多くの情報を私に与えてくれませんでした。 CGImageを置き換えて、NSImageを使うつもりです。ここで別の提案をしています。 – Torkel

+0

@トケル:「別の提案」とはどういう意味ですか?それがこの提案です。 ☺ –

関連する問題