關於安卓(Android)圖片上傳大圖的兩點建議。

上傳帶寬是極其有限的,那麼怎麼才能做到加快速度上傳呢。

其實就是壓縮大圖容量大小的過程,而在這個過程中儘量不降低圖片的清晰度,把圖片壓縮到較小的容量,就是下面要簡單講的兩點內容。

現在手機的分辨率比較高,有點容量動不動就大道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文件保存圖片,這裏不再贅述。可以說是目前的終極保存圖片的解決方法,也順帶解析了爲何AndroidiOS保存圖片機制的差異性。

博文地址在此:http://blog.csdn.NET/copy_yuan/article/details/51353629。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章