最新碰到个需求,就是将布局转成图片导出,后来想到可以用view.draw(canvas)方法,将布局转为图片。
将布局转为bitmap
public Bitmap getBitmap(View view) {
//获取view的长宽
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
//若传入的view长或宽为小于等于0,则返回,不生成图片
if (width <=0 || height<=0) {
return null;
}
//生成一个ARGB8888的bitmap,宽度和高度为传入view的宽高
Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
if (bm == null) {
return null;
}
//根据bitmap生成一个画布
Canvas canvas = new Canvas(bm);
//注意:这里是解决图片透明度问题,给底色上白色,若存储时保存的为png格式的图,则无需此步骤
canvas.drawColor(Color.WHITE);
//手动将这个视图渲染到指定的画布上
view.draw(canvas);
return bm;
}
如果准备生成的是JPEG的图片则要注意,在将view绘制到canvas之前,给canvas上个底色(白色),因为JPEG图片不支持透明度,最终出来的图片可能因透明度关系局部变成黑色。若图片以png格式,则无需上底色,因为png支持透明度。
将bitmap导出到本地
public void saveCroppedImage(Bitmap bmp) {
// 判断是否可以对SDcard进行操作
if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED))
{ // 获取SDCard指定目录下
String sdCardDir = Environment.getExternalStorageDirectory()+ "/BmpImage/";
//目录转化成文件夹
File dirFile = new File(sdCardDir);
//如果不存在,那就建立这个文件夹
if (!dirFile .exists()) {
dirFile .mkdirs();
}
// 在SDcard的目录下创建图片文,以当前时间为其命名,注意文件后缀,若生成为JPEG则为.jpg,若为PNG则为.png
File file = new File(sdCardDir, System.currentTimeMillis()+".jpg");
FileOutputStream out = null;
try {
out = new FileOutputStream(file);
//将bitmap(数值100表示不压缩)存储到out输出流中去,图片格式为JPEG
bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
//bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}