欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android三種常見的圖片壓縮方式

 更新時(shí)間:2021年05月17日 09:36:00   作者:嘮嗑008  
在開發(fā)中,我們經(jīng)常有這樣一種需求,從相冊(cè)選擇圖片,上傳到服務(wù)器。隨著手機(jī)像素的不斷提升,照片也是小一點(diǎn)的3,4兆,大一點(diǎn)的多大10多兆。如果直接上傳原圖,會(huì)增大服務(wù)器壓力,所以,在上傳之前對(duì)圖片壓縮就顯得很必要了。

下面就為大家?guī)?種比較常見的壓縮方式

先給出一組數(shù)據(jù)

原圖:width:2976; height:2976
原圖實(shí)際:--->byte:2299820 Mb:2.19328
質(zhì)量壓縮 size--->:byte:1599831 kb:1562.33496
按比例壓縮 size--->:byte:191707 kb:187.21387
魯班壓縮 size--->:byte:143792 kb:140.42188

壓縮效果:魯班壓縮 > 按比例壓縮 > 質(zhì)量壓縮

1、質(zhì)量壓縮

 public void getBitmap(String imgPath, String outPath) {  
        BitmapFactory.Options newOpts = new BitmapFactory.Options();  
        newOpts.inJustDecodeBounds = false;  
        newOpts.inPurgeable = true;  
        newOpts.inInputShareable = true;  
        // Do not compress  
        newOpts.inSampleSize = 1;  
        newOpts.inPreferredConfig = Config.RGB_565;  
        storeImage(bitmap, outPath); //保存圖片
    }

注意

  • 質(zhì)量壓縮不會(huì)減少圖片的像素,它是在保持像素的前提下改變圖片的位深及透明度等,來達(dá)到壓縮圖片的目的,這也是為什么該方法叫質(zhì)量壓縮方法。所以這種方法,很可能不會(huì)減少圖片的大小
  • 如果是bit.compress(CompressFormat.PNG, quality, baos);這樣的png格式,quality就沒有作用了,bytes.length不會(huì)變化,因?yàn)閜ng圖片是無損的,不能進(jìn)行壓縮

保存圖片

/**
     * 把bitmap轉(zhuǎn)化成圖片存儲(chǔ)在本地
     *
     * @param bitmap
     * @param outPath 本地的存儲(chǔ)路徑
     * @throws FileNotFoundException
     */
    public static boolean storeImage(Bitmap bitmap, String outPath) throws FileNotFoundException {
        FileOutputStream os = new FileOutputStream(outPath);
        boolean compressResult = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
        return compressResult;
    }

2、按比例壓縮(尺寸壓縮、采樣率壓縮)

/**
     * 按比例壓縮
     *
     * @param path    原圖片路徑
     * @param targetW 壓縮后寬度
     * @param targetH 壓縮后高度
     * @return 壓縮后的圖片的保存路徑
     */
    public static String compressScale(String path,, String outPath, int targetW, int targetH) throws FileNotFoundException {
        // 獲取option  
        BitmapFactory.Options options = new BitmapFactory.Options();
        // inJustDecodeBounds設(shè)置為true,這樣使用該option decode出來的Bitmap是null,  
        // 只是把長寬存放到option中  
        options.inJustDecodeBounds = true;
        // 此時(shí)bitmap為null  
        Bitmap bitmap = BitmapFactory.decodeFile(path, options);
        int inSampleSize = 1; // 1是不縮放  
        // 計(jì)算寬高縮放比例  
        int inSampleSizeW = options.outWidth / targetW;
        int inSampleSizeH = options.outHeight / targetH;
        // 最終取大的那個(gè)為縮放比例,這樣才能適配,例如寬縮放3倍才能適配屏幕,而  
        // 高不縮放就可以,那樣的話如果按高縮放,寬在屏幕內(nèi)就顯示不下了  
        if (inSampleSizeW > inSampleSizeH) {
            inSampleSize = inSampleSizeW;
        } else {
            inSampleSize = inSampleSizeH;
        }
        // 一定要記得將inJustDecodeBounds設(shè)為false,否則Bitmap為null  
        options.inJustDecodeBounds = false;
        // 設(shè)置縮放比例(采樣率)  
        options.inSampleSize = inSampleSize;
        bitmap = BitmapFactory.decodeFile(path, options);
        boolean isSuccess = storeImage(bitmap, outPath);
        if (isSuccess) {
            return outPath;
        }
        return "";
    }

這種方法是設(shè)置圖片的采樣率,降低圖片像素,通過縮放圖片像素來減少圖片大小。

那么我又是如何來獲取圖片壓縮前后的大小的呢?

注意:這里的圖片的大小是指圖片的實(shí)際大小,不是bitmap在內(nèi)存中所占的大小,看壓縮效果,就得看圖片在文件中所占的大小。

/**
     * 獲取本地文件大小
     *
     * @param imgPath 圖片的路徑
     * @return 圖片實(shí)際的大小,單位byte
     */
    public static int getFileSize(String imgPath) {
        int size = 0;
        try {
            FileInputStream fis = new FileInputStream(new File(imgPath));
            size = fis.available();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return size;
    }

3、魯班壓縮(推薦)

魯班壓縮是根據(jù)一種算法得出來的,壓縮效果基本上和微信一致,差不多在200k以內(nèi),圖片不失真。

魯班壓縮:
https://github.com/Curzibn/Luban

build.gradle添加依賴

compile 'top.zibin:Luban:1.1.3'
private void lunBanPress(String path) {
        String pressPath = Environment.getExternalStorageDirectory().getPath();
        Luban.with(this)
                .load(path)                                   // 傳人要壓縮的圖片列表
                .ignoreBy(100)                                  // 忽略不壓縮圖片的大小
                .setTargetDir(pressPath)                        // 設(shè)置壓縮后文件存儲(chǔ)位置
                .setCompressListener(new OnCompressListener() { //設(shè)置回調(diào)
                    @Override
                    public void onStart() {
                        // TODO 壓縮開始前調(diào)用,可以在方法內(nèi)啟動(dòng) loading UI
                        Log.i(TAG, "onStart:開始魯班壓縮 ");
                    }

                    @Override
                    public void onSuccess(File file) {
                        // TODO 壓縮成功后調(diào)用,返回壓縮后的圖片文件
                        Glide.with(activity).load(file).into(iv2);
                        Log.i(TAG, "onSuccess: 魯班壓縮成功 :");
                        try {
                            int size = new FileInputStream(file).available();
                            Log.i("tag", "魯班壓縮 size--->:" + "byte:" + size + "    kb:"
                                    + (float) size / 1024);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        // TODO 當(dāng)壓縮過程出現(xiàn)問題時(shí)調(diào)用
                        Log.i(TAG, "onError: 魯班壓縮出錯(cuò)");
                    }
                }).launch();    //啟動(dòng)壓縮
    }

源碼地址:
https://github.com/zhouxu88/ImgCompress

到這里就結(jié)束啦~

以上就是Android三種常見的圖片壓縮方式的詳細(xì)內(nèi)容,更多關(guān)于Android 圖片壓縮的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    這篇文章主要給大家介紹了關(guān)于Android通過自定義Activity實(shí)現(xiàn)懸浮的Dialog的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面來一起看看吧。
    2017-05-05
  • flutter日期選擇器 flutter時(shí)間選擇器

    flutter日期選擇器 flutter時(shí)間選擇器

    這篇文章主要為大家詳細(xì)介紹了flutter日期選擇器,flutter時(shí)間選擇器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Android編程調(diào)用紅外線遙控功能示例

    Android編程調(diào)用紅外線遙控功能示例

    這篇文章主要介紹了Android編程調(diào)用紅外線遙控功能,結(jié)合實(shí)例形式分析了Android紅外線功能的相關(guān)組件調(diào)用與布局操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • 淺析Android手機(jī)衛(wèi)士保存手機(jī)安全號(hào)碼

    淺析Android手機(jī)衛(wèi)士保存手機(jī)安全號(hào)碼

    這篇文章主要介紹了淺析Android手機(jī)衛(wèi)士保存手機(jī)安全號(hào)碼的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • Android ImageView實(shí)現(xiàn)圖片裁剪和顯示功能

    Android ImageView實(shí)現(xiàn)圖片裁剪和顯示功能

    這篇文章主要介紹了Android ImageView實(shí)現(xiàn)圖片裁剪和顯示功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • Android開發(fā)疫情查詢app(實(shí)例代碼)

    Android開發(fā)疫情查詢app(實(shí)例代碼)

    這篇文章主要介紹了用Android開發(fā)一個(gè)疫情查詢的APP,文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Android音頻開發(fā)之SurfaceView的使用詳解

    Android音頻開發(fā)之SurfaceView的使用詳解

    這篇文章主要為大家介紹了Android中SurfaceView的使用方法,本文通過簡要的案例,為大家進(jìn)行了詳細(xì)的講解,需要的朋友可以參考一下
    2022-04-04
  • 最新評(píng)論