AndroidWM

一个轻量级的 Android 图片水印框架,支持隐形水印和加密水印。 English version

下载与安装

Gradle:

implementation 'com.huangyz0918:androidwm:0.1.9'

Maven:

com.huangyz0918

androidwm

0.1.9

pom

Lvy:

快速入门

新建一个水印图片

在下载并且配置好 androidwm 之后,你可以创建一个 WatermarkImage 或者是 WatermarkText 的实例,并且使用内置的诸多Set方法为创建一个水印做好准备。

WatermarkText watermarkText = new WatermarkText(editText)

.setPositionX(0.5)

.setPositionY(0.5)

.setTextColor(Color.WHITE)

.setTextFont(R.font.champagne)

.setTextShadow(0.1f, 5, 5, Color.BLUE)

.setTextAlpha(150)

.setRotation(30)

.setTextSize(20);

对于具体定制一个文字水印或者是图片水印, 我们在接下来的文档中会仔细介绍。

当你的水印(文字或图片水印)已经准备就绪的时候,你需要一个 WatermarkBuilder来把水印画到你希望的背景图片上。 你可以通过 create 方法获取一个 WatermarkBuilder 的实例,注意,在创建这个实例的时候你需要先传入一个 Bitmap 或者是一个 Drawable 的资源 id 来获取背景图。

WatermarkBuilder

.create(context, backgroundBitmap)

.loadWatermarkText(watermarkText) // use .loadWatermarkImage(watermarkImage) to load an image.

.getWatermark()

.setToImageView(imageView);

选择绘制模式

你可以在 WatermarkBuilder.setTileMode() 中选择是否使用铺满整图模式,默认情况下我们只会添加一个水印。

WatermarkBuilder

.create(this, backgroundBitmap)

.loadWatermarkText(watermarkText)

.setTileMode(true) // select different drawing mode.

.getWatermark()

.setToImageView(backgroundView);

咚! 带水印的图片已经绘制好啦:

获取输出图片

你可以在 WatermarkBuilder 中同时加载文字水印和图片水印。 如果你想在绘制完成之后获得带水印的结果图片,可以使用 Watermark 的 .getOutputImage() 方法:

Bitmap bitmap = WatermarkBuilder

.create(this, backgroundBitmap)

.getWatermark()

.getOutputImage();

创建多个水印

你还可以一次性添加多个水印图片,通过创建一个WatermarkText 的列表 List<> 并且在水印构建器的方法 .loadWatermarkTexts(watermarkTexts)中把列表传入进去(图片类型水印同理):

WatermarkBuilder

.create(this, backgroundBitmap)

.loadWatermarkTexts(watermarkTexts)

.loadWatermarkImages(watermarkImages)

.getWatermark();

加载资源

你还可以从系统的控件和资源中装载图片或者是文字资源,从而创建一个水印对象:

WatermarkText watermarkText = new WatermarkText(editText); // for a text from EditText.

WatermarkText watermarkText = new WatermarkText(textView); // for a text from TextView.

WatermarkImage watermarkImage = new WatermarkImage(imageView); // for an image from ImageView.

WatermarkImage watermarkImage = new WatermarkImage(this, R.drawable.image); // for an image from Resource.

WatermarkBuilder里面的背景图片同样可以从系统资源或者是 ImageView 中装载:

WatermarkBuilder

.create(this, backgroundImageView) // .create(this, R.drawable.background)

.getWatermark()

如果在水印构建器中你既没有加载文字水印也没有加载图片水印,那么处理过后的图片将保持原样,毕竟你啥也没干 :)

隐形水印 (测试版)

androidwm 支持两种模式的隐形水印:

空域 LSB 水印

频域叠加水印

你可以通过WatermarkBuilder 直接构造一个隐形水印,为了选择不同的隐形方式,可以使用布尔参数 isLSB 来区分它们 (注:频域水印扔在开发中),而想要获取到构建成功的水印图片,你需要添加一个监听器:

WatermarkBuilder

.create(this, backgroundBitmap)

.loadWatermarkImage(watermarkBitmap)

.setInvisibleWMListener(true, 512, new BuildFinishListener() {

@Override

public void onSuccess(Bitmap object) {

if (object != null) {

// do something...

}

}

@Override

public void onFailure(String message) {

// do something...

}

});

setInvisibleWMListener 方法的第二个参数是一个整数,表示输入图片最大尺寸,有的时候,你输入的可能是一个巨大的图片,为了使计算算法更加快速,你可以选择在构建图片之前是否对图片进行缩放,如果你让这个参数为空,那么图片将以原图形式进行添加水印操作。无论如何,注意一定要保持背景图片的大小足以放得下水印图片中的信息,否则会抛出异常。

