iOS 開發(fā)中的圖片壓縮

在項(xiàng)目中經(jīng)常遇到要上傳圖片胯究,如果直接上傳,那么會(huì)上傳比較大的圖片躁绸,導(dǎo)致費(fèi)流量裕循,刷新時(shí)加載圖片時(shí)間過長,手機(jī)內(nèi)存占用率高等問題净刮。

一剥哑、先來介紹下概念:

圖片的壓縮其實(shí)是倆概念,

1淹父、是 “壓” 文件體積變小株婴,但是像素?cái)?shù)不變,長寬尺寸不變暑认,那么質(zhì)量可能下降困介,

2、是 “縮” 文件的尺寸變小蘸际,也就是像素?cái)?shù)減少座哩。長寬尺寸變小,文件體積同樣會(huì)減小捡鱼。

二八回、解決方法(以上傳頭像為例),先縮再壓:

2.1 矯正圖片方向(照片是有方向的驾诈,避免出現(xiàn)“倒立”的情況)

#pragma mark -矯正手機(jī)相冊(cè)里圖像的方向

- (UIImage*)fixOrientation:(UIImage*)aImage {

// No-op if the orientation is already correct

if(aImage.imageOrientation==UIImageOrientationUp)

returnaImage;

// We need to calculate the proper transformation to make the image upright.

// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.

CGAffineTransformtransform =CGAffineTransformIdentity;

switch(aImage.imageOrientation) {

caseUIImageOrientationDown:

caseUIImageOrientationDownMirrored:

transform =CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);

transform =CGAffineTransformRotate(transform,M_PI);

break;

caseUIImageOrientationLeft:

caseUIImageOrientationLeftMirrored:

transform =CGAffineTransformTranslate(transform, aImage.size.width,0);

transform =CGAffineTransformRotate(transform,M_PI_2);

break;

caseUIImageOrientationRight:

caseUIImageOrientationRightMirrored:

transform =CGAffineTransformTranslate(transform,0, aImage.size.height);

transform =CGAffineTransformRotate(transform, -M_PI_2);

break;

default:

break;

}

switch(aImage.imageOrientation) {

caseUIImageOrientationUpMirrored:

caseUIImageOrientationDownMirrored:

transform =CGAffineTransformTranslate(transform, aImage.size.width,0);

transform =CGAffineTransformScale(transform, -1,1);

break;

caseUIImageOrientationLeftMirrored:

caseUIImageOrientationRightMirrored:

transform =CGAffineTransformTranslate(transform, aImage.size.height,0);

transform =CGAffineTransformScale(transform, -1,1);

break;

default:

break;

}

// Now we draw the underlying CGImage into a new context, applying the transform

// calculated above.

CGContextRefctx =CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,

CGImageGetBitsPerComponent(aImage.CGImage),0,

CGImageGetColorSpace(aImage.CGImage),

CGImageGetBitmapInfo(aImage.CGImage));

CGContextConcatCTM(ctx, transform);

switch(aImage.imageOrientation) {

caseUIImageOrientationLeft:

caseUIImageOrientationLeftMirrored:

caseUIImageOrientationRight:

caseUIImageOrientationRightMirrored:

CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);

break;

default:

CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);

break;

}

CGImageRef cgimg =CGBitmapContextCreateImage(ctx);

UIImage *img = [UIImageimageWithCGImage:cgimg];

CGContextRelease(ctx);

CGImageRelease(cgimg);

return img;

}

2.2 拿到上面矯正過的圖片缠诅,縮小圖片尺寸,調(diào)用下面方法傳入newSize乍迄,如(200管引,200):

//縮小圖片尺寸

+ (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize

{

UIGraphicsBeginImageContext(newSize);

[imagedrawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

UIImage* newImage =UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return newImage;

}

2.3 將2.2的圖片再壓,這個(gè)方法可以重復(fù)壓

//調(diào)整大小

NSData *imageData =UIImageJPEGRepresentation(newImage,rate);

NSUIntegersizeOrigin = [image Datalength];//多少KB

NSUIntegersizeOriginKB = sizeOrigin /1024;//多少KB

2.4 上傳頭像

調(diào)用后臺(tái)接口闯两,把imageData二進(jìn)制數(shù)據(jù)上傳即可

總結(jié):對(duì)圖片壓縮處理時(shí)褥伴,在保證圖片清晰度變化不大時(shí)谅将,減小圖片文件大小。方法2.2中的newSize 和 2.3中的rate要以實(shí)際效果來設(shè)置重慢,我在自己項(xiàng)目中上傳的頭像最終尺寸是200*200像素饥臂,大小為4KB左右。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末似踱,一起剝皮案震驚了整個(gè)濱河市隅熙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌核芽,老刑警劉巖囚戚,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轧简,居然都是意外死亡驰坊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門哮独,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拳芙,“玉大人,你說我怎么就攤上這事借嗽√睿” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵恶导,是天一觀的道長浆竭。 經(jīng)常有香客問我,道長惨寿,這世上最難降的妖魔是什么邦泄? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮裂垦,結(jié)果婚禮上顺囊,老公的妹妹穿的比我還像新娘。我一直安慰自己蕉拢,他們只是感情好特碳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晕换,像睡著了一般午乓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闸准,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天益愈,我揣著相機(jī)與錄音,去河邊找鬼。 笑死蒸其,一個(gè)胖子當(dāng)著我的面吹牛敏释,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摸袁,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼钥顽,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了但惶?” 一聲冷哼從身側(cè)響起耳鸯,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膀曾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阳啥,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡添谊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了察迟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩狱。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扎瓶,靈堂內(nèi)的尸體忽然破棺而出所踊,到底是詐尸還是另有隱情,我是刑警寧澤概荷,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布秕岛,位于F島的核電站,受9級(jí)特大地震影響误证,放射性物質(zhì)發(fā)生泄漏继薛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一愈捅、第九天 我趴在偏房一處隱蔽的房頂上張望遏考。 院中可真熱鬧,春花似錦蓝谨、人聲如沸灌具。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咖楣。三九已至,卻和暖如春缕题,著一層夾襖步出監(jiān)牢的瞬間截歉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工烟零, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘪松,地道東北人咸作。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像宵睦,于是被迫代替她去往敵國和親记罚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容