android中bitmap和drawable
在百度地图的开发中,出现了这样的问题,在地图坐标的标注中,需要将布局文件转换为bitmap或者drawable对象。
从资源文件中获取bitmap对象:
BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
从资源文件中获取drawable对象
getResources().getDrawable(R.drawable.ic_launcher)
将布局文件转换为view的代码如下:
// 将布局文件转换view对象 private View convertLayoutToView(int layoutId) { View view = getLayoutInflater().from(MainActivity.this).inflate( layoutId, null); return view; }
将view对象转换为bitmap对象
View组件显示的内容可以通过cache机制保存为bitmap, 使用到的api有
void setDrawingCacheEnabled(boolean flag),
Bitmap getDrawingCache(boolean autoScale),
void buildDrawingCache(boolean autoScale),
void destroyDrawingCache()
我们要获取它的cache先要通过setDrawingCacheEnable方法把cache开启,然后再调用getDrawingCache方法就可以获得view的cache图片了。buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果 cache没有建立,系统会自动调用buildDrawingCache方法生成cache。若果要更新cache, 必须要调用destoryDrawingCache方法把旧的cache销毁,才能建立新的。当调用setDrawingCacheEnabled方法设置为false, 系统也会自动把原来的cache销毁。
ViewGroup在绘制子view时,而外提供了两个方法
setChildrenDrawingCacheEnabled(boolean enabled)
setChildrenDrawnWithCacheEnabled(boolean enabled)
setChildrenDrawingCacheEnabled方法可以使viewgroup里所有的子view开启cache, setChildrenDrawnWithCacheEnabled使在绘制子view时,若该子view开启了cache, 则使用它的cache进行绘制,从而节省绘制时间。
获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。
// 将控件转换为bitmap private Bitmap convertViewToBitMap(View view) { // 打开图像缓存 view.setDrawingCacheEnabled(true); // 必须调用measure和layout方法才能成功保存可视组件的截图到png图像文件 // 测量View大小 view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); // 发送位置和尺寸到View及其所有的子View view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); // 获得可视组件的截图 Bitmap bitmap = view.getDrawingCache(); return bitmap; }
获取屏幕截图的bitmap对象的代码如下
public Bitmap getScreenPic(View view) { View rootView = view.getRootView(); rootView.setDrawingCacheEnabled(true); rootView.buildDrawingCache(); //不明白为什么这里返回一个空,有帖子说不能在oncreat方法中调用 // 测量View大小 rootView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); // 发送位置和尺寸到View及其所有的子View rootView.layout(0, 0, rootView.getMeasuredWidth(), rootView.getMeasuredHeight()); //解决措施,调用上面的measure和layout方法之后,返回值就不再为空 //如果想要创建的是固定长度和宽度的呢? Bitmap bitmap = rootView.getDrawingCache(); rootView.destroyDrawingCache(); return bitmap; }
加载图片缩图的代码
/** * 加载图片的缩略图,依旧可以保持原来图片的长宽比 * * @param path * 图片的路�? * @return */ public static Bitmap loadThumbnail(String path) { BitmapFactory.Options opts = new Options(); //自适应屏幕的大小 opts.inJustDecodeBounds = true; // 告诉解析�?不要真的去解析图�?只是把图片的宽高信息给提供出�? BitmapFactory.decodeFile(path, opts); int width = opts.outWidth; int height = opts.outHeight; // 得到手机屏幕的宽高信�? int windowwidth = 50; int windowheigth = 50; int scalex = width / windowwidth; int scaley = height / windowheigth; if (scalex > scaley && scaley > 1) { // 水平方向的缩放比例比较大 opts.inSampleSize = scalex; } if (scaley > scalex && scalex > 1) { // 竖直方向的缩放比例比较大 opts.inSampleSize = scaley; } opts.inJustDecodeBounds = false; // 告诉解析�?按照 opts.inSampleSize 比例真实的返回位�? Bitmap bitmap = BitmapFactory.decodeFile(path, opts); return bitmap; }
保存bitmap到文件中的代码
public void saveBitmap(Bitmap bitmap ,String path){ try { FileOutputStream fos=new FileOutputStream(path); bitmap.compress(CompressFormat.PNG, 100, fos); if(bitmap!=null){ bitmap.recycle(); bitmap=null; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
将bitmap——>drawable对象
private Drawable convertBitMapToDrawable(Bitmap bitmap) { return (Drawable) (new BitmapDrawable(bitmap)); }
如果反之,想要将drawable对象——>bitmap对象
private Bitmap convertDrawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } else if (drawable instanceof NinePatchDrawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap; } else { return null; } }
bitmap——>byte[]
//如何是将bitmap转换为byte【】数组 ByteArrayOutputStream bos=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); bos.toByteArray();
还可以通过文件输出流将bitmap保存为图片
byte[]------>bitmap
BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
如果想要将得到的bitmap进行保存,可以使用下面的代码
public void saveBitmap(Bitmap bitmap) { FileOutputStream fos = null; try { fos = new FileOutputStream( Environment.getExternalStorageDirectory() + "/test.png"); System.out.println(Environment.getExternalStorageDirectory() + "/test.png"); bitmap.compress(CompressFormat.PNG, 100, fos); } catch (FileNotFoundException e) { e.printStackTrace(); } finally { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
其他相关的背景知识可以参见这篇博客
http://dyh7077063.iteye.com/blog/970672