在移動端對用戶的圖片進行壓縮處理是在所難免,有時候我們需要對圖形的尺寸進行改變而有時候需要進行體積的減小,方便上傳和節約用戶流量。
因此壓和縮是不同的兩個概念
“壓”:指文件體積進行變小,但像素數不變,長和寬不變,質量減少,文件體積也就會減少。
“縮”:指圖片的尺寸變小,造成像素點數減少,這樣文件體積同樣會減少。
先談談“壓”吧
在iOS開發中讀取圖片常用的就是兩個函數方法:
- UIImagePNGRepresentation(UIImage* image)
- UIImageJPEGRepresentation(UIImage* image, 1.0)
它們兩個都是讀取圖片的,不同的是第一個函數的參數只有一個,
而第二個函數多了一個設置壓縮比例的參數
第一個函數對圖片進行原生態的加載,不損傷圖片原有的性質,
而第二個函數由於可以增添壓縮值就造成了對原有圖片質量進行損害。
另外還要注意兩點:
即使 UIImageJPEGRepresentation(UIImage* image, 1.0)這個函數參數爲1.0,它所返回出來的圖片所佔的內存也要比UIImagePNGRepresentation(UIImage* image)的所佔的內存小一些
顧名思義PNG函數返回的當然是png格式的圖片
JPEG函數返回的當然是jpeg格式的圖片現實開發中我們怎樣選擇
以QQ空間上傳圖片爲例吧!
我們需要考慮到當前用戶所處的網路狀態,流量用戶倘若我們上傳原圖,豈不是非常不合理的行爲?
-WIFI狀態也要根據用戶網絡質量選擇一般、高清、原圖的質量吧。
所以我個人建議如下:
- 當用戶使用網絡爲2G/3G/4G若不提供給用戶選擇圖片質量的權限
的時候建議使用UIImageJPEGRepresentation(UIImage* image, 1.0),至於最後一個參數選擇多少,可以進行深入研究選擇參數 - 當用戶處於WIFI狀態,可以提供用戶選擇圖片質量的權利,若選擇一般或高清仍然使用UIImageJPEGRepresentation(UIImage* image, 1.0)函數進行參數的合理化選擇參數
當處於WIFI狀態,用戶選擇原圖的時候建議選擇UIImagePNGRepresentation(UIImage* image),這樣的質量效果要比UIImageJPEGRepresentation(UIImage* image, 1.0)質量好一些。
接着再談談“縮”吧
對於縮也就是改變圖片的大小,實現的原理是利用drawInRect:函數進行原圖片的重新繪製
/* * 壓縮圖片至目標尺寸 * * @param sourceImage 源圖片 * @param targetWidth 圖片最終尺寸的寬 * * @return 返回按照源圖片的寬、高比例壓縮至目標寬、高的圖片 */ - (UIImage *)compressImage:(UIImage *)sourceImage toTargetWidth: (CGFloat)targetWidth { CGSize imageSize = sourceImage.size; CGFloat width = imageSize.width; CGFloat height = imageSize.height; CGFloat targetHeight = (targetWidth / width) * height; UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight)); [sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)]; UIImage *newImage =UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage;
最後附上一個壓縮對照表,在實戰中可以查閱這張表進行何以選擇參數值