同理,检测隐形水印可以使用类WatermarkDetector,通过一个create方法获取到实例,同时传进去一张加过水印的图片,第一个布尔参数代表着水印的种类,true 代表着检测文字水印,反之则检测图形水印。

WatermarkDetector

.create(inputBitmap, true)

.detect(false, new DetectFinishListener() {

@Override

public void onImage(Bitmap watermark) {

if (watermark != null) {

// do something...

}

}

@Override

public void onText(String watermark) {

if (watermark != null) {

// do something...

}

}

@Override

public void onFailure(String message) {

// do something...

}

});

LSB 隐形空域水印 Demo 动态图:

隐形文字水印 (LSB)隐形图像水印 (LSB)

好啦!请尽情使用吧 :kissing_heart:

使用说明

水印位置

我们使用 WatermarkPosition 这个类的对象来控制具体水印出现的位置。

WatermarkPosition watermarkPosition = new WatermarkPosition(double position_x, double position_y, double rotation);

WatermarkPosition watermarkPosition = new WatermarkPosition(double position_x, double position_y);

在函数构造器中,我们可以设定水印图片的横纵坐标,如果你想在构造器中初始化一个水印旋转角度也是可以的, 水印的坐标系以背景图片的左上角为原点,横轴向右,纵轴向下。

WatermarkPosition 同时也支持动态调整水印的位置,这样你就不需要一次又一次地初始化新的位置对象了, androidwm 提供了一些方法:

watermarkPosition

.setPositionX(x)

.setPositionY(y)

.setRotation(rotation);

在全覆盖水印模式(Tile mode)下,关于水印位置的参数将会失效。

x = y = 0, rotation = 15x = y = 0.5, rotation = -15

横纵坐标都是一个从 0 到 1 的浮点数,代表着和背景图片的相对比例。

字体水印的颜色

你可以在 WatermarkText 中设置字体水印的颜色或者是其背景颜色:

WatermarkText watermarkText = new WatermarkText(editText)

.setPositionX(0.5)

.setPositionY(0.5)

.setTextSize(30)

.setTextAlpha(200)

.setTextColor(Color.GREEN)

.setBackgroundColor(Color.WHITE); // 默认背景颜色是透明的

color = green, background color = whitecolor = green, background color = default

字体颜色的阴影和字体

你可以从软件资源中加载一种字体,也可以通过方法 setTextShadow 设置字体的阴影。

WatermarkText watermarkText = new WatermarkText(editText)

.setPositionX(0.5)

.setPositionY(0.5)

.setTextSize(40)

.setTextAlpha(200)

.setTextColor(Color.GREEN)

.setTextFont(R.font.champagne)

.setTextShadow(0.1f, 5, 5, Color.BLUE);

font = champagneshadow = (0.1f, 5, 5, BLUE)

阴影的四个参数分别为: (blur radius, x offset, y offset, color).

字体大小和图片大小

水印字体和水印图片大小的单位是不同的:

- 字体大小和系统布局中字体大小是类似的,取决于屏幕的分辨率和背景图片的像素,您可能需要动态调整。

- 图片大小是一个从 0 到 1 的浮点数,是水印图片的宽度占背景图片宽度的比例。

image size = 0.3text size = 40

方法列表

对于 WatermarkText 和 WatermarkImage 的定制化,我们提供了一些常用的方法:

方法名称备注默认值

setPosition水印的位置类 WatermarkPositionnull

setPositionX水印的横轴坐标,从背景图片左上角为(0,0)0

setPositionY水印的纵轴坐标,从背景图片左上角为(0,0)0

setRotation水印的旋转角度0

setTextColor (WatermarkText)WatermarkText 的文字颜色Color.BLACK

setTextStyle (WatermarkText)WatermarkText 的文字样式Paint.Style.FILL

setBackgroundColor (WatermarkText)WatermarkText 的背景颜色null

setTextAlpha (WatermarkText)WatermarkText 文字的透明度, 从 0 到 25550

setImageAlpha (WatermarkImage)WatermarkImage 图片的透明度, 从 0 到 25550

setTextSize (WatermarkText)WatermarkText 字体的大小,单位与系统 layout 相同20

setSize (WatermarkImage)WatermarkImage 水印图片的大小,从 0 到 1 (背景图片大小的比例)0.2

setTextFont (WatermarkText)WatermarkText 的字体default

setTextShadow (WatermarkText)WatermarkText 字体的阴影与圆角(0, 0, 0)

setImageDrawable (WatermarkImage)WatermarkImage的图片资源null

WatermarkImage 的一些基本属性和WatermarkText 的相同。

隐形数字水印_轻量级安卓水印框架,支持隐形数字水印 AndroidWM相关推荐

  1. .net core orm框架_轻量级高性能PHP框架ycroute

    YCRoute 目录 框架介绍 运行环境 代码结构 路由配置 过滤验签 控制层 加载器 模型层 数据交互dao层(可选) Redis缓存操作 数据库操作 配置加载 公共类加载 公共函数 日志模块 视图 ...

  2. python restful风格_总结python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法

    python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法 这两天在用python的bottle框架开发后台管理系统,接口约定使用RESTful风格请求,前 ...

  3. 框架下载_最新安卓XDA框架插件下载仓库

    小技能 大乐趣每周小小黑科技技能.软件.干货.影院 微信1秒I语音Mp3|音乐转码器制作语音点歌 有了它再也不用到处找框架模块资源 最新20190502版本 陪伴是最长情的告白 Xposed框架激活 ...

  4. java 轻量级插件化框架_轻量级插件化框架——Small

    photo-1441716844725-09cedc13a4e7.jpg 前言 世界那么大,组件那么小.Small,做最轻巧的跨平台插件化框架. --Galenlin 这是Small作者,林光亮老师, ...

  5. 隐形数字水印_Android 实现图片水印与隐形数字水印

    在使用知乎,微博的时候,我们经常可以看到自己上传的图片被加上了文字水印,在实际的应用开发过程中,很多客户端都需要开发者自己编写 Canvs 绘制图形水印的方法,今天我想在这里介绍一个轻量级的开源 An ...

  6. 安卓本地轻量级数据库操作框架 greenDao3.2.2 详细教程附带Demo①——集成环境,开辟难题。

    欢迎安卓本地轻量级数据库操作框架 greenDao3.2.2 学习之旅. 本套框架博客系列博客目录: 第一篇:认识 greenDao3.2.2 框架,集成环境,开辟难题. 第二篇:简单的进行 增.删. ...

  7. java并发框架支持锁包括,tip/面试题_并发与多线程.md at master · 171437912/tip · GitHub...

    01. java用()机制实现了进程之间的同步执行 A. 监视器 B. 虚拟机 C. 多个CPU D. 异步调用 正解: A 解析: 监视器机制即锁机制 02. 线程安全的map在JDK 1.5及其更 ...

  8. jmeter的java测试框架_性能测试学习之路 (四)jmeter 脚本开发实战(JDBC JMS 接口脚本 轻量级接口自动化测试框架)...

    1.业务级脚本开发 登录脚本->思路:在线程组下新建两个HTTP请求,一个是完成访问登录页,一个是完成登录的数据提交. 步骤如下: 1) 访问登录页 2) 提交登录数据的HTTP PS:对于业务 ...

  9. java轻量级框架_轻量级的Java 开发框架 Spring

    Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development a ...

最新文章

  1. 32岁程序员,补偿N+2:“谢谢裁我,让我翻倍!” 网友:榜样!
  2. 洛谷U4807抽水机[最小生成树]
  3. 关于SharePoint 2010体系架构的几个话题
  4. JS写的一个猜拳游戏
  5. crawler4j_迷你搜索引擎–使用Neo4j,Crawler4j,Graphstream和Encog的基础知识
  6. codeforces 598C C. Nearest vectors(极角排序)
  7. jemalloc/jemalloc.h: No such file or directory
  8. atol、atoll、atof函数
  9. HTML实现简单注册页面
  10. win7计算机系统减肥,win7系统精简瘦身的操作方法
  11. Python实现Reed-Xiaoli(RX)高光谱目标检测算法
  12. 大数据翻页_大数据分页实现与性能优化
  13. 降低技术应用门槛,易现推动“AR+”迈上新台阶
  14. 现在ChatGPT可以使用谷歌插件进行快速交互访问了!
  15. Python 爬取百度音乐
  16. 卸载idea2020删除以前的配置_系统瘦身指南:卸载软件,看着简单,实际贼困难...
  17. kaggle数据集的下载
  18. H5的rem适配方案
  19. 乱砍设计模式之二 -- STATE模式
  20. python音乐库_python - 网易云音乐的 Python 组件库

热门文章

  1. 研大考研不是骗子,了解研大品质
  2. 第Ⅰ部分 Squish教程
  3. 域名系统DNS知识点
  4. android一键换手机,不同品牌手机一键换机:换新手机怎么转移数据?
  5. css颜色的渐变百分比 linear-gradient
  6. springMVC 重定向和转发
  7. Catalan数简介
  8. 第三方测评:IOV智能车链CarBlock阿尔法车链第一车链纷享车链
  9. hal系统命令 android,转换 HAL 模块  |  Android 开源项目  |  Android Open Source Project...
  10. 【Texstudio深色模式】