記bitmap內存優化

減小bitmap佔內存大小的方案有兩種:1,options.inSampleSize 設置採樣率的值,原理是等比縮放寬高。縮放多少倍bitmap的內存大小佔用久縮放多少倍。 2.options.inPreferredConfig = Bitmap.Config.RGB_565; 設置位深,也可以說是設置RGB格式,一般有三種RGB_8888,RGB_565,RGB_4444(現在用這種好像無效果了) 設置這個屬性的話對png是無效的不能改變bitmap的大小,對jpg,webp是有效的。RGB_8888比RGB_565佔的內存大一倍。
 options.inJustDecodeBounds = true;//設置這個屬性的話可以拿到圖片的寬和高。拿到這寬高可以自己設定一個值然後比較是否大於這個值,做一個採樣率的縮放。


質量壓縮是不能改變bitmap的內存佔用大小的,但是它可以改變圖片文件的大小。 尺寸壓縮纔可以改變bitmap的內存佔用大小。

package com.example.myapplication.activity;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import com.example.myapplication.R;


public class BitmapActivity extends Activity {
    TextView textView;
    ImageView imageView;
    int imgWidth;
    int imgHeight;
    boolean off = true;

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bitmap);

        textView = findViewById(R.id.add);
        imageView = findViewById(R.id.img);
        final BitmapFactory.Options options = new BitmapFactory.Options();
//        options.inJustDecodeBounds = true;//設置這個屬性的話可以拿到圖片的寬和高
//        options.inSampleSize = 1; //設置這個值可以放大縮小圖片,可以按倍數縮放圖片的寬高
//        options.inPreferredConfig = Bitmap.Config.ARGB_8888; //inPreferredConfig只對webp和jpg的圖片有效,對png的圖片無效
        Bitmap bitmap = getBitmap(R.drawable.jiwebp, options);
        imgWidth = options.outWidth;
        imgHeight = options.outHeight;

        textView.setText("寬=" + imgWidth + "高=" + imgHeight + "大小==" + bitmap.getByteCount());
        imageView.setImageBitmap(bitmap);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (off) {
                    options.inSampleSize = 2;
                    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                    off = false;
                } else {
                    options.inSampleSize = 4;
                    options.inPreferredConfig = Bitmap.Config.RGB_565;
                    off = true;
                }
//                options.inSampleSize = 4;
//                options.inPreferredConfig = Bitmap.Config.RGB_565;

                Bitmap bitmap = getBitmap(R.drawable.jiwebp, options);
                imageView.setImageBitmap(bitmap);
                imgWidth = options.outWidth;
                imgHeight = options.outHeight;
                textView.setText("寬=" + imgWidth + "高=" + imgHeight + "大小==" + bitmap.getByteCount());
            }
        });
    }

    private Bitmap getBitmap(int id, BitmapFactory.Options options) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id, options);
        return bitmap;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章