Android 给图片加上水印的示例代码(支持logo+文字)

 更新时间:2017年08月01日 16:48:28   作者:echoMu_  
本篇文章主要介绍了Android 给图片加上水印的示例代码(支持logo+文字),具有一定的参考价值,有兴趣的可以了解一下

本文介绍了Android 给图片加上水印的示例代码(支持logo+文字),分享给大家,具体如下:

现在我们想要往图片上打上水印,该水印应符合这样的需求的:

  1. 支持logo+文字;
  2. 文字信息支持多行展示;
  3. 用户可以选择水印在图片上的生成位置(左上、右上、右下和左下)。

粗略的结构图低配版大概就长这样...

水印结构图.png

现在提供这样的一种思路去实现这一个需求,我们可以通过自定义一个view,view的布局中包含logo、公司名称和相关信息,这个view就是我们要打上图片的水印。

这样的一个view其实是一个自定义组合布局,关于如何实现组合布局的自定义view,可以参考这篇文章:Android 自定义View实践之组合控件实现布局的复用

有了水印的view之后,我们就可以利用以下这个方法,得到水印的view的Bitmap。

/**
 * 将一个view转换为Bitmap
 * @param view
 * @return
 */
public static Bitmap convertViewToBitmap(View view){
  view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
  view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
  view.buildDrawingCache();
  Bitmap bitmap = view.getDrawingCache();
  return bitmap;
}

得到水印的view的Bitmap之后,处理一下尺寸,保持水印的尺寸在合理范围内。

//根据原图处理要生成的水印的宽高
  float width = sourBitmap.getWidth();
  float height = sourBitmap.getHeight();
  float be = width / height;

  if ((float) 16 / 9 >= be && be >= (float) 4 / 3) {
    //在图片比例区间内16;9~4:3内,将生成的水印bitmap设置为原图宽高各自的1/5
    waterBitmap = WaterMaskUtil.zoomBitmap(waterBitmap, (int) width / 5, (int) height / 5);
  } else if (be > (float) 16 / 9) {
    //生成4:3的水印
    waterBitmap = WaterMaskUtil.zoomBitmap(waterBitmap, (int) width / 5, (int) width*3 / 20);
  } else if (be < (float) 4 / 3) {
    //生成4:3的水印
    waterBitmap = WaterMaskUtil.zoomBitmap(waterBitmap, (int) height*4 / 15, (int) height / 5);
  }

然后将它按照要求绘制在原图上,提供生成左上、右上、右下和左下四个位置的水印各自的方法,关键代码如下:

/**
 * 设置水印图片在左上角
 * @param src
 * @param watermark
 * @param paddingLeft
 * @param paddingTop
 * @return
 */
public static Bitmap createWaterMaskLeftTop(
    Context context, Bitmap src, Bitmap watermark,
    int paddingLeft, int paddingTop) {
  return createWaterMaskBitmap(src, watermark,
      dp2px(context, paddingLeft), dp2px(context, paddingTop));
}

/**
 * 设置水印图片在右下角
 * @param src
 * @param watermark
 * @param paddingRight
 * @param paddingBottom
 * @return
 */
public static Bitmap createWaterMaskRightBottom(
    Context context, Bitmap src, Bitmap watermark,
    int paddingRight, int paddingBottom) {
  return createWaterMaskBitmap(src, watermark,
      src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight),
      src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom));
}

/**
 * 设置水印图片到右上角
 * @param src
 * @param watermark
 * @param paddingRight
 * @param paddingTop
 * @return
 */
public static Bitmap createWaterMaskRightTop(
    Context context, Bitmap src, Bitmap watermark,
    int paddingRight, int paddingTop) {
  return createWaterMaskBitmap( src, watermark,
      src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight),
      dp2px(context, paddingTop));
}

/**
 * 设置水印图片到左下角
 * @param src
 * @param watermark
 * @param paddingLeft
 * @param paddingBottom
 * @return
 */
public static Bitmap createWaterMaskLeftBottom(
    Context context, Bitmap src, Bitmap watermark,
    int paddingLeft, int paddingBottom) {
  return createWaterMaskBitmap(src, watermark, dp2px(context, paddingLeft),
      src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom));
}

/**
 * 绘制水印图片
 * @param src 原图
 * @param watermark 水印
 * @param paddingLeft
 * @param paddingTop
 * @return
 */
private static Bitmap createWaterMaskBitmap(Bitmap src, Bitmap watermark,
                      int paddingLeft, int paddingTop) {
  if (src == null) {
    return null;
  }
  int width = src.getWidth();
  int height = src.getHeight();
  //创建一个bitmap
  Bitmap newb = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
  //将该图片作为画布
  Canvas canvas = new Canvas(newb);
  //在画布 0,0坐标上开始绘制原始图片
  canvas.drawBitmap(src, 0, 0, null);
  //在画布上绘制水印图片
  canvas.drawBitmap(watermark, paddingLeft, paddingTop, null);
  // 保存
  canvas.save(Canvas.ALL_SAVE_FLAG);
  // 存储
  canvas.restore();
  return newb;
}

绘制后的效果应该是这样的,欢迎拍砖~

给图片加上水印.png

附上源代码:github传送门

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android实现拼图游戏

    Android实现拼图游戏

    这篇文章主要为大家详细介绍了Android实现拼图小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Android实现点击WebView界面中图片滑动浏览与保存图片功能

    Android实现点击WebView界面中图片滑动浏览与保存图片功能

    大家在日常使用spp流量文章的时候经常会遇到这样的一个功能,点击文章的图片进入图片的浏览模式,可以左右滑动图片浏览,并且可以实现保存图片的功能,所以本文主要就介绍了在Android如何实现点击WebView界面中图片滑动浏览与保存图片功能,需要的朋友可以参考下。
    2017-04-04
  • Android编程应用风格和主题详解

    Android编程应用风格和主题详解

    这篇文章主要介绍了Android编程应用风格和主题,较为详细的分析了Android应用风格和主题的概念、功能、使用方法与注意事项,需要的朋友可以参考下
    2016-10-10
  • PopupWindow+RecyclerView实现上下滑动框功能

    PopupWindow+RecyclerView实现上下滑动框功能

    这篇文章主要为大家详细介绍了PopupWindow+RecyclerView实现上下滑动框功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android导航栏功能项的显示与屏蔽介绍

    Android导航栏功能项的显示与屏蔽介绍

    大家好,本篇文章主要讲的是Android导航栏功能项的显示与屏蔽介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Android触摸事件和mousedown、mouseup、click事件之间的关系

    Android触摸事件和mousedown、mouseup、click事件之间的关系

    今天小编就为大家分享一篇关于Android触摸事件和mousedown、mouseup、click事件之间的关系,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Android开发实现读取Assets下文件及文件写入存储卡的方法

    Android开发实现读取Assets下文件及文件写入存储卡的方法

    这篇文章主要介绍了Android开发实现读取Assets下文件及文件写入存储卡的方法,涉及Android文件与目录的读取、写入、转换等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • Android自定义实现BaseAdapter的优化布局

    Android自定义实现BaseAdapter的优化布局

    这篇文章主要为大家详细介绍了Android自定义实现BaseAdapter的优化布局,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android App中的GridView网格布局使用指南

    Android App中的GridView网格布局使用指南

    GridView布局所实现的就是类似于九宫格的矩阵界面效果,下面整理了Android App中的GridView网格布局使用指南,包括分割线的添加与自定义GridView的实现等技巧,需要的朋友可以参考下
    2016-06-06
  • Android CameraManager类详解

    Android CameraManager类详解

    这篇文章主要为大家详细介绍了Android CameraManager类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论