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 相比 - 这东西显示图像的缩略图比我滚动的速度更快。

有人对如何比我现在做的更好地处理这个问题有一些建议吗?

换句话说,我的问题是我想要一个超快的用户体验。我相信实现这一点的方法是将内容预加载到 CALayers(这可能是错误的?我尝试了 NSImageView 和一些 IK-stuff,但至少 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 回答