iOS圖片壓縮,想必這是一個(gè)比較大切值得深入的一個(gè)研究日裙。所以太深入的這里我也不會(huì)去講,之所以寫(xiě)這篇惰蜜,是因?yàn)槲覀冊(cè)陂_(kāi)發(fā)中昂拂,因?yàn)閕phone拍照后,直接上傳的圖片大多數(shù)像素比較高抛猖,尺寸比較大格侯,一般都在2-3M,所以在手機(jī)上傳财著,用戶(hù)等待時(shí)間過(guò)于長(zhǎng)联四,同時(shí)因?yàn)樽鳛槭謾C(jī)展示的產(chǎn)品圖,也并不需要太高清晰的圖片撑教。所以產(chǎn)品要求控制圖片在500KB以下朝墩。故我寫(xiě)了一個(gè)簡(jiǎn)單的算法以供大家參考。
寫(xiě)這個(gè)算法前伟姐,公司的安卓同事收苏,告訴我可以參看下安卓有一個(gè)現(xiàn)成的luban算法。于是我去搜索了一下玫镐,感覺(jué)過(guò)于麻煩倒戏。有興趣的同學(xué)可以搜索一下怠噪,這里貼一個(gè)介紹的鏈接:
http://blog.csdn.net/wenyiqingnianiii/article/details/52469342
在這之前恐似,我有搜到一篇簡(jiǎn)單的對(duì)微信圖片壓縮的博文:
http://blog.csdn.net/u014220518/article/details/58136932
這篇是已1280為界,來(lái)對(duì)圖片進(jìn)行尺寸的等比壓縮的傍念。但是他有一個(gè)2的系數(shù)矫夷,我不太明白這個(gè)是從何而來(lái),所以憋槐,在我的簡(jiǎn)單算法中1280為界双藕,但是沒(méi)有用他的1這個(gè)系數(shù)。如果有研究的童鞋阳仔,可以告知這個(gè)2是什么忧陪。接下來(lái),先對(duì)圖片的壓縮進(jìn)行分解介紹。
1.圖片壓縮的概念理解
既然對(duì)圖片壓縮嘶摊,那么從文字來(lái)分析:
“壓” 是指文件體積變小延蟹,但是像素?cái)?shù)不變,長(zhǎng)寬尺寸不變叶堆,那么質(zhì)量可能下降阱飘。
“縮” 是指文件的尺寸變小,也就是像素?cái)?shù)減少虱颗,而長(zhǎng)寬尺寸變小沥匈,文件體積同樣會(huì)減小。
所以忘渔,在寫(xiě)算法的時(shí)候也會(huì)將圖片分解為這兩部分來(lái)處理高帖。
2.圖片的壓縮處理
2.1圖片的縮處理
我這里首先用的是縮的處理。
這里我將圖片分為三種情況進(jìn)行處理
1)寬高均大于1280畦粮,取較大值等于1280棋恼,較大值等比例壓縮
2)寬或高一個(gè)大于1280,取較大的等于1280锈玉,較小的等比壓縮
3)寬高均小于1280爪飘,壓縮比例不變
對(duì)于縮的處理,圖片是不會(huì)失真的拉背,只是變小而已师崎。
+(UIImage *)zipScaleWithImage:(UIImage *)sourceImage{
//進(jìn)行圖像尺寸的壓縮
CGSize imageSize = sourceImage.size;//取出要壓縮的image尺寸
CGFloat width = imageSize.width; //圖片寬度
CGFloat height = imageSize.height; //圖片高度
//1.寬高大于1280(寬高比不按照2來(lái)算,按照1來(lái)算)
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));
[sourceImage drawInRect:CGRectMake(0,0,width,height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
2.2圖片的壓處理
對(duì)于“壓”的功能椅棺,使用的UIImageJPEGRepresentation或UIImagePNGRepresentation方法實(shí)現(xiàn)犁罩。
這里我也分了三種關(guān)于圖片畫(huà)質(zhì)的壓縮
1)圖片大于1M的,將壓縮系數(shù)調(diào)整到0.7
2)圖片在0.5M<image<1M,將壓縮系數(shù)調(diào)整到0.8
3)圖片小雨0.5M两疚,壓縮系數(shù)可以寫(xiě)0.9或者1
+(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
//進(jìn)行圖像的畫(huà)面質(zhì)量壓縮
NSData *data=UIImageJPEGRepresentation(sourceImage, 1.0);
if (data.length>100*1024) {
if (data.length>1024*1024) {//1M以及以上
data=UIImageJPEGRepresentation(newImage, 0.7);
}else if (data.length>512*1024) {//0.5M-1M
data=UIImageJPEGRepresentation(newImage, 0.8);
}else if (data.length>200*1024) {
//0.25M-0.5M
data=UIImageJPEGRepresentation(newImage, 0.9);
}
}
return data;
}
兩段結(jié)合起來(lái)
+(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
//進(jìn)行圖像尺寸的壓縮
CGSize imageSize = sourceImage.size;//取出要壓縮的image尺寸
CGFloat width = imageSize.width; //圖片寬度
CGFloat height = imageSize.height; //圖片高度
//1.寬高大于1280(寬高比不按照2來(lái)算床估,按照1來(lái)算)
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));
[sourceImage drawInRect:CGRectMake(0,0,width,height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//進(jìn)行圖像的畫(huà)面質(zhì)量壓縮
NSData *data=UIImageJPEGRepresentation(newImage, 1.0);
if (data.length>100*1024) {
if (data.length>1024*1024) {//1M以及以上
data=UIImageJPEGRepresentation(newImage, 0.7);
}else if (data.length>512*1024) {//0.5M-1M
data=UIImageJPEGRepresentation(newImage, 0.8);
}else if (data.length>200*1024) {
//0.25M-0.5M
data=UIImageJPEGRepresentation(newImage, 0.9);
}
}
return data;
}