一. 生成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。
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种模式.
方式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();
}