iOS 圖片壓縮邏輯

由于目前項目需要, 于是就參考了網(wǎng)上曬出來的微信等APP的壓縮邏輯,封裝了一個圖片壓縮的邏輯類,拿出來給大家分享一下~

圖片壓縮的邏輯: 首先進行圖片的尺寸壓縮 再進行圖片的質(zhì)量壓縮
一:圖片尺寸壓縮 主要分為以下幾種情況 一般參照像素為1280
a.圖片寬高均≤1280px時胁孙,圖片尺寸保持不變;
b.寬或高均>1280px時 ——圖片寬高比≤2阻肿,則將圖片寬或者高取大的等比壓縮至1280px; ——但是圖片寬高比>2時,則寬或者高取小的等比壓縮至1280px;
c.寬高一個>1280px挣输,另一個<1280px齐饮,--圖片寬高比>2時捐寥,則寬高尺寸不變;--但是圖片寬高比≤2時,則將圖片寬或者高取大的等比壓縮至1280px.
二:圖片質(zhì)量壓縮
一般圖片質(zhì)量都壓縮在90%就可以了

測試結果: 一般壓縮出來的data再150 - 300kb之間 這個結果相對于大多數(shù)的APP已經(jīng)夠了 下面是代碼實現(xiàn)

#import <Foundation/Foundation.h>

// 我們項目中的圖片壓縮參照為1280px
#define KitTargetPx 1280

/**
 *  圖片壓縮的邏輯類
 */
@interface KitImageSeviceManager : NSObject

/**
 *  圖片壓縮的單例實現(xiàn)方法
 *
 *  @return 返回一個圖片壓縮的類
 */
+ (instancetype)shareManager;

/**
 *  將圖片壓縮的data返回
 *
 *  @param sourceImage 傳進來要壓縮的照片
 *  @param targetPx    壓縮圖片時參照的像素px
 *
 *  @return 返回圖片壓縮后的data
 */
- (NSData *)imageCompressForSize:(UIImage *)sourceImage targetPx:(NSInteger)targetPx;

@end
#import "KitImageSeviceManager.h"

@implementation KitImageSeviceManager


#pragma mark -- 返回圖片壓縮類的單例
+ (instancetype)shareManager
{
    static KitImageSeviceManager *manager = nil;
    static dispatch_once_t oneToken;
    dispatch_once(&oneToken, ^{
        manager = [[KitImageSeviceManager alloc] init];
    });
    return manager;
}

/**
 圖片壓縮的邏輯:
   一:圖片尺寸壓縮 主要分為以下幾種情況 一般參照像素為1280
     a.圖片寬高均≤1280px時笤昨,圖片尺寸保持不變;
     b.寬或高均>1280px時 ——圖片寬高比≤2,則將圖片寬或者高取大的等比壓縮至1280px; ——但是圖片寬高比>2時握恳,則寬或者高取小的等比壓縮至1280px;
     c.寬高一個>1280px咬腋,另一個<1280px,--圖片寬高比>2時睡互,則寬高尺寸不變;--但是圖片寬高比≤2時,則將圖片寬或者高取大的等比壓縮至1280px.
 
   二:圖片質(zhì)量壓縮
      一般圖片質(zhì)量都壓縮在90%就可以了
 */

#pragma mark -- 圖片壓縮方法
- (NSData *)imageCompressForSize:(UIImage *)sourceImage targetPx:(NSInteger)targetPx
{
    UIImage *newImage = nil;  // 尺寸壓縮后的新圖片
    CGSize imageSize = sourceImage.size; // 源圖片的size
    CGFloat width = imageSize.width; // 源圖片的寬
    CGFloat height = imageSize.height; // 原圖片的高
    BOOL drawImge = NO;   // 是否需要重繪圖片 默認是NO
    CGFloat scaleFactor = 0.0;  // 壓縮比例
    CGFloat scaledWidth = targetPx;  // 壓縮時的寬度 默認是參照像素
    CGFloat scaledHeight = targetPx; // 壓縮是的高度 默認是參照像素

// 先進行圖片的尺寸的判斷
    
    // a.圖片寬高均≤參照像素時根竿,圖片尺寸保持不變
    if (width < targetPx && height < targetPx) {
        newImage = sourceImage;
    }
    // b.寬或高均>1280px時
    else if (width > targetPx && height > targetPx) {
        drawImge = YES;
        CGFloat factor = width / height;
        if (factor <= 2) {
        // b.1圖片寬高比≤2,則將圖片寬或者高取大的等比壓縮至1280px
            if (width > height) {
                scaleFactor  = targetPx / width;
            } else {
                scaleFactor = targetPx / height;
            }
        } else {
        // b.2圖片寬高比>2時就珠,則寬或者高取小的等比壓縮至1280px
            if (width > height) {
                scaleFactor  = targetPx / height;
            } else {
                scaleFactor = targetPx / width;
            }
        }
    }
   // c.寬高一個>1280px寇壳,另一個<1280px 寬大于1280
   else if (width > targetPx &&  height < targetPx ) {
        if (width / height > 2) {
            newImage = sourceImage;
        } else {
             drawImge = YES;
            scaleFactor = targetPx / width;
        }
    }
   // c.寬高一個>1280px,另一個<1280px 高大于1280
   else if (width < targetPx &&  height > targetPx) {
        if (height / width > 2) {
            newImage = sourceImage;
        } else {
             drawImge = YES;
            scaleFactor = targetPx / height;
        }
    }
    
  // 如果圖片需要重繪 就按照新的寬高壓縮重繪圖片
    if (drawImge == YES) {
        scaledWidth = width * scaleFactor;
        scaledHeight = height * scaleFactor;
        UIGraphicsBeginImageContext(CGSizeMake(scaledWidth, scaledHeight));
        // 繪制改變大小的圖片
        [sourceImage drawInRect:CGRectMake(0, 0, scaledWidth,scaledHeight)];
        // 從當前context中創(chuàng)建一個改變大小后的圖片
        newImage =UIGraphicsGetImageFromCurrentImageContext();
        // 使當前的context出堆棧
        UIGraphicsEndImageContext();
    }
    // 防止出錯  可以刪掉的
    if (newImage == nil) {
        newImage = sourceImage;
    }

    // 如果圖片大小大于200kb 在進行質(zhì)量上壓縮
    NSData * scaledImageData = nil;
        if (UIImageJPEGRepresentation(newImage, 1) == nil) {
              scaledImageData = UIImagePNGRepresentation(newImage);
        }else{
            scaledImageData = UIImageJPEGRepresentation(newImage, 1);
            if (scaledImageData.length >= 1024 * 200) {
                scaledImageData = UIImageJPEGRepresentation(newImage, 0.9);
            }
        }
    
    return scaledImageData;

}


@end

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妻怎,一起剝皮案震驚了整個濱河市壳炎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逼侦,老刑警劉巖孵睬,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異立肘,居然都是意外死亡彻况,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門晰赞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稼病,“玉大人,你說我怎么就攤上這事掖鱼∪蛔撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵戏挡,是天一觀的道長芍瑞。 經(jīng)常有香客問我,道長褐墅,這世上最難降的妖魔是什么拆檬? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮掌栅,結果婚禮上秩仆,老公的妹妹穿的比我還像新娘。我一直安慰自己猾封,他們只是感情好澄耍,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般齐莲。 火紅的嫁衣襯著肌膚如雪痢站。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天选酗,我揣著相機與錄音阵难,去河邊找鬼。 笑死芒填,一個胖子當著我的面吹牛呜叫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殿衰,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼朱庆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闷祥?” 一聲冷哼從身側(cè)響起娱颊,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凯砍,沒想到半個月后箱硕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡悟衩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年剧罩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片局待。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡斑响,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钳榨,到底是詐尸還是另有隱情,我是刑警寧澤纽门,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布薛耻,位于F島的核電站,受9級特大地震影響赏陵,放射性物質(zhì)發(fā)生泄漏饼齿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一蝙搔、第九天 我趴在偏房一處隱蔽的房頂上張望缕溉。 院中可真熱鬧,春花似錦吃型、人聲如沸证鸥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枉层。三九已至泉褐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸟蜡,已是汗流浹背膜赃。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揉忘,地道東北人跳座。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像泣矛,于是被迫代替她去往敵國和親躺坟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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