開發(fā)的同志們對圖片壓縮都不陌生,幾乎涵蓋所有的APP中,
最常見的圖片上傳也要求我們做壓縮,對圖片的大小做控制,比如2M以內(nèi),
800*1280等
1、圖片的“壓”和“縮”概念
“壓” 是指文件體積變小,但是像素?cái)?shù)不變,長寬尺寸不變,那么質(zhì)量可能下降。
“縮” 是指文件的尺寸變小,也就是像素?cái)?shù)減少,而長寬尺寸變小,文件體積同樣會(huì)減小。
2、圖片的壓處理
對于“壓”的功能,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法實(shí)現(xiàn)。
這里我也分了三種關(guān)于圖片畫質(zhì)的壓
1)圖片大于2M的,將壓縮系數(shù)調(diào)整到0.7
2)圖片在0.5M<image<2M,將壓縮系數(shù)調(diào)整到0.8
3)圖片小于0.5M,壓縮系數(shù)可以寫0.9或者1,我這里小于0.5的不壓
注意:系數(shù)不要寫的太小,會(huì)失真嚴(yán)重
-(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
//進(jìn)行圖像的畫面質(zhì)量壓
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、圖片的縮處理
這里我將圖片分為三種情況進(jìn)行處理
1)寬高均大于1280,取較大值等于1280,較大值等比例壓縮
2)寬或高一個(gè)大于1280,取較大的等于1280,較小的等比壓縮
3)寬高均小于1280,壓縮比例不變
對于縮的處理,圖片是不會(huì)失真的,只是變小而已。
-(UIImage *)zipScaleWithImage:(UIImage *)sourceImage{
//進(jìn)行圖像尺寸的壓縮
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{
}
//進(jìn)行尺寸重繪
// UIGraphicsBeginImageContext(CGSizeMake(width, height));
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, [UIScreen mainScreen].scale);//強(qiáng)烈建議使用這種方法
[sourceImage drawInRect:CGRectMake(0,0,width,height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
4、圖片的壓縮
將壓和縮結(jié)合在一起
-(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
//進(jìn)行圖像尺寸的壓縮
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);//強(qiáng)烈建議使用這種方法
[sourceImage drawInRect:CGRectMake(0,0,width,height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//進(jìn)行圖像的畫面質(zhì)量壓縮
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;
}