Objective c ALAsset上的defaultRepresentation fullScreenImage不返回全屏图像
在我的应用程序中,我将图像作为资产保存到相册中。我还想检索它们并全屏显示它们。我使用以下代码:Objective c ALAsset上的defaultRepresentation fullScreenImage不返回全屏图像,objective-c,ios,uiimageview,alasset,Objective C,Ios,Uiimageview,Alasset,在我的应用程序中,我将图像作为资产保存到相册中。我还想检索它们并全屏显示它们。我使用以下代码: ALAsset *lastPicture = [scrollArray objectAtIndex:iAsset]; ALAssetRepresentation *defaultRep = [lastPicture defaultRepresentation]; UIImage *image = [UIImage imageWithCGImage:[defaultRep fullScreenIm
ALAsset *lastPicture = [scrollArray objectAtIndex:iAsset];
ALAssetRepresentation *defaultRep = [lastPicture defaultRepresentation];
UIImage *image = [UIImage imageWithCGImage:[defaultRep fullScreenImage]
scale:[defaultRep scale] orientation:
(UIImageOrientation)[defaultRep orientation]];
问题是返回的图像是nil。我在ALAssetRepresentation
参考中读到,当图像不适合时,它将返回nil
我把这张图片放到一个UIImageView
上,它的大小和iPad屏幕一样。我想知道你是否能帮我解决这个问题
先谢谢你 我不喜欢fullScreenImage或fullResolutionImage。我发现,当您在队列中的多个资产上执行此操作时,即使您立即释放UIImage,内存使用量也会显著增加,而实际上不应该。另外,当使用fullScreenImage或fullResolutionImage时,返回的UIImage仍然是压缩的,这意味着它将在第一次绘制之前解压缩,因此在主线程上,这将阻止您的UI 我更喜欢用这种方法
-(UIImage *)fullSizeImageForAssetRepresentation:(ALAssetRepresentation *)assetRepresentation
{
UIImage *result = nil;
NSData *data = nil;
uint8_t *buffer = (uint8_t *)malloc(sizeof(uint8_t)*[assetRepresentation size]);
if (buffer != NULL) {
NSError *error = nil;
NSUInteger bytesRead = [assetRepresentation getBytes:buffer fromOffset:0 length:[assetRepresentation size] error:&error];
data = [NSData dataWithBytes:buffer length:bytesRead];
free(buffer);
}
if ([data length])
{
CGImageSourceRef sourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)data, nil);
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:(id)kCFBooleanTrue forKey:(id)kCGImageSourceShouldAllowFloat];
[options setObject:(id)kCFBooleanTrue forKey:(id)kCGImageSourceCreateThumbnailFromImageAlways];
[options setObject:(id)[NSNumber numberWithFloat:640.0f] forKey:(id)kCGImageSourceThumbnailMaxPixelSize];
//[options setObject:(id)kCFBooleanTrue forKey:(id)kCGImageSourceCreateThumbnailWithTransform];
CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(sourceRef, 0, (__bridge CFDictionaryRef)options);
if (imageRef) {
result = [UIImage imageWithCGImage:imageRef scale:[assetRepresentation scale] orientation:(UIImageOrientation)[assetRepresentation orientation]];
CGImageRelease(imageRef);
}
if (sourceRef)
CFRelease(sourceRef);
}
return result;
}
您可以这样使用它:
// Get the full image in a background thread
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage* image = [self fullSizeImageForAssetRepresentation:asset.defaultRepresentation];
dispatch_async(dispatch_get_main_queue(), ^{
// Do something with the UIImage
});
});
从这段代码来看,一切都很好,而且在我的应用程序中也能正常工作。这段代码提供的所有图像都很好。我可以说,检索到的资产将为零,或者该代码存在一些问题,而不是此代码