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

  • 相关阅读:
    python执行线程方法
    Python 多线程教程:并发与并行
    python中遍历文件的3个方法
    docker-compose编写(英文)
    使用Docker构建redis集群--最靠谱的版本
    iptables四个表与五个链间的处理关系
    Docker相关文档
    HTTP 之 Content-Type
    Python之VSCode
    自定义分页
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3069415.html
Copyright © 2011-2022 走看看