最近在优化广告SDK,有需求把下载的大图展示出来,不能太影响性能。
参考官方文档Image and Graphics Best Practices
- (UIImage *)downThumbNailImgUrl:(NSURL *)imgURL
toPointSize:(CGSize)pointSize
scale:(CGFloat)scale {
CFStringRef key[1];
key[0] = kCGImageSourceShouldCache;
CFTypeRef value[1];
value[0] = (CFTypeRef)kCFBooleanFalse;
CFDictionaryRef imageSourceOption = CFDictionaryCreate(NULL,
(const void **) key,
(const void **) value,
1,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CGImageSourceRef imageSourceRef = CGImageSourceCreateWithURL((__bridge CFURLRef)imgURL, imageSourceOption);
CFMutableDictionaryRef mutOption = CFDictionaryCreateMutable(NULL,
4,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CGFloat maxDimension = MAX(pointSize.width, pointSize.height) * scale;
NSNumber *maxDimensionNum = [NSNumber numberWithFloat:maxDimension];
// · kCGImageSourceCreateThumbnailFromImageAlways
//这个选项控制是否生成缩略图(没有设为true的话 kCGImageSourceThumbnailMaxPixelSize 以及 CGImageSourceCreateThumbnailAtIndex不会起作用)默认为false,所以需要设置为true
CFDictionaryAddValue(mutOption, kCGImageSourceCreateThumbnailFromImageAlways, kCFBooleanTrue);//
// · kCGImageSourceShouldCacheImmediately
// 是否在创建图片时就进行解码(当然要这么做,避免在渲染时解码占用cpu)并缓存,
/* Specifies whether image decoding and caching should happen at image creation time.
* The value of this key must be a CFBooleanRef. The default value is kCFBooleanFalse (image decoding will
* happen at rendering time). //默认为不缓存,在图片渲染时进行图片解码
*/
CFDictionaryAddValue(mutOption, kCGImageSourceShouldCacheImmediately, kCFBooleanTrue);
// · kCGImageSourceCreateThumbnailWithTransform
//指定是否应根据完整图像的方向和像素纵横比旋转和缩放缩略图
/* Specifies whether the thumbnail should be rotated and scaled according
* to the orientation and pixel aspect ratio of the full image.(默认为false
*/
CFDictionaryAddValue(mutOption, kCGImageSourceCreateThumbnailWithTransform, kCFBooleanTrue);
// · kCGImageSourceThumbnailMaxPixelSize
/* Specifies the maximum width and height in pixels of a thumbnail. If
* this this key is not specified, the width and height of a thumbnail is
* not limited and thumbnails may be as big as the image itself. If
* present, this value of this key must be a CFNumberRef. */
CFDictionaryAddValue(mutOption, kCGImageSourceThumbnailMaxPixelSize, (__bridge CFNumberRef)maxDimensionNum);
CFDictionaryRef dowsamplingOption = CFDictionaryCreateCopy(NULL, mutOption);
CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(imageSourceRef, 0, dowsamplingOption);
return [UIImage imageWithCGImage:imageRef];
}







网友评论