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

 

你可能感兴趣的:(drawable)