gpt4 book ai didi

iphone - 在后台线程中解码图像?

转载 作者:技术小花猫 更新时间:2023-10-29 10:46:27 24 4
gpt4 key购买 nike

我有一个后台线程加载图像并在主线程中显示它们。我注意到后台线程几乎无事可做,因为实际的图像解码似乎是在主线程中完成的:

alt text

到目前为止,我已经尝试在后台线程中调用 [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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com