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
});
});
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 –