iOS微信朋友圈图片处理策略
最近看了一篇微信朋友圈图片处理的博客, 我用代码简单的实现了一下,大家如果发现有不对的地方, 还请指正
压缩效果还不错,在保证能看清的前提下,极大的缩小了图片大小
具体算法:
1: 宽高均小于1280的, 不做处理;
2: 宽高均大于1280,
2.1:宽高比大于2 既W > 2H,取 H = 1280, W等比缩放;
2.2:高宽比大于2 既W < 0.5H, 取 W = 1280, H等比缩放;
2.3:宽高比介于 0.5到2之间,取宽或者高 为1280, 另一边等比缩放;
3:宽或者高大于1280;
3.1:宽高比大与2(宽图) 或者小于0.5(长图) 大小不变, 可以做压缩图片质量;
3.2:宽大于高, 取较大值W = 1280, H等比压缩;
3.3:高大于宽, 去较大值H = 1280. W等比压缩;
一般取压缩质量为0.5即可,既
[NSUtil imageWithOriginalImage:image quality:0.5];
注:一下方法都写在NSUtil这个工具类里, 里面还有很多其他的方法,喜欢的同学可以去我的GitHub上下载.在Util那个文件下
具体实现代码如下:
#pragma mark - 图片
/** 压缩图片*/
+ (UIImage *)imageWithOriginalImage:(UIImage *)image{
// 宽高比
CGFloat ratio = image.size.width/image.size.height;
// 目标大小
CGFloat targetW = 1280;
CGFloat targetH = 1280;
// 宽高均 <= 1280,图片尺寸大小保持不变
if (image.size.width<1280 && image.size.height<1280) {
return image;
}
// 宽高均 > 1280 && 宽高比 > 2,
else if (image.size.width>1280 && image.size.height>1280){
// 宽大于高 取较小值(高)等于1280,较大值等比例压缩
if (ratio>1) {
targetH = 1280;
targetW = targetH * ratio;
}
// 高大于宽 取较小值(宽)等于1280,较大值等比例压缩 (宽高比在0.5到2之间 )
else{
targetW = 1280;
targetH = targetW / ratio;
}
}
// 宽或高 > 1280
else{
// 宽图 图片尺寸大小保持不变
if (ratio>2) {
targetW = image.size.width;
targetH = image.size.height;
}
// 长图 图片尺寸大小保持不变
else if (ratio<0.5){
targetW = image.size.width;
targetH = image.size.height;
}
// 宽大于高 取较大值(宽)等于1280,较小值等比例压缩
else if (ratio>1){
targetW = 1280;
targetH = targetW / ratio;
}
// 高大于宽 取较大值(高)等于1280,较小值等比例压缩
else{
targetH = 1280;
targetW = targetH * ratio;
}
}
// 注:这些方法是NSUtil这个工具类里的
image = [[NSUtil alloc] imageCompressWithImage:image targetHeight:targetH targetWidth:targetW];
return image;
}
/** 重绘*/
- (UIImage *)imageCompressWithImage:(UIImage *)sourceImage targetHeight:(CGFloat)targetHeight targetWidth:(CGFloat)targetWidth
{
// CGFloat targetHeight = (targetWidth / sourceImage.size.width) * sourceImage.size.height;
UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight));
[sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
/** 压缩图片 压缩质量 0 -- 1*/
+ (UIImage *)imageWithOriginalImage:(UIImage *)image quality:(CGFloat)quality{
UIImage *newImage = [self imageWithOriginalImage:image];
NSData *imageData = UIImageJPEGRepresentation(newImage, quality);
return [UIImage imageWithData:imageData];
}
/** 压缩图片成Data*/
+ (NSData *)dataWithOriginalImage:(UIImage *)image{
return UIImageJPEGRepresentation([self imageWithOriginalImage:image], 1);
}