2012-07-09 1 views
6

내 응용 프로그램에서 이미지를 앨범으로 자산으로 저장합니다. 또한 검색하여 전체 화면으로 표시하려고합니다. 나는 다음과 같은 코드를 사용ALAsset의 defaultRepresentation fullScreenImage가 전체 화면 이미지를 반환하지 않습니다.

ALAsset *lastPicture = [scrollArray objectAtIndex:iAsset]; 

ALAssetRepresentation *defaultRep = [lastPicture defaultRepresentation]; 

UIImage *image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] 
              scale:[defaultRep scale] orientation: 
    (UIImageOrientation)[defaultRep orientation]]; 

문제는 반환 된 이미지가 전무 것입니다. ALAssetRepresentation 참조에서 이미지가 맞지 않을 때 nil이 리턴된다는 것을 읽었습니다.

이 이미지는 iPad 화면 크기 인 UIImageView에 넣습니다. 이 문제에 대해 저를 도울 수 있는지 궁금합니다.

미리 감사드립니다.

+0

을 모두 벌금과이 코드가 내 응용 프로그램의 모든 이미지의 벌금을 제공 일하는 모습이 코드에서. 검색된 자산이 무효이거나이 코드가 아닌 코드에 문제가 있다고 말할 수 있습니다. –

답변

8

저는 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 
    }); 
}); 
관련 문제