通过使用低分辨率图像,然后稍后交换高分辨率图像,加快UIImagePickerController的速度



有一个关于从相机选择器加载图像的很棒的wiki。这让我意识到以全分辨率拍摄图像的成本。

现在,当照片被拾取时,我按下一个新的视图控制器,以全分辨率显示图像。推视图是一种非常缓慢和波动的体验(大约每秒1帧!),我想把它平滑下来。与在Instagram上挑选照片相比,我注意到他们使用的是低分辨率的图像,然后交换完整的图像。(我需要全分辨率的图像,因为用户应该能够缩放和平移)

我想要的想法是这样的:

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
UIImage* fullImage = [info objectForKey:UIImagePickerControllerOriginalImage];
// Push a view controller and give it the image.....
}
- (void) viewDidLoad {
CGSize smallerImageSize = _imageView.bounds;
UIImage* smallerImage = [MyHelper quickAndDirtyImageResize:_fullImage     
toSize:smallerImageSize];
// Set the low res image for now... then later swap in the high res
_imageView.image = smallerImage;
// Swap in high res image async
// This is the part im unsure about... Im sure UIKit isn't thread-safe!
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, NULL), ^{
_imageView.image = _fullImage;
});
}

我认为UIImage在使用之前不会被内存映射。因此,它不会放慢速度,直到它被赋予imageView。这是正确的吗?

我认为图像解码已经由系统异步完成,然而,它在加载时会大大减慢手机的速度。

有没有一种方法可以执行在低优先级后台队列中显示图像所需的一些工作?

您正试图以最复杂的方式做事:)为什么不在按下视图控制器并将其传递给他们之前先准备好小图像呢?看看这个代码:

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
UIImage *fullImage = [info objectForKey:UIImagePickerControllerOriginalImage];
UIImage *smallImage = [fullImage imageScaledToSize:self.view.bounds];
// Push a view controller and give it BOTH images
}
// And in your pushed view controller
- (void)viewDidLoad
{
_imageView.image = self.smallImage;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
_imageView.image = self.fullImage;
}

最重要的是,viewDidAppear:将在动画完成后立即调用,因此您可以在这里切换图像,而无需担心。

除了Andrey的答案外,使用CGImageSourceCreateThumbnailAtIndex代替imageScaledToSize。事实上,相册中使用的任何图像都有可能(我很确定是这样)已经有了缩略图。因此,与其麻烦于图像本身,不如获取现有的缩略图并显示它,然后使用Andrey的代码切换主图像。通过这种方式,可以在动画期间尽可能少地执行工作。

调用CGImageSourceCreateThumbnailAtIndex将返回缩略图,无论它已经存在还是需要生成。因此,它使用起来非常安全,而且可能至少和imageScaledToSize一样快。

您可以在Apple文档中找到完整的代码示例来使用它,无需在此处重复。

您是否尝试过使用ALAssetsLibrary加载该图像的缩略图,而不是尝试以全分辨率加载图像?它也比调整大小更快。

最新更新