場景:
我們需要將圖片壓縮到指定的大小. 有幾個(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