zoukankan      html  css  js  c++  java
  • Android 生成分享长图并且添加全图水印

    转载自 : http://blog.csdn.net/gengqiquan/article/details/65938021

     

    领导最近觉得携程的截屏生成长图分享效果比较好,所以我们也加了个;产品觉得分享出去的长图需要加公司品牌水印,于是我们也加了个;嗯,事件起因就是这样。
    长图一般是ScrollView和ListView。
    我们需要取得这两个控件的完整显示的图片。原理很简单,搞一张和控件长宽一致的画布(就是创建一个高宽相等的bitmap)。然后调用控件的draw方法把自己画到画布上去。
    分别贴出两个控件的长图获取方法

     /**
         * 截取scrollview的屏幕
         **/
        public static Bitmap getScrollViewBitmap(ScrollView scrollView) {
            int h = 0;
            Bitmap bitmap;
            for (int i = 0; i < scrollView.getChildCount(); i++) {
                h += scrollView.getChildAt(i).getHeight();
            }
            // 创建对应大小的bitmap
    
            bitmap = Bitmap.createBitmap(ScreenUtils.getScreenWidth(scrollView.getContext()), h,
                    Bitmap.Config.ARGB_4444);
            final Canvas canvas = new Canvas(bitmap);
            canvas.drawColor(Color.parseColor("#f2f7fa"));
            scrollView.draw(canvas);
            return bitmap;
        }

     

     /**
         * 截图listview
         **/
        public static Bitmap getListViewBitmap(ListView listView, String picpath) {
            int h = 0;
            Bitmap bitmap;
            // 获取listView实际高度
            for (int i = 0; i < listView.getChildCount(); i++) {
                h += listView.getChildAt(i).getHeight();
            }
    listView.getHeight());
            // 创建对应大小的bitmap
            bitmap = Bitmap.createBitmap(listView.getWidth(), h,
                    Bitmap.Config.RGB_565);
            final Canvas canvas = new Canvas(bitmap);
            canvas.drawColor(Color.WHITE);
            listView.draw(canvas);
            // 测试输出
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(picpath);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            try {
                if (null != out) {
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
            }
            return bitmap;
        }

     

    奉送个获取具体view的显示图的方法

        /**
         * 生成某个view的图片
         *
         * @author gengqiquan
         * @date 2017/3/20 上午10:34
         */
        public static Bitmap getViewDrawingCacheBitmap(View view) {
            view = view.getRootView();
            if (!view.isDrawingCacheEnabled()) {
                view.setDrawingCacheEnabled(true);
            }
            view.destroyDrawingCache();
            view.buildDrawingCache();
            Bitmap bm = view.getDrawingCache();
            view.setDrawingCacheEnabled(false);
            return bm;
        }

    再奉送个生成某个LinearLayout图片的方法

    /**
         * 生成某个LinearLayout的图片
         *
         * @author gengqiquan
         * @date 2017/3/20 上午10:34
         */
        public static Bitmap getLinearLayoutBitmap(LinearLayout linearLayout) {
            int h = 0;
            // 获取LinearLayout实际高度
            for (int i = 0; i < linearLayout.getChildCount(); i++) {
                linearLayout.getChildAt(i).measure(0, 0);
                h += linearLayout.getChildAt(i).getMeasuredHeight();
            }
            linearLayout.measure(0, 0);
            // 创建对应大小的bitmap
            Bitmap bitmap = Bitmap.createBitmap(linearLayout.getMeasuredWidth(), h,
                    Bitmap.Config.RGB_565);
            final Canvas canvas = new Canvas(bitmap);
            canvas.drawColor(Color.WHITE);
            linearLayout.draw(canvas);
            return bitmap;
        }

     完了产品肯定会让你在下面或者上面加上公司的logo图片的,嗯。好人做到低,再送个拼接图片的方法

    /**
    *拼接图片
     * @param first 分享的长图
     * @param second  公司logo图
    *@author gengqiquan
    *@date 2017/3/25 下午4:56
    */
        public static Bitmap add2Bitmap(Bitmap first, Bitmap second) {
            float scale = ((float) first.getWidth()) / second.getWidth();
            second = ImageUtil.scaleImg(second, scale);
            int width = first.getWidth();
            int height = first.getHeight() + second.getHeight();
            Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
            Canvas canvas = new Canvas(result);
            canvas.drawBitmap(first, 0, 0, null);
            canvas.drawBitmap(second, 0, first.getHeight(), null);
            return result;
        }

    再来个添加全图水印的方法

    /**
         * @param first 原始图
         * @param mark  水印图
         * @author gengqiquan
         * @date 2017/3/25 下午4:58
         */
         public static Bitmap waterMark(Bitmap first, Bitmap mark) {
            float scale = ((float) first.getWidth()) / mark.getWidth();
            mark = ImageUtil.scaleImg(mark, scale);
            int height = first.getHeight();
            Canvas canvas = new Canvas(first);
            int h = 0;
            while (h < height + mark.getHeight()) {
                canvas.drawBitmap(mark, 0, h, null);
                h = h + mark.getHeight();
            }
            return first;
        }

    另:

    http://www.cnblogs.com/meieiem/archive/2012/08/15/2639543.html    android 实现图片加水印

  • 相关阅读:
    160809207刘兆轩
    技术报告
    homework160809207刘兆轩
    施润行160809301(9)
    施润行160809301(8)
    施润行160809301(7)
    施润行160809301(6)
    施润行160809301(5)
    施润行160809301(作业4)
    施润行160809301(作业3)
  • 原文地址:https://www.cnblogs.com/onelikeone/p/7066767.html
Copyright © 2011-2022 走看看