开发的同志们对图片压缩都不陌生,几乎涵盖所有的APP中,
最常见的图片上传也要求我们做压缩,对图片的大小做控制,比如2M以内,
800*1280等
1、图片的“压”和“缩”概念
“压” 是指文件体积变小,但是像素数不变,长宽尺寸不变,那么质量可能下降。
“缩” 是指文件的尺寸变小,也就是像素数减少,而长宽尺寸变小,文件体积同样会减小。
2、图片的压处理
对于“压”的功能,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法实现。
这里我也分了三种关于图片画质的压
1)图片大于2M的,将压缩系数调整到0.7
2)图片在0.5M<image<2M,将压缩系数调整到0.8
3)图片小于0.5M,压缩系数可以写0.9或者1,我这里小于0.5的不压
注意:系数不要写的太小,会失真严重
-(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
//进行图像的画面质量压
NSData *data=UIImageJPEGRepresentation(sourceImage, 1.0);
//
if (data.length>512*1024) {
if (data.length>2 * 1024*1024) {//2M以及以上
data=UIImageJPEGRepresentation(newImage, 0.7);
}else {//0.5M-2M
data=UIImageJPEGRepresentation(newImage, 0.8);
}
}else {
//data=UIImageJPEGRepresentation(newImage, 0.9);
data=UIImageJPEGRepresentation(newImage, 1.0);
}
return data;
}
3、图片的缩处理
这里我将图片分为三种情况进行处理
1)宽高均大于1280,取较大值等于1280,较大值等比例压缩
2)宽或高一个大于1280,取较大的等于1280,较小的等比压缩
3)宽高均小于1280,压缩比例不变
对于缩的处理,图片是不会失真的,只是变小而已。
-(UIImage *)zipScaleWithImage:(UIImage *)sourceImage{
//进行图像尺寸的压缩
CGSize imageSize = sourceImage.size;//取出要压缩的image尺寸
CGFloat width = imageSize.width; //图片宽度
CGFloat height = imageSize.height; //图片高度
//1.宽高大于1280(宽高比不按照2来算,按照1来算)
if (width>1280||height>1280) {
if (width>height) {
CGFloat scale = height/width;
width = 1280;
height = width*scale;
}else{
CGFloat scale = width/height;
height = 1280;
width = height*scale;
}
//2.宽大于1280高小于1280
}else if(width>1280||height<1280){
CGFloat scale = height/width;
width = 1280;
height = width*scale;
//3.宽小于1280高大于1280
}else if(width<1280||height>1280){
CGFloat scale = width/height;
height = 1280;
width = height*scale;
//4.宽高都小于1280
}else{
}
//进行尺寸重绘
// UIGraphicsBeginImageContext(CGSizeMake(width, height));
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, [UIScreen mainScreen].scale);//强烈建议使用这种方法
[sourceImage drawInRect:CGRectMake(0,0,width,height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
4、图片的压缩
将压和缩结合在一起
-(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
//进行图像尺寸的压缩
CGSize imageSize = sourceImage.size;//取出要压缩的image尺寸
CGFloat width = imageSize.width; //图片宽度
CGFloat height = imageSize.height; //图片高度
//1.宽高大于1280(宽高比不按照2来算,按照1来算)
if (width>1280||height>1280) {
if (width>height) {
CGFloat scale = height/width;
width = 1280;
height = width*scale;
}else{
CGFloat scale = width/height;
height = 1280;
width = height*scale;
}
//2.宽大于1280高小于1280
}else if(width>1280||height<1280){
CGFloat scale = height/width;
width = 1280;
height = width*scale;
//3.宽小于1280高大于1280
}else if(width<1280||height>1280){
CGFloat scale = width/height;
height = 1280;
width = height*scale;
//4.宽高都小于1280
}else{
}
//UIGraphicsBeginImageContext(CGSizeMake(width, height));
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, [UIScreen mainScreen].scale);//强烈建议使用这种方法
[sourceImage drawInRect:CGRectMake(0,0,width,height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//进行图像的画面质量压缩
NSData *data=UIImageJPEGRepresentation(newImage, 1.0);
if (data.length>512*1024) {
if (data.length>2 * 1024*1024) {//2M以及以上
data=UIImageJPEGRepresentation(newImage, 0.7);
}else {//0.5M-2M
data=UIImageJPEGRepresentation(newImage, 0.8);
}
}else{
//data=UIImageJPEGRepresentation(newImage, 0.9);
data=UIImageJPEGRepresentation(newImage, 1.0);
}
return data;
}
网友评论