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传送门

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

(0)

相关推荐

  • Android给图片加文字和图片水印实例代码

    我们在做项目的时候有时候需要给图片添加水印,水寒今天就遇到了这样的问题,所以搞了一个工具类,贴出来大家直接调用就行. /** * 图片工具类 * @author 水寒 * */ public class ImageUtil { /** * 设置水印图片在左上角 * @param Context * @param src * @param watermark * @param paddingLeft * @param paddingTop * @return */ public static Bi

  • Android 图片添加水印的实现方法

    Android 图片添加水印的实现方法 实现效果图: 手机端打水印(文字和图片)使用的是Bitmap.Matrix和Canvas类的一些方法, 可以实现拉伸.旋转.位移等等效果. 原理很简单, 就是在画布Canvas上绘制图形.图片.文字等等, 得到你想要的效果图片. 百度搜索图片打水印有很多结果, 没找到斜着打水印的代码,有很多公司都要求上图的效果, 所以写着玩玩. /* 添加全屏斜着45度的文字 / public static Bitmap drawCenterLable(Context c

  • Android实现为图片添加水印

    添加水印的方法挺简单的,具体内容如下 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView iv = (ImageView) findViewByI

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

    本文介绍了Android 给图片加上水印的示例代码(支持logo+文字),分享给大家,具体如下: 现在我们想要往图片上打上水印,该水印应符合这样的需求的: 支持logo+文字: 文字信息支持多行展示: 用户可以选择水印在图片上的生成位置(左上.右上.右下和左下). 粗略的结构图低配版大概就长这样... 水印结构图.png 现在提供这样的一种思路去实现这一个需求,我们可以通过自定义一个view,view的布局中包含logo.公司名称和相关信息,这个view就是我们要打上图片的水印. 这样的一个vi

  • Android对图片Drawable实现变色示例代码

    前言 本文主要给大家介绍了Android中图片DrawableCompat利用setTint()对图片Drawable进行变色的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 1.利用color资源对Drawable变色 Drawable对象的来源不限制,可以是从资源getResource().getDrawable(int resourceId)也可以是其他的方式得到的Drawable Drawable wrappedDrawable = DrawableCompat

  • Android Flutter实现"斑马纹"背景的示例代码

    目录 最终效果图 实现思维 斑马纹(45°角,向左倾斜) 画笔 斑马纹坐标位置计算 圆角裁剪(如果需要) 作为背景 代码 使用处 main_page.dart 斑马纹具体实现类 zebra_stripes_back.dart 计算过程解释 由于工作中项目需求,需要将H5转换为Flutter代码. 其中的斑马纹背景需要根据接口返回的颜色来渲染,所以不能只是图片形式,无法通过decoration属性配置图片背景板. 楼主这边想到的方法就是通过 实现一个canvas绘制斑马纹类.使用Stack布局,将

  • Android实现强制下线功能的示例代码

    一.回顾 上次连载写了两个类,一个类ActivityCollector.java用于管理所有的活动:一个类是BaseActivity.java作为所有活动的父类: 还有一个放在layout目录中的登录界面login.xml 二.登录页面的活动 接下来写一个登录页面的活动,继承自BaseActivity.java package com.example.broadcastbestpractice; import android.content.Intent; import android.os.B

  • Android未读消息拖动气泡示例代码详解(附源码)

    前言 拖动清除未读消息可以说在很多应用中都很常见,也被用户广泛接受.本文是一个可以供参考的Demo,希望能有帮助. 提示:以下是本篇文章正文内容,下面案例可供参考 最终效果图及思路 实现关键: 气泡中间的两条边,分别是以ab,cd为数据点,G为控制点的贝塞尔曲线. 步骤: 绘制圆背景以及文本:连接情况绘制贝塞尔曲线:另外端点绘制一个圆 关键代码 1.定义,初始化等 状态:静止.连接.分离.消失 在onSizeChanged中初始化状态,固定气泡以及可动气泡的圆心 代码如下(示例): @Overr

  • android实现音乐跳动效果的示例代码

    效果图 实现 整体的流程图如下 上面主要步骤分为3个 1.计算宽度能放下多少列的音频块. 2.计算每一列中音频块的个数 3.绘制音频块 1.计算宽度能放下多少列的音频块. 设置音频块的宽度为danceWidth,音频块横向之间的间距为danceGap,那么可以算出能放的列数: /** * 先计算当前宽度能够放下多少个音频块 */ val widthNum = (getAvailableWith() / (danceGap + danceWidth)).toInt() /** * 获取可以用的宽度

  • Python实现为PDF去除水印的示例代码

    目录 前言 原理 特色 成果 安装依赖 代码 想法 前言 为什么做出这个? 就是有时候从网上下载的资料中的pdf有水印,看着不舒服. 比如说我从网上下载的试卷,然后去打印店打印,打印之后水印看着很不舒服,而去水印wps要会员,而我是一个程序员,为什么不做一个呢,何乐而不为. 虽然最后是做出来的,但是还是有限制. 原理 把pdf转化为图片,然后将图片去水印. 图片去水印,是又条件限制的,必须水印的颜色和pdf中文字的颜色的rgb相差很大,然后把水印的颜色改变成背景颜色. 特色 网上很多和我类似的原

  • Android Flutter实现点赞效果的示例代码

    目录 前言 绘制小手 完整源码 前言 点赞这个动作不得不说在社交.短视频等App中实在是太常见了,当用户手指按下去的那一刻,给用户一个好的反馈效果也是非常重要的,这样用户点起赞来才会有一种强烈的我点了赞的效果,那么今天我们就用Flutter实现一个掘金App上的点赞效果. 首先我们看下掘金App的点赞组成部分,有一个小手,点赞数字.点赞气泡效果,还有一个震动反馈,接下来我们一步一步实现. 知识点:绘制.动画.震动反馈 绘制小手 这里我们使用Flutter的Icon图标中的点赞小手,Icons图标

  • Android实现图片轮播切换实例代码

    利用Android的ViewFlipper和AnimationUtils实现图片带有动画的轮播切换,其中当点击"上一张"图片时,切换到上一张图片:当点击"下一张"图片时,切换到下一张图片.其效果图如下: 设置布局文件,其内容如下: activity_image_flipper_shade.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xm

  • 两种php给图片加水印的实现代码

    PHP最简单的加水印方法 <?php $img = imagecreatefromjpeg($filename); $logo = imagecreatefromjpeg($filename); /*imagecraetefromjpeg-由文件或URL创建一个新图像 imagecreatefromjpeg(string $filename) 如果启用了fopen包装器,URL可以作为文件名*/ imagecopy($img,$logo,15,15,0,0,$width,$height); /*

随机推荐