欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-01-03 10:17:55
本文介绍了android 给图片加上水印的示例代码(支持logo+文字),分享给大家,具体如下: 现在我们想要往图片上打上水印,该水印应符合这样的需求的: 支持...

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

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

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

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

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

水印结构图.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;
}

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

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

给图片加上水印.png

附上源代码:github传送门

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