一个轻量级的 Android 图片水印框架,支持隐形数字水印。 English version
下载完整版本水印框架,支持隐形数字水印 (包大小: 1Mb):
implementation 'com.huangyz0918:androidwm:0.2.3'
下载轻量级版本,只支持可见图像水印 (包大小: 28Kb):
implementation 'com.huangyz0918:androidwm-light:0.1.2'
在下载并且配置好 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, new BuildFinishListener<Bitmap>() {
@Override
public void onSuccess(Bitmap object) {
if (object != null) {
// do something...
}
}
@Override
public void onFailure(String message) {
// do something...
}
});
同理,检测隐形水印可以使用类WatermarkDetector
,通过一个create
方法获取到实例,同时传进去一张加过水印的图片。.create
方法的第一个布尔参数是水印的种类(isLSB
),这决定了可检测水印的种类。
WatermarkDetector
.create(inputBitmap, true)
.detect(false, new DetectFinishListener() {
@Override
public void onSuccess(DetectionReturnValue returnValue) {
Bitmap watermarkImage = returnValue.getWatermarkBitmap();
String watermarkString = returnValue.getWatermarkString();
}
@Override
public void onFailure(String message) {
// do something...
}
});
LSB 隐形空域水印 Demo 动态图:
隐形文字水印 (LSB) | 隐形图像水印 (LSB) |
好啦!请尽情使用吧 😘 关于具体的用法和原理介绍,可以查看 Wiki
Copyright 2018 Yizheng Huang
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.