defaultRepresentation fullScreenImage на ALAsset не возвращает полноэкранное изображение
В моем приложении я сохраняю изображения в альбом как ресурсы. Я также хочу получить их и отобразить в полноэкранном режиме. Я использую следующий код:
ALAsset *lastPicture = [scrollArray objectAtIndex:iAsset];
ALAssetRepresentation *defaultRep = [lastPicture defaultRepresentation];
UIImage *image = [UIImage imageWithCGImage:[defaultRep fullScreenImage]
scale:[defaultRep scale] orientation:
(UIImageOrientation)[defaultRep orientation]];
Проблема в том, что возвращаемое изображение равно нулю. Я прочитал на ALAssetRepresentation
ссылка на то, что когда изображение не подходит, оно возвращается ноль.
Я положил это изображение на UIImageView
который имеет размер экрана iPad. Мне было интересно, если вы могли бы помочь мне с этим вопросом?
Заранее спасибо.
1 ответ
Я не фанат fullScreenImage или fullResolutionImage. Я обнаружил, что, когда вы делаете это с несколькими активами в очереди, даже если вы немедленно выпускаете UIImage, использование памяти резко возрастет, а это не должно происходить. Кроме того, при использовании fullScreenImage или fullResolutionImage возвращаемый UIImage все еще сжимается, что означает, что он будет распакован перед первым рисованием, то есть в главном потоке, который заблокирует ваш пользовательский интерфейс.
Я предпочитаю использовать этот метод.
-(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
});
});