天天看點

Android圖檔壓縮—可按照圖檔大小壓縮

簡介:最近在做圖檔上傳的相關功能,需要對圖檔的大小和尺寸進行壓縮處理。

好處:(1)提升性能(2)節省流量

一、圖檔大小循環壓縮

/**
     * 壓縮圖檔檔案到指定大小
     *
     * @param filePath
     */
    public static void compressBmpToFile(String filePath) {
        Bitmap bitmap = BitmapFactory.decodeFile(filePath);
        if (null == bitmap) {
            return;
        }
        final int BYTE_LEN = ;
        //檔案最大為200KB
        final int MAX_FILE_SIZE = ;
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int quality = ;
        bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
        while (baos.toByteArray().length / BYTE_LEN > MAX_FILE_SIZE) {
            baos.reset();
            quality -= ;
            bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos);
            float size = calculteBitmapSize(bitmap);
        }
        try {
            final FileOutputStream fos = new FileOutputStream(new File(filePath));
            fos.write(baos.toByteArray());
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
/**
     * 計算bitmap的大小
     *
     * @param bitmap
     * @return bitmap的大小機關KB
     */
    public static float calculteBitmapSize(Bitmap bitmap) {
        if (null == bitmap) {
            return f;
        }
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, , baos);
        final float size = (baos.toByteArray().length / );
        try {
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return size;
    }
           

二、圖檔尺寸壓縮

/**
     * 壓縮圖檔的尺寸
     *
     * @param srcPath
     * @return
     */
    public static Bitmap compressImageFromFile(String srcPath) {
        final BitmapFactory.Options newOpts = new BitmapFactory.Options();
        //隻讀邊,不讀内容
        newOpts.inJustDecodeBounds = true;
        // 擷取這個圖檔的寬和高,注意此處的bitmap為null
        BitmapFactory.decodeFile(srcPath, newOpts);
        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        float hh = f;
        float ww = f;
        int be = ;
        if (w > h && w > ww) {
            be = (int) (newOpts.outWidth / ww);
        } else if (w < h && h > hh) {
            be = (int) (newOpts.outHeight / hh);
        }
        if (be <= ) {
            be = ;
        }
        //設定采樣率
        newOpts.inSampleSize = be;
        //該模式是預設的,可不設
        newOpts.inPreferredConfig = Bitmap.Config.RGB_565;
        // 同時設定才會有效
        newOpts.inPurgeable = true;
        //當系統記憶體不夠時候圖檔自動被回收
        newOpts.inInputShareable = true;
        final Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
        return bitmap;
    }
           

三、Luban壓縮

Github:Luban圖檔壓縮

四、圖檔選擇器

PictureSelector圖檔選擇器