1

これは私の画像サイズ変更コードです:

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 はそれよりも優れています)。

4

2 に答える 2

2

ImageKit はCGImageSourceCreateThumbnailAtIndex()、画像ファイル全体を読み込むのではなく、目的の画像をすばやく取得するために使用している可能性があります。

于 2011-01-31T10:33:21.307 に答える
1

ここ:

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

あとは画像をそのまま使います。

アプリが遅い理由については、Instruments の下で実行してください。これにより、使用するプロセッサ時間の大部分をどこで費やしているかが具体的にわかります。結局のところ、それはスケーリング コードには含まれていない可能性があります。

*10.6 以降、これらのメッセージは何の役にも立たず廃止されているため、Snow Leopard 以降が必要な場合は省略できます。

于 2011-01-31T01:19:08.010 に答える