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

 

posted @ 2013-05-09 17:31  bobo的学习笔记  阅读(544)  评论(0编辑  收藏  举报