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 的相同。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