您的位置:首页 > 产品设计 > UI/UE

生成符合图片大小及长宽限制的缩略图片

2017-03-15 10:51 363 查看
iOS中,经常需要在列表显示图片的缩略图。在分享图片到微信和QQ好友时,不仅有长宽限制,而且有大小限制。

本函数使用大小缩小,JPEG压缩的方式,递归生成符合指定大小,长宽限制的UIImage缩略图。

//Generate a preview image which conforms the defined size and scale limit
+ (UIImage *)genPreviewImageByOriginalImage:(UIImage *)sourceImage sizeLimit:(float)sizeLimit widthLimit:(float)widthLimit heightLimit:(float) heightLimit{
CGFloat width = roundf(sourceImage.size.width/sourceImage.size.height*heightLimit);
//按照最大位深32位来计算
//预估图片尺寸=图片长度*图片宽度*位深/8
float maximumWidth = sizeLimit/4/heightLimit;

if (widthLimit > width) {
width = widthLimit;
}
if (maximumWidth < width) {
width = maximumWidth;
}

UIGraphicsBeginImageContext(CGSizeMake(width, heightLimit));
[sourceImage drawInRect:CGRectMake(0, 0, width, heightLimit)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

NSData *previewImageData = UIImagePNGRepresentation(scaledImage);
QZLOG_DEBUG(@"length of previewImageData when using PNGRepresentation is %ld and using JPEGRepresentation is:%ld",[previewImageData length]);
float lengthOfImage = [previewImageData length];
if (sizeLimit < lengthOfImage) {
static float compressRatioStep = 0.2;
static float maximumQuality = 1.0;
static float lowestQuality = 0.0;
for (float compressRatio = maximumQuality;
lowestQuality <= compressRatio;
compressRatio -= compressRatioStep) {
@autoreleasepool {
previewImageData = UIImageJPEGRepresentation(scaledImage, compressRatio);
lengthOfImage = [previewImageData length];
if (sizeLimit > lengthOfImage) {
scaledImage = [UIImage imageWithData:previewImageData];
break;
}
}
}
}

if (sizeLimit < lengthOfImage) {
NSLog(@"debug preview image data length:%.2f is larger than %.2f.so reduce size again",lengthOfImage,sizeLimit);
return [self genPreviewImageByOriginalImage:scaledImage sizeLimit:sizeLimit widthLimit:widthLimit heightLimit:(heightLimit - 40)?(heightLimit - 40):40];
} else {
NSLog(@"debug preview image data length:%.2f is within length limit:%f",lengthOfImage,sizeLimit);
}

return scaledImage;
}


其中:

UIImageJPEGRepresentation(scaledImage, compressRatio);


的compressRatio参数,由1变为0,表示逐渐加大压缩比,0的压缩比最高,得到的图片大小最小。

虽然是递归操作,但是根据参数的限制,在生成分享到微信的缩略图时,基本上不会出现3次以上的递归,效率还是OK的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图片 uiimage qq