iOS 壓縮圖片(看我就夠了)到指定大小.根據(jù) NSData 獲取 Image 大小(kb) 絕對準(zhǔn)確

場景:
我們需要將圖片壓縮到指定的大小. 有幾個(gè)概念要清楚. 壓縮圖片是有范圍限制的. 不是說想壓到多少就是多少,跟它的尺寸大小都有關(guān)系. 所以壓縮的時(shí)候圖片的尺寸也很有關(guān)系.

下面說一下如何正確獲取圖片的大小.
網(wǎng)上都是

NSData *data = UIImageJPEGRepresentation(newImage, compress);
NSLog(@"當(dāng)前的圖片的長度是%ld",data.length);
然后利用長度/1000 得到當(dāng)前圖片的大小.  大家可以去嘗試一下,這樣子獲取出來是錯(cuò)誤的

正確的做法,親測有效:

//轉(zhuǎn)換成圖片   獲取真正的圖片大小
              data =UIImagePNGRepresentation(image);
NSLog(@"當(dāng)前的圖片的長度是%ld",data.length);
然后利用長度/1000 得到當(dāng)前圖片的大小.  這樣子獲取出來就是正確的了

下面是我的親測的效果

當(dāng)前壓縮的大小是138032---壓縮比是0.007031

圖片
Xnip2020-05-07_16-25-04.png

我已經(jīng)多次驗(yàn)證是正確的.

那么如何正確的壓縮圖片呢.
如果你想壓縮圖片到 100kb, 那么最后發(fā)現(xiàn)壓縮比已經(jīng)無限趨近于 0 了還是超過 100kb,那么也就是說達(dá)到壓縮極限了,這個(gè)時(shí)候你就需要修改maxWidth 這個(gè)值了,調(diào)整最大寬度, 寬度越窄,能壓縮的極限就越小. 具體的參數(shù)就根據(jù)需要來調(diào)整了.

下面的代碼是使用的第三方框架的代碼, 但是經(jīng)過了我的修改.
第一: 我把下面代碼中檢測圖片大小的代碼換成了UIImagePNGRepresentation
第二: 之前的代碼壓縮是通過每次壓縮比減小 0.02.但是效率太低. 我處理了一下,效率高出很多
請看下面的代碼
.m 文件

//
//  UIImage+SuperCompress.m
//  JKCategories (https://github.com/shaojiankui/JKCategories)
//
//  Created by Jakey on 16/1/22.
//  Copyright ? 2016年 Jakey. All rights reserved.
//

#import "UIImage+JKSuperCompress.h"

@implementation UIImage (JKSuperCompress)
+ (UIImage*)jk_resizableHalfImage:(NSString *)name
{
    UIImage *normal = [UIImage imageNamed:name];
    
    CGFloat imageW = normal.size.width * 0.5;
    CGFloat imageH = normal.size.height * 0.5;
    return [normal resizableImageWithCapInsets:UIEdgeInsetsMake(imageH, imageW, imageH, imageW)];
}

//maxLength
+ (NSData *)jk_compressImage:(UIImage *)image toMaxLength:(NSInteger)maxLength maxWidth:(NSInteger)maxWidth{
    NSAssert(maxLength > 0, @"圖片的大小必須大于 0");
    NSAssert(maxWidth > 0, @"圖片的最大邊長必須大于 0");
    
    CGSize newSize = [self jk_scaleImage:image withLength:maxWidth];
    UIImage *newImage = [self jk_resizeImage:image withNewSize:newSize];
    
    CGFloat compress = 0.9f;
    NSData *data = UIImageJPEGRepresentation(newImage, compress);
//獲取圖片真正的大小
       data =UIImagePNGRepresentation([UIImage imageWithData:data]);
    while (data.length > maxLength && compress > 0.01) {
//快速壓縮       
 compress=compress/2;
        //壓縮
        data = UIImageJPEGRepresentation(newImage, compress);
        //轉(zhuǎn)換成圖片   獲取真正的圖片大小
        data =UIImagePNGRepresentation([UIImage imageWithData:data]);
        while (data.length<=maxWidth) {
            compress+=compress+0.001;
            //壓縮
              data = UIImageJPEGRepresentation(newImage, compress);
              //轉(zhuǎn)換成圖片   獲取真正的圖片大小
              data =UIImagePNGRepresentation([UIImage imageWithData:data]);
        }
        NSLog(@"當(dāng)前的圖片的長度是%ld",data.length);
    }
      NSLog(@"當(dāng)前壓縮的大小是%ld---壓縮比是%lf",data.length,compress);
    return data;
}

+ (UIImage *)jk_resizeImage:(UIImage *) image withNewSize:(CGSize) newSize{
    
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return newImage;
}

+ (CGSize)jk_scaleImage:(UIImage *) image withLength:(CGFloat) imageLength{
    
    CGFloat newWidth = 0.0f;
    CGFloat newHeight = 0.0f;
    CGFloat width = image.size.width;
    CGFloat height = image.size.height;
    if (width > imageLength || height > imageLength){
        if (width > height) {
            
            newWidth = imageLength;
            newHeight = newWidth * height / width;
            
        }else if(height > width){
            
            newHeight = imageLength;
            newWidth = newHeight * width / height;
            
        }else{
            
            newWidth = imageLength;
            newHeight = imageLength;
        }
        
    }else{
        return CGSizeMake(width, height);
    }
    
    return CGSizeMake(newWidth, newHeight);
}

@end

.h文件

//
//  UIImage+SuperCompress.h
//  JKCategories (https://github.com/shaojiankui/JKCategories)
//
//  Created by Jakey on 16/1/22.
//  Copyright ? 2016年 Jakey. All rights reserved.
//  https://github.com/CompletionHandler/CYImageCompress

//512kb  2014px
//usage      [UIImage compressImage:image toMaxLength:512*1000 maxWidth:1024];

#import <UIKit/UIKit.h>

@interface UIImage (JKSuperCompress)
/**
 *  壓縮上傳圖片到指定字節(jié)
 *
 *  @param image     壓縮的圖片
 *  @param maxLength 壓縮后最大字節(jié)大小
 *
 *  @return 壓縮后圖片的二進(jìn)制
 */
+ (NSData *)jk_compressImage:(UIImage *)image toMaxLength:(NSInteger) maxLength maxWidth:(NSInteger)maxWidth;

/**
 *  獲得指定size的圖片
 *
 *  @param image   原始圖片
 *  @param newSize 指定的size
 *
 *  @return 調(diào)整后的圖片
 */
+ (UIImage *)jk_resizeImage:(UIImage *) image withNewSize:(CGSize) newSize;

/**
 *  通過指定圖片最長邊,獲得等比例的圖片size
 *
 *  @param image       原始圖片
 *  @param imageLength 圖片允許的最長寬度(高度)
 *
 *  @return 獲得等比例的size
 */
+ (CGSize)jk_scaleImage:(UIImage *) image withLength:(CGFloat) imageLength;


+ (UIImage*)jk_resizableHalfImage:(NSString *)name;
@end

有問題可以相互討論. +V 17723566468

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容