導讀:
iOS 圖片壓縮方法- 簡書
iOS圖片壓縮處理- 陳斌彬的技術博客
疑問
當我導入一張圖片的時候然后讀取這張圖片的時候發(fā)現(xiàn)這張圖片通過以下這句代碼總是比我們的原圖要大,而且有時候大很多,有時候大的不是特別多:
UIImage *image = [UIImage imageNamed:@"kod.jpg"];
NSData * imageData = UIImageJPEGRepresentation(image, 1);
NSLog(@"imageData = %zd",[imageData length]);
那這個時候我就有疑問了,我的原圖難道不是最大的嗎?所以這個時候就查看一下官方文檔看下究竟:

Snip20170828_90.png
compressionQuality
The quality of the resulting JPEG image, expressed as a value from 0.0 to 1.0.
The value 0.0 represents the maximum compression (or lowest quality) while the value 1.0 represents the least compression (or best quality).
譯文:
壓縮質量
JPEG圖像的質量的值范圍是0.0-1.0
質量值為0時代表的是最大的壓縮或者最低的圖片質量,當值為1的時候代表的是最低的壓縮或者最好的圖片質量
經過翻譯之后發(fā)現(xiàn)好像找到了一點解釋,就是說當前這張圖片的最好質量并不就是原圖,應為原圖可能是壓縮過的。并且要注意的是當這張圖片已經壓縮到最差了那就不能夠再壓縮了,具體是通過什么來評定圖片的質量是最差的,這個得問專業(yè)人士了...
經過我的實驗證明,我現(xiàn)在下載了一張原圖,然后原圖的質量系數(shù)為1的時候寫成文件然后再次讀取此圖片,此新圖片的質量系數(shù)為1的時候的data大小仍然要比新圖大,所以每一張圖片的最好質量并不是自己。所以如果我們需要將圖片寫成文件的話那么就不要返回UIImage了,而是應該返回NSData,當然可以寫兩個方法:
+ (UIImage *)scaleImage:(UIImage *)image toLength:(NSInteger)maxLength{
CGFloat compression = 1;
maxLength *= 1024;
NSData *data = UIImageJPEGRepresentation(image, compression);
while (data.length > maxLength && compression > 0) {
compression -= 0.02;
data = UIImageJPEGRepresentation(image, compression);
}
UIImage *resultImage = [UIImage imageWithData:data];
return resultImage;
}
這個是之前的方法直接返回的是一個UIImage,如果是我們需要把這個經過壓縮的UIImage寫成文件的話,那么又需要通過UIImageJPEGRepresentation這個函數(shù)去轉,這個函數(shù)是需要質量系數(shù)你不知道多少,所以你得把質量系數(shù)傳出來這樣很麻煩,所以我覺得可以把NSData傳出來,然后再在外面轉成UIImage或者說寫兩個方法,返回的類型一個為UIImage,另一個為NSData.
希望這個對大家有幫助?。?!

七禾.jpg