作者热门文章
- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我有一个后台线程加载图像并在主线程中显示它们。我注意到后台线程几乎无事可做,因为实际的图像解码似乎是在主线程中完成的:
到目前为止,我已经尝试在后台线程中调用 [UIImage imageNamed:]
、[UIImage imageWithData:]
和 CGImageCreateWithJPEGDataProvider
,但没有区别。有没有办法强制在后台线程上完成解码?
已经有 a similar question在这里,但这无济于事。正如我在那里写的那样,我尝试了以下技巧:
@implementation UIImage (Loading)
- (void) forceLoad
{
const CGImageRef cgImage = [self CGImage];
const int width = CGImageGetWidth(cgImage);
const int height = CGImageGetHeight(cgImage);
const CGColorSpaceRef colorspace = CGImageGetColorSpace(cgImage);
const CGContextRef context = CGBitmapContextCreate(
NULL, /* Where to store the data. NULL = don’t care */
width, height, /* width & height */
8, width * 4, /* bits per component, bytes per row */
colorspace, kCGImageAlphaNoneSkipFirst);
NSParameterAssert(context);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgImage);
CGContextRelease(context);
}
@end
这有效(强制图像解码),但它也会触发对 ImageIO_BGR_A_TO_RGB_A_8Bit
的明显昂贵的调用。
最佳答案
我在新的 Retina iPad 上遇到了类似的高分辨率图像问题。大于屏幕尺寸(大致)的图像会导致 UI 响应性出现重大问题。这些是 JPG,因此让它们在后台解码似乎是正确的做法。我仍在努力收紧所有这些,但汤米的解决方案对我来说效果很好。我只是想贡献一些代码来帮助下一个人,当他们试图确定为什么他们的 UI 会因大图像而卡顿时。这是我最终做的事情(此代码在后台队列的 NSOperation 中运行)。该示例混合了我的代码和上面的代码:
CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)self.data);
CGImageRef newImage = CGImageCreateWithJPEGDataProvider(dataProvider,
NULL, NO,
kCGRenderingIntentDefault);
//////////
// force DECODE
const int width = CGImageGetWidth(newImage);
const int height = CGImageGetHeight(newImage);
const CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
const CGContextRef context = CGBitmapContextCreate(
NULL, /* Where to store the data. NULL = don’t care */
width, height, /* width & height */
8, width * 4, /* bits per component, bytes per row */
colorspace, kCGImageAlphaNoneSkipFirst);
NSParameterAssert(context);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), newImage);
CGImageRef drawnImage = CGBitmapContextCreateImage(context);
CGContextRelease(context);
CGColorSpaceRelease(colorspace);
//////////
self.downloadedImage = [UIImage imageWithCGImage:drawnImage];
CGDataProviderRelease(dataProvider);
CGImageRelease(newImage);
CGImageRelease(drawnImage);
我还在优化这个。但到目前为止,它似乎做得很好。
关于iphone - 在后台线程中解码图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3904575/
我是一名优秀的程序员,十分优秀!