软件编程
位置:首页>> 软件编程>> Android编程>> Android实现分享长图并且添加全图水印

Android实现分享长图并且添加全图水印

作者:lqh  发布时间:2021-08-04 19:30:57 

标签:Android,水印图片

Android实现分享长图并且添加全图水印

前言:

长图一般是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 width = first.getWidth();
   int height = first.getHeight();
   Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
   Canvas canvas = new Canvas(result);
   canvas.drawBitmap(first, 0, 0, null);
   int h = 0;
   while (h < height + mark.getHeight()) {
     canvas.drawBitmap(mark, 0, h, null);
     h = h + mark.getHeight();
   }
   return result;
 }

坑爹的chrome有bug。一在这个位置点换行接向上按键就崩溃。写个博客崩溃了七八次。最近真的是运气不好。

其实我是想说:由于最近被注入了个对象,依赖性比较强,所以这段时间很少写博客了,后面补上。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

来源:http://blog.csdn.net/gengqiquan/article/details/65938021

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com