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

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的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值