2012-09-22 21 views
0

我正在研究需要浏览和显示iPhone画廊中存在的图片的项目。ALAsset库方面比率缩略图iOS4

我使用ALAssetLibrary来做到这一点。要生成缩略图,我使用“aspectRatioThumbnail”。一切工作顺利,我的3GS iOS 5平滑但这些方法在iOS4中不存在。

我尝试使用此功能手动生成缩略图比率图像,但由于内存警告而崩溃。日志告诉我,生成的图像大小不尊重给定的最大大小120的限制。

任何想法?

NSDate* firstDate = [NSDate date]; 
    uint8_t* buffer = (Byte*)malloc(_asset.defaultRepresentation.size); 

    NSUInteger length = [_asset.defaultRepresentation getBytes:buffer fromOffset:0.0 length:_asset.defaultRepresentation.size error:nil]; 

NSData* data = [[NSData alloc] initWithBytesNoCopy:buffer length:_asset.defaultRepresentation.size freeWhenDone:YES]; 
            nil]; 

     NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys: 
          (id)kCFBooleanTrue, kCGImageSourceShouldAllowFloat, 
          (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailWithTransform, 
          (id)kCFBooleanTrue, kCGImageSourceCreateThumbnailFromImageAlways, 
          [NSNumber numberWithInt:120], kCGImageSourceThumbnailMaxPixelSize, 
          nil]; 

     CGImageSourceRef sourceRef = CGImageSourceCreateWithData((CFDataRef)data, (CFDictionaryRef) options); 
     CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(sourceRef, 0, NULL); 

     CGImageRef imageRef = CGImageSourceCreateImageAtIndex(sourceRef, 0, imageProperties); 

     image = [UIImage imageWithCGImage:imageRef]; 

     NSTimeInterval tic = [[NSDate date] timeIntervalSinceDate:firstDate]; 
     NSLog(@"Thumbnail generation from ios4 method %f [size %f * %f", tic, image.size.width, image.size.height); 

     [data release]; 
     CFRelease(sourceRef); 
     CFRelease(imageRef); 
     CFRelease(imageProperties); 

回答

2

上面的代码有很多不必要的复制。相反,只需加载在屏幕分辨率(小于完整的图像大小)的图像,并从那里向缩小的缩略图:

CGImageRef img = [[asset defaultRepresentation] fullScreenImage]; 
int w = CGImageGetWidth(img); 
int h = CGImageGetHeight(img); 
float scale = 120/(float)(MAX(w, h)); 
CGSize newsize = CGSizeMake(w * scale, h * scale); 

UIGraphicsBeginImageContext(newsize); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
CGContextTranslateCTM(ctx, 0, newsize.height); 
CGContextScaleCTM(ctx, 1.0, -1.0); 
CGContextDrawImage(ctx, CGRectMake(0, 0, newsize.width, newsize.height), iref); 
UIImage* thumbnail = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

运行此代码后,缩略图将有一个UIImage这相当于aspectRatioThumbnail。