我的主要问题是我需要获取ALAsset对象的缩略图.
我尝试了很多解决方案,搜索堆栈溢出了几天,由于这些限制,我发现的所有解决方案对我来说都不工作:
>我不能使用默认的缩略图,因为它太少了;
>我不能使用全屏或全分辨率图像,因为我有很多图像在屏幕上;
>我不能使用UIImage或UIImageView来调整大小,因为这些负载
全分辨率图像
>我无法加载内存中的图像,我正在使用20Mpx的图像;
>我需要创建200×200 px版本的原始资源来加载屏幕;
这是我的代码的最后一次迭代:
#import <AssetsLibrary/ALAsset.h> #import <ImageIO/ImageIO.h> // ... ALAsset *asset; // ... ALAssetRepresentation *assetRepresentation = [asset defaultRepresentation]; NSDictionary *thumbnailOptions = [NSDictionary dictionaryWithObjectsAndKeys: (id)kcfBooleanTrue,kCGImageSourceCreateThumbnailWithTransform,(id)kcfBooleanTrue,kCGImageSourceCreateThumbnailFromImageAlways,(id)[NSNumber numberWithFloat:200],kCGImageSourceThumbnailMaxPixelSize,nil]; CGImageRef generatedThumbnail = [assetRepresentation CGImageWithOptions:thumbnailOptions]; UIImage *thumbnailImage = [UIImage imageWithCGImage:generatedThumbnail];
问题是,所产生的CGImageRef既不是通过方向变换的,也不是指定的最大像素大小;
我也试图找到一种使用CGImageSource调整大小的方法,但是:
>资源网址不能用于CGImageSourceCreateWithURL:
>我无法从ALAsset或ALAssetRepresentation中提取一个CGDataProviderRef以用于CGImageSourceCreateWithDataProvider:;
> CGImageSourceCreateWithData:要求我将fullResolution或全屏资源存储在内存中才能工作.
我错过了什么吗?
有没有另一种获取ALAsset或ALAssetRepresentation的缩略图的方法,我失踪了?
提前致谢.
解决方法
您可以使用CGImageSourceCreateThumbnailAtIndex从潜在的大型图像源创建一个小图像.您可以使用ALAssetRepresentation的getBytes:fromOffset:length:error:method从磁盘加载映像,并使用它来创建CGImageSourceRef.
然后,您只需要将kCGImageSourceThumbnailMaxPixelSize和kCGImageSourceCreateThumbnailFromImageAlways选项传递给您创建的图像源的CGImageSourceCreateThumbnailAtIndex,并且它将为您创建一个较小的版本,而无需将庞大的版本加载到内存中.