由于目前項目需要, 于是就參考了網(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