一同养成写作习气!这是我参加「日新计划 4 月更文挑战」的第27天,点击检查活动详情。
前语
紧缩原理:找出那些重复呈现的字符串,然后用更短的符号替代,达到缩短字符串的意图。
比方,一篇文章大量运用”#公众号::iOS逆向“这个词语,咱们用”iOS”替代,就缩短了6个字符,假设用”i”替代,就缩短了8个字符。
事实上,只需保证对应联系,可以用恣意字符替代那些重复呈现的字符串。
本质上,
所谓"紧缩"便是找出文件内容的概率分布,将那些呈现概率高的部分替代成更短的方法。
所以,内容越是重复的文件,就可以紧缩地越小。
比方,”ABABABABABABAB”可以紧缩成”7AB”。
I 图片紧缩的两种方法
- 质量紧缩:即丢失图片的质量为代价,巨细(长宽尺度)不变;
UIImageJPEGRepresentation(image, 0.0);//JPEG
NSData * imageData = UIImagePNGRepresentation(image);
`
//引荐运用png 因为`PNG:0x89 image/png ,紧缩比没有 JPG 高,可是无损紧缩,解紧缩功能高,苹果引荐的图画格局!
- 像素紧缩(份额紧缩):通过削减长宽方向的像素数量;
[sourceImage drawInRect:CGRectMake(0,0,targetWidth, targetHeight)] ;
本文的紧缩方案:质量紧缩(0.5) 结合份额紧缩(1028):
1、质量紧缩的份额(质量紧缩运用系统APIUIImageJPEGRepresentation) 2、份额紧缩运用:drawInRect
II、 处理紧缩之后图片含糊的问题
含糊的问题的大部分原因:运用第三方框架,(比方QMUIKit),在挑选相册预览的时分,就把图片紧缩了很含糊了。
应用场景:针对协议类型这种大图
2.1、假设是摄影,可以紧缩一下分辨率,否则上传很慢
不必运用预览图进行上传
// [self imgUpLoad:imageAsset.previewImage Max:1 Index:1];
[self imgUpLoad:imageAsset.originImage Max:1 Index:1];
假设是摄影,可以紧缩一下分辨率,否则上传很慢
return [self imageCompressForSize:image targetSize:size];
摄影紧缩分辨率的比如
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
//当挑选的类型是图片
if ([type isEqualToString:@"public.image"])
{
UIImage *image1 = [info objectForKey:UIImagePickerControllerOriginalImage];
image1 = [ControlManager image:image1 scaleToSize:CGSizeMake(1000, 1200)];// 紧缩分辨率 便于上传
[picker dismissViewControllerAnimated:YES completion:nil];
[SVProgressHUD showWithStatus:@"上传中.." maskType:SVProgressHUDMaskTypeGradient];
[self imgUpLoad:image1 Max:1 Index:1];
}
}
2.2、 质量紧缩(0.5) 结合份额紧缩(1028)
用法
NSData * imageData = UIImageJPEGRepresentation( [image compressWithTargetPixel:1028], k_UIImageJPEGRepresentationcompressionQuality);
质量紧缩的份额
(质量紧缩运用系统API
UIImageJPEGRepresentation
)
#define k_UIImageJPEGRepresentationcompressionQuality 0.5
份额紧缩的代码
- (UIImage *)compressWithTargetPixel:(NSUInteger)targetPx {
UIImage *newImage = nil;
CGSize imageSize = self.size;
CGFloat width = imageSize.width * self.scale;
CGFloat height = imageSize.height * self.scale;
// 是否重绘
BOOL drawImge = NO;
// 紧缩后的尺度
CGFloat scaleFactor = 0.0;
CGFloat scaledWidth = targetPx;
CGFloat scaledHeight = targetPx;
// 1. 图片宽高均 ≤ 参照像素,图片尺度保持不变
if (width <= targetPx && height <= targetPx) {
newImage = self;
}
// 2. 宽或高均 > 参照像素
else if (width > targetPx && height > targetPx) {
drawImge = YES;
CGFloat factor = width / height;
if (factor <= 2) {
// 2.1 图片宽高比 ≤ 2,则将图片宽或许高取大的等比紧缩至1280px
if (width > height) {
scaleFactor = targetPx / width;
} else {
scaleFactor = targetPx / height;
}
} else {
// 2.2 图片宽高比 > 2时,则宽或许高取小的等比紧缩至1280px
if (width > height) {
scaleFactor = targetPx / height;
} else {
scaleFactor = targetPx / width;
}
}
}
// 3. 宽高一个 >= 1280px,另一个 < 1280px; 宽 >= 1280
else if (width >= targetPx && height < targetPx ) {
if (width / height > 2) {
newImage = self;
} else {
drawImge = YES;
scaleFactor = targetPx / width;
}
}
// 4. 宽高一个 >= 1280px,另一个 < 1280px 高 >= 1280
else if (width < targetPx && height >= targetPx) {
if (height / width > 2) {
newImage = self;
} else {
drawImge = YES;
scaleFactor = targetPx / height;
}
}
if (drawImge == YES) {
scaledWidth = width * scaleFactor;
scaledHeight = height * scaleFactor;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(scaledWidth/self.scale, scaledHeight/self.scale), YES, [UIScreen mainScreen].scale);
[self drawInRect:CGRectMake(0, 0, scaledWidth/self.scale, scaledHeight/self.scale)];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
if (newImage == nil) {
newImage = self;
}
newImage = [UIImage imageWithData:UIImageJPEGRepresentation(newImage, 0.7) scale:newImage.scale];
return newImage;
}
III 针对业务场景挑选图片格局
3.1 怎么区别不同格局的图画的
- 根据图画数据第一个字节来判别的!
// NSData+ImageContentType.m + (NSString *)sd_contentTypeForImageData:
PNG:0x89 image/png ,紧缩比没有 JPG 高,可是无损紧缩,解紧缩功能高,苹果引荐的图画格局!
JPG:0xFF image/jpeg,紧缩比最高的一种图片格局,有损紧缩!最多运用的场景,照相机!解紧缩的功能欠好!
GIF:0x47 image/gif ,序列桢动图,特色:只支撑 256 种色彩!最盛行的时分在 1998~1999,有专利的!
3.2 运用场景分析
3.2.1 JPEG/JPG
- 特色:有损紧缩、体积小、不支撑通明
- 运用场景:色彩丰厚的照片,JPG是通用的挑选,如大的背景图、轮播图或Banner图。
3.2.2 PNG
- 特色:无损紧缩、质量高、体积大、支撑通明。
- 运用场景:通明图片的业务场景,如小的Logo、色彩简略且对比激烈的图片或背景。
3.2.3 SVG
- 特色:文本文件、体积小、不失真、兼容性好、无需多端、多分辨率适配、较强的交互特性、烘托成本比较高。
- 运用场景:图片色彩相对简略的业务场景。
3.2.4 Base64
- 特色:文本文件、依靠编码,Base64编码后,图片巨细会膨胀为原文件的4/3。
- 运用场景:小图标(<8KB)处理方案。
3.2.5 WebP
- 特色:WebP图片是一种新的图画格局,由Google开发。与png、jpg比较,相同的视觉体验下,WebP图画的尺度缩小了大约30%。另外,WebP图画格局还支撑有损紧缩、无损紧缩、通明和动画,但有兼容性问题。
- 运用场景:图片占较大的商场类网站,现在Google、Facebook、ebay、淘宝、腾讯、美团等现已在用。
“翻开淘宝网,假设你是chrome浏览器,你会发现,一切图片都是webp结尾的,淘宝网图片运用了webp。假设你是safari浏览器,看到图片便是jpg或许png了,淘宝网自动判别浏览器支撑不支撑webp,假设支撑,则输出相应的图片格局!
img.alicdn.com/imgextra/i4…
IV see also
更多内容请检查原文或许关注公众号:iOS逆向
ZipArchive
带暗码解紧缩
4.1: NSData与UIImage之间的转换
//NSData转换为UIImage
NSData *imageData = [NSData dataWithContentsOfFile: imagePath];
UIImage *image = [UIImage imageWithData: imageData];
//UIImage转换为NSData
NSData *imageData = UIImagePNGRepresentation(aimae);
4.2 其他紧缩参考
- Luban(鲁班)—Image compression with efficiency very close to WeChat Moments/可能是最接近微信朋友圈的图片紧缩算法