zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3069415.html
Copyright © 2011-2022 走看看