Bitmap总结

一. 生成Bitmap

1. decodeFile 从文件系统加载

a. 通过Intent打开本地图片或照片
b. 在onActivityResult中获取图片uri
c. 根据uri获取图片的路径
d. 根据路径解析bitmap:Bitmap bm = BitmapFactory.decodeFile(sd_path)

2. decodeResource 以R.drawable.xxx的形式从本地资源中加载

Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.aaa);

3. decodeStream 从输入流加载

a.开启异步线程去获取网络图片
b.网络返回InputStream
c.解析:Bitmap bm = BitmapFactory.decodeStream(stream),这是一个耗时操作,要在子线程中执行

4. decodeByteArray 从字节数组中加载

接3.a,3.b,
c. 把InputStream转换成byte[]
d. 解析:Bitmap bm = BitmapFactory.decodeByteArray(myByte,0,myByte.length);



Android中BitmapFactory.Options详解

1. inJustDecodeBounds

解码时返回null,不为位图分配内存.但是会返回位图的信息;

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.huoying,options);
if (bitmap == null) {
     Log.e(TAG,"图片的高 == " + options.outHeight+"    \n图片的宽 == " + options.outWidth + " \n图片类型 == " + options.outMimeType);
}
输出

2. inSampleSize

这个值是一个int,当它小于1的时候,将会被当做1处理,如果大于1,那么就会按照比例(1 / inSampleSize)缩小bitmap的宽和高、降低分辨率,大于1时这个值将会被处置为2的倍数。例如,width=100,height=100,inSampleSize=2,那么就会将bitmap处理为,width=50,height=50,宽高降为1 / 2,像素数降为1 / 4。

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = false;
    options.inSampleSize = 2;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.huoying,options);
    Log.e(TAG,"图片的高 == " + bitmap.getHeight()+"   " +
                  " \n图片的宽 == " + bitmap.getWidth() + " " +
                  "\n图片类型 == " + bitmap.getConfig());
   }

3.inPreferredConfig

这个值是设置色彩模式,默认值是ARGB_8888,在这个模式下,一个像素点占用4bytes空间,一般对透明度不做要求的话,一般采用RGB_565模式,这个模式下一个像素点占用2bytes。


Bitmap总结_第1张图片
Bitmap的内存格式

ALPHA_8
表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度
ARGB_4444
表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节
ARGB_8888
表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节
RGB_565
表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节


图片合成

图片合并的16种模式.

Bitmap总结_第2张图片
PorterDuff 的16种模式

方式1:

    private Bitmap combineImgs(Bitmap src,Bitmap dest) {
        Bitmap.Config config = src.getConfig();
        //config = Bitmap.Config.ARGB_8888;
        //dest = Bitmap.createScaledBitmap(dest, src.getWidth(), src.getHeight(), true);
        Bitmap bg = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.ARGB_8888);

        Paint paint = new Paint();
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));

        Canvas canvas = new Canvas(bg);
        canvas.drawBitmap(dest,0,0,null);        // 这是dest,没有paint的对象.
        canvas.drawBitmap(src,0,0,paint);      // 这是src,有paint的对象.


        return bg;
    }

方式2:


    private Bitmap canvasBitmap(){
        Bitmap src = BitmapFactory.decodeResource(getResources(), R.mipmap.dog);

        int width = src.getWidth();
        int height = src.getHeight();
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);


        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawCircle(width/2,height/2,width/2,paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));


        canvas.drawBitmap(src,0,0,paint);

        return bitmap;
    }

Bitmap保存到本地

                String fileName = "new.jpg";
                File file = new File(Environment.getExternalStorageDirectory(),fileName);
                try {
                    FileOutputStream outputStream = new FileOutputStream(file);
                    Bitmap bitmap = canvasBitmap();
                    bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

你可能感兴趣的:(Bitmap总结)