国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Android-Entwicklungshandbuch / Bitmap(位圖)全解析 Part 1

Bitmap(位圖)全解析 Part 1

本節(jié)引言:

在上一節(jié)中我們對(duì)Android中的13種類型的Drawable的類型進(jìn)行了講解,有沒(méi)有應(yīng)用到自己的 項(xiàng)目當(dāng)中呢?而本節(jié)我們來(lái)探討的是Bitmap(位圖)的一些使用,而在開(kāi)始本節(jié)的內(nèi)容之前我們 先來(lái)區(qū)分幾個(gè)名詞的概念:

  • Drawable:通用的圖形對(duì)象,用于裝載常用格式的圖像,既可以是PNG,JPG這樣的圖像, 也是前面學(xué)的那13種Drawable類型的可視化對(duì)象!我們可以理解成一個(gè)用來(lái)放畫(huà)的——畫(huà)框!
  • Bitmap(位圖):我們可以把他看作一個(gè)畫(huà)架,我們先把畫(huà)放到上面,然后我們可以 進(jìn)行一些處理,比如獲取圖像文件信息,做旋轉(zhuǎn)切割,放大縮小等操作!
  • Canvas(畫(huà)布):如其名,畫(huà)布,我們可以在上面作畫(huà)(繪制),你既可以用Paint(畫(huà)筆), 來(lái)畫(huà)各種形狀或者寫(xiě)字,又可以用Path(路徑)來(lái)繪制多個(gè)點(diǎn),然后連接成各種圖形!
  • Matrix(矩陣):用于圖形特效處理的,顏色矩陣(ColorMatrix),還有使用Matrix進(jìn)行圖像的 平移,縮放,旋轉(zhuǎn),傾斜等!

而上述的這些都是Android中的底層圖形類:android.graphics給我們提供的接口! 嗯,話不多說(shuō)開(kāi)始本節(jié)內(nèi)容! PS:官方文檔:Bitmap


1.了解Bitmap,BitmapFactory,BitmapFacotry.Options

如題,本來(lái)可以直接說(shuō)著三個(gè)東東的關(guān)系的,但是我就是要傲嬌,就要看代碼!1.gif如果你打開(kāi)Bitmap類的源碼,你會(huì)看到Bitmap的構(gòu)造方法上有這樣一段東東:

2.png

大概想說(shuō)的就是:Bitmap的構(gòu)造方法是私有的,外面不能實(shí)例化,只能通過(guò)JNI實(shí)例化! 當(dāng)然,肯定也會(huì)給我們提供一個(gè)接口給我們來(lái)創(chuàng)建Bitmap的,而這個(gè)接口類就是:BitmapFactory! 來(lái)來(lái)來(lái),打開(kāi)BitmapFactory類,我們點(diǎn)下左邊的Structure可以看到BitmapFactory給我們 提供了這些方法,大部分都是decodeXxx,通過(guò)各種形式來(lái)創(chuàng)建Bitmap的!

3.png

接著我們又發(fā)現(xiàn)了,每一種方法,都會(huì)有一個(gè)Options類型的參數(shù),點(diǎn)進(jìn)去看看: 于是乎我們發(fā)現(xiàn)了這貨是一個(gè)靜態(tài)內(nèi)部類:BitmapFacotry.Options! 而他是用來(lái)設(shè)置decode時(shí)的選項(xiàng)的!

4.png

我們對(duì)這里的某些參數(shù)的值進(jìn)行設(shè)置,比如inJustDecodeBounds設(shè)置為true避免OOM(內(nèi)存溢出), 什么,不知道OOM,沒(méi)事,等下一點(diǎn)點(diǎn)跟你說(shuō)清楚!最后回到我們的Bitmap!嗯,Bitmap中的 方法比較多,就不一一進(jìn)行講解了,我們從中挑幾個(gè)用得較多的來(lái)講解! 中文文檔:Android中文API(136) —— Bitmap


2.Bitmap常用方法

普通方法

  • public boolean compress (Bitmap.CompressFormat format, int quality, OutputStream stream) 將位圖的壓縮到指定的OutputStream,可以理解成將Bitmap保存到文件中!format:格式,PNG,JPG等;quality:壓縮質(zhì)量,0-100,0表示最低畫(huà)質(zhì)壓縮,100最大質(zhì)量(PNG無(wú)損,會(huì)忽略品質(zhì)設(shè)定)stream:輸出流 返回值代表是否成功壓縮到指定流!
  • void recycle():回收位圖占用的內(nèi)存空間,把位圖標(biāo)記為Dead
  • boolean isRecycled():判斷位圖內(nèi)存是否已釋放
  • int getWidth():獲取位圖的寬度
  • int getHeight():獲取位圖的高度
  • boolean isMutable():圖片是否可修改
  • int getScaledWidth(Canvas canvas):獲取指定密度轉(zhuǎn)換后的圖像的寬度
  • int getScaledHeight(Canvas canvas):獲取指定密度轉(zhuǎn)換后的圖像的高度

靜態(tài)方法

  • Bitmap createBitmap(Bitmap src):以src為原圖生成不可變得新圖像
  • Bitmap createScaledBitmap(Bitmap src, int dstWidth,int dstHeight, boolean filter):以src為原圖,創(chuàng)建新的圖像,指定新圖像的高寬以及是否變。
  • Bitmap createBitmap(int width, int height, Config config):創(chuàng)建指定格式、大小的位圖
  • Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source為原圖,創(chuàng)建新的圖片,指定起始坐標(biāo)以及新圖像的高寬。
  • public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

BitmapFactory.Option可設(shè)置參數(shù):

  • boolean inJustDecodeBounds——如果設(shè)置為true,不獲取圖片,不分配內(nèi)存,但會(huì)返回圖片的高寬度信息。
  • int inSampleSize——圖片縮放的倍數(shù)。如果設(shè)為4,則寬和高都為原來(lái)的1/4,則圖是原來(lái)的1/16。
  • int outWidth——獲取圖片的寬度值
  • int outHeight——獲取圖片的高度值
  • int inDensity——用于位圖的像素壓縮比
  • int inTargetDensity——用于目標(biāo)位圖的像素壓縮比(要生成的位圖)
  • boolean inScaled——設(shè)置為true時(shí)進(jìn)行圖片壓縮,從inDensity到inTargetDensity。

好吧,就貼這么多吧,要用自己查文檔~


3.獲取Bitmap位圖

從資源中獲取位圖的方式有兩種:通過(guò)BitmapDrawable或者BitmapFactory,下面演示下: 我們首先得獲得這個(gè)

BitmapDrawable方法

你可以創(chuàng)建一個(gè)構(gòu)造一個(gè)BitmapDrawable對(duì)象,比如通過(guò)流構(gòu)建BitmapDrawable:

BitmapDrawable bmpMeizi = new BitmapDrawable(getAssets().open("pic_meizi.jpg"));
Bitmap mBitmap = bmpMeizi.getBitmap();
img_bg.setImageBitmap(mBitmap);

BitmapFactory方法

都是靜態(tài)方法,直接調(diào),可以通過(guò)資源ID、路徑、文件、數(shù)據(jù)流等方式來(lái)獲取位圖!

//通過(guò)資源ID
private Bitmap getBitmapFromResource(Resources res, int resId) {
      return BitmapFactory.decodeResource(res, resId);
}

//文件
private Bitmap getBitmapFromFile(String pathName) {
      return BitmapFactory.decodeFile(pathName);
}

//字節(jié)數(shù)組
public Bitmap Bytes2Bimap(byte[] b) {
    if (b.length != 0) {
        return BitmapFactory.decodeByteArray(b, 0, b.length);
    } else {
        return null;
    }
}

//輸入流
private Bitmap getBitmapFromStream(InputStream inputStream) {
      return BitmapFactory.decodeStream(inputStream);
}

4.獲取Bitmap的相關(guān)信息:

這個(gè),只要我們獲取了Bitmap對(duì)象,就可以調(diào)用相關(guān)方法來(lái)獲取對(duì)應(yīng)的參數(shù)了,getByteCount獲得大小, getHeight和getWidth這些~這里就不寫(xiě)了,自己查文檔!


5.摳圖片上的某一角下來(lái)

有時(shí),可能你想把圖片上的某一角扣下來(lái),直接通過(guò)Bitmap的createBitmap()扣下來(lái)即可 參數(shù)依次為:處理的bitmap對(duì)象,起始x,y坐標(biāo),以及截取的寬高

Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.mipmap.pic_meizi);
Bitmap bitmap2 = Bitmap.createBitmap(bitmap1,100,100,200,200);
img_bg = (ImageView) findViewById(R.id.img_bg);
img_bg.setImageBitmap(bitmap2);

運(yùn)行效果圖

原圖:

5.png

切下來(lái)的一角:

6.png


6.對(duì)Bitmap進(jìn)行縮放

7.png

我們這里不用Matrix來(lái)對(duì)Bitmap,而是直接使用Bitmap給我們提供的createScaledBitmap來(lái)實(shí)現(xiàn), 參數(shù)依次是:處理的bitmap對(duì)象,縮放后的寬高,


7.使用Bitmap進(jìn)行截屏

運(yùn)行效果圖

8.gif

實(shí)現(xiàn)代碼

public class MainActivity extends AppCompatActivity {
    static ByteArrayOutputStream byteOut = null;
    private Bitmap bitmap = null;
    private Button btn_cut;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_cut = (Button) findViewById(R.id.btn_cut);
        btn_cut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                captureScreen();
            }
        });
    }

    public void captureScreen() {
        Runnable action = new Runnable() {
            @Override
            public void run() {
                final View contentView = getWindow().getDecorView();
                try{
                    Log.e("HEHE",contentView.getHeight()+":"+contentView.getWidth());
                    bitmap = Bitmap.createBitmap(contentView.getWidth(),
                            contentView.getHeight(), Bitmap.Config.ARGB_4444);
                    contentView.draw(new Canvas(bitmap));
                    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteOut);
                    savePic(bitmap, "sdcard/short.png");
                }catch (Exception e){e.printStackTrace();}
                finally {
                    try{
                        if (null != byteOut)
                            byteOut.close();
                        if (null != bitmap && !bitmap.isRecycled()) {
//                            bitmap.recycle();
                            bitmap = null;
                        }
                    }catch (IOException e){e.printStackTrace();}

                }
            }
        };
        try {
            action.run();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void savePic(Bitmap b, String strFileName) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(strFileName);
            if (null != fos) {
                boolean success= b.compress(Bitmap.CompressFormat.PNG, 100, fos);
                fos.flush();
                fos.close();
                if(success)
                    Toast.makeText(MainActivity.this, "截屏成功", Toast.LENGTH_SHORT).show();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代碼分析

代碼非常簡(jiǎn)單,final View contentView = getWindow().getDecorView();這句代碼是獲取當(dāng)前XML 根節(jié)點(diǎn)的View!然后設(shè)置截屏的大小,調(diào)用下contentView.draw(new Canvas(bitmap));好了,然后 bitmap轉(zhuǎn)換成流,接著寫(xiě)入SD卡,沒(méi)了~當(dāng)然從結(jié)果我們也可以看出,截圖截取的是改APP的內(nèi)容而已! 如果要截全屏,自行谷歌~!


本節(jié)小結(jié):

本節(jié)給大家講解下Bitmap,BitmapFactory和他的靜態(tài)內(nèi)部類Options,以及BitmapDrawable的 基本使用,其實(shí)Bitmap我們知道怎么創(chuàng)建就好了,他的擴(kuò)展一般是通過(guò)Matrix和Canvas來(lái)實(shí)現(xiàn)的, Bitmap,我們更多的時(shí)候關(guān)注的是OOM問(wèn)題,下一節(jié)我們就來(lái)學(xué)習(xí)下如何避免Bitmap的OOM問(wèn)題! 謝謝~9.gif