上傳帶寬是極其有限的,那麼怎麼才能做到加快速度上傳呢。
其實就是壓縮大圖容量大小的過程,而在這個過程中儘量不降低圖片的清晰度,把圖片壓縮到較小的容量,就是下面要簡單講的兩點內容。
現在手機的分辨率比較高,有點容量動不動就大道6M左右,而上傳圖片的並沒有這種需求,所以第一步就是降低分辨率,這個可以根據工作的實質要求來定。
降低分辨率,首先要識別圖片長寬的比例,計算其縮放比例。
//計算縮放比 public static int getRatioSize(int bitWidth, int bitHeight) { // 圖片最大分辨率 int imageHeight = 1280; int imageWidth = 960; // 縮放比 int ratio = 1; // 縮放比,由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可 if (bitWidth > bitHeight && bitWidth > imageWidth) { // 如果圖片寬度比高度大,以寬度爲基準 ratio = bitWidth / imageWidth; } else if (bitWidth < bitHeight && bitHeight > imageHeight) { // 如果圖片高度比寬度大,以高度爲基準 ratio = bitHeight / imageHeight; } // 最小比率爲1 if (ratio <= 0) ratio = 1; return ratio; }
現在做一個畫板,把縮放的圖片放進去。
//把圖片分辨率降爲1280*960寬高,做一個畫板。RGB565模式降低內存佔有率。 Bitmap result = Bitmap.createBitmap(image.getWidth() / ratio, image.getHeight() / ratio, Bitmap.Config.RGB_565); Canvas canvas = new Canvas(result); Rect rect = new Rect(0, 0, image.getWidth() / ratio, image.getHeight() / ratio); canvas.drawBitmap(image, null, rect, null);
放進去以後呢,就對圖片進行壓縮了,每次都降低10%的質量,來循環壓縮,直到它小於100k或者你設定的任意值。
ByteArrayOutputStream baos = new ByteArrayOutputStream(); result.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 質量壓縮方法,這裏100表示不壓縮,把壓縮後的數據存放到baos中 int options = 100; while (baos.toByteArray().length / 1024 > 100) { // 循環判斷如果壓縮後圖片是否大於500kb,大於繼續壓縮 baos.reset();// 重置baos即清空baos options -= 10;// 每次都減少10 result.compress(Bitmap.CompressFormat.JPEG, options, baos);// 這裏壓縮options%,把壓縮後的數據存放到baos中 }
下面就到了保存壓縮好的圖片的環節了,這裏有兩種保存方式,一種是正常保存方式,另外一種是無損保存圖片的方式,這裏由於copy_yuan大大已經是提供非常詳細的調用jni文件保存圖片,這裏不再贅述。可以說是目前的終極保存圖片的解決方法,也順帶解析了爲何Android與iOS保存圖片機制的差異性。
博文地址在此:http://blog.csdn.NET/copy_yuan/article/details/51353629。