生成符合图片大小及长宽限制的缩略图片
2017-03-15 10:51
363 查看
iOS中,经常需要在列表显示图片的缩略图。在分享图片到微信和QQ好友时,不仅有长宽限制,而且有大小限制。
本函数使用大小缩小,JPEG压缩的方式,递归生成符合指定大小,长宽限制的UIImage缩略图。
其中:
的compressRatio参数,由1变为0,表示逐渐加大压缩比,0的压缩比最高,得到的图片大小最小。
虽然是递归操作,但是根据参数的限制,在生成分享到微信的缩略图时,基本上不会出现3次以上的递归,效率还是OK的。
本函数使用大小缩小,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的。
相关文章推荐
- Winform 利用ThoughtWorks.QRCode 生成二维码,并另存为二维码图片(限制大小)
- 限制图片 大小 生成等比例缩略图 asp.net和js代码
- 真正生成高质量不变形缩略图片
- JS限制上传图片大小不使用控件在本地实现
- iphone中用屏幕中的元素生成缩略图片
- 解除spring-boot上传图片大小的限制
- javascript 限制上传图片大小
- 缩放图像(按比例),生成指定大小,图片不变型
- 生成规定大小的图片(缩略图生成)
- KindEditor 修改多图片上传显示限制大小和张数
- 生成规格大小的图片,质量压缩
- js图片大小限制,设置
- PHP动态生成指定大小随机图片的方法
- 用GD库生成高质量的缩略图片[转载]
- php生成不同大小的图片
- 图片大小自动缩略 显示
- 在ASP.NET MVC下实现单个图片上传, 客户端服务端双重限制图片大小和格式, 服务端裁剪图片
- javascript: 改变和控制显示的图片大小(保持比例,同时可限制高宽)
- jquery图片上传判断图片的大小,限制图片的上传大小
- 修改KindEditor图片批量上传数量和大小限制