2012-07-09 16 views
6

Trong ứng dụng của tôi, tôi lưu hình ảnh vào một album dưới dạng nội dung. Tôi cũng muốn truy xuất chúng và hiển thị chúng ở chế độ toàn màn hình. Tôi sử dụng đoạn mã sau:defaultRepresentation fullScreenImage on ALAsset không trả lại hình ảnh toàn màn hình

ALAsset *lastPicture = [scrollArray objectAtIndex:iAsset]; 

ALAssetRepresentation *defaultRep = [lastPicture defaultRepresentation]; 

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

Vấn đề là hình ảnh trở lại là nil. Tôi đã đọc tại tài liệu tham khảo ALAssetRepresentation rằng khi hình ảnh không phù hợp với nó được trả lại không.

Tôi đặt hình ảnh này vào một số UIImageView có kích thước màn hình iPad. Tôi đã tự hỏi nếu bạn có thể giúp tôi với vấn đề này?

Cảm ơn bạn trước.

+0

Từ mã này tất cả có vẻ tốt đẹp và cũng có thể làm việc trong các ứng dụng của tôi mã này cung cấp tất cả những hình ảnh tốt. Tôi có thể nói rằng các tài sản đã truy xuất sẽ là không hoặc có một số vấn đề với mã đó không phải là mã này –

Trả lời

8

Tôi không phải là người hâm mộ của fullScreenImage hoặc fullResolutionImage. Tôi thấy rằng khi bạn làm điều này trên nhiều tài sản trong một hàng đợi, ngay cả khi bạn phát hành UIImage ngay lập tức, việc sử dụng bộ nhớ sẽ tăng lên đáng kể trong khi nó không nên. Ngoài ra khi sử dụng fullScreenImage hoặc fullResolutionImage, UIImage được trả về vẫn được nén, nghĩa là nó sẽ được giải nén trước khi được rút ra lần đầu tiên, do đó trên luồng chính sẽ chặn giao diện người dùng của bạn.

Tôi thích sử dụng phương pháp này.

-(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; 
} 

Bạn có thể sử dụng nó như thế này:

// 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 
    }); 
}); 
Các vấn đề liên quan