首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ALAssetLibrary aspectRatioThumbnail iOS4

ALAssetLibrary aspectRatioThumbnail iOS4
EN

Stack Overflow用户
提问于 2012-09-22 23:42:00
回答 1查看 547关注 0票数 0

我正在从事一个项目,需要浏览和显示目前在iPhone画廊的图片。

我使用ALAssetLibrary来做到这一点。为了生成缩略图,我使用了"aspectRatioThumbnail“。在我的3GS iOS 5上,一切都运行得很好、很流畅。但iOS4中不存在这些方法。

我尝试用此函数手动生成缩略图比例图像,但由于内存警告而崩溃。日志显示,生成的图像大小不符合给定的最大大小120的约束。

有什么想法吗?

代码语言:javascript
复制
    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);
EN

回答 1

Stack Overflow用户

发布于 2012-12-03 09:28:26

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

代码语言:javascript
复制
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();

运行此代码后,缩略图将具有与aspectRatioThumbnail等效的UIImage。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12545209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档