Android给图片添加半透明背景的水印 (水印带有半透明底色)
给图片添加文字(换行)水印
1、绘制富文本:
/**
* 绘制富文本
* StaticLayout可实现换行
* <p>
* https://my.oschina.net/djonce/blog/805912
*
* @param context
* @param bitmap 背景图片
* @param text 文字内容
* @param size 文字大小
* @param color 文字颜色
* @param paddingLeft
* @param paddingTop
* @param position 方位:1左上;2右上;3右下;4左下
* @return
*/
public static Bitmap drawRichText(Context context, Bitmap bitmap, String text,
int size, int color, int paddingLeft, int paddingTop, int position) {
if (TextUtils.isEmpty(text)) {
return bitmap;
}
paddingLeft = dp2px(context, paddingLeft);
paddingTop = dp2px(context, paddingTop);
Bitmap.Config bitmapConfig = bitmap.getConfig();
if (bitmapConfig == null) {
bitmapConfig = Bitmap.Config.ARGB_8888;
}
bitmap = bitmap.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
// 画背景图
canvas.drawBitmap(bitmap, 0, 0, null);
//创建画笔
TextPaint mPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
//文字矩阵区域
Rect bounds = new Rect();
mPaint.setColor(color);
mPaint.setTextSize(dp2px(context, size));
// 水印的区域
mPaint.getTextBounds(text, 0, text.length(), bounds);
// 文字阴影
// mPaint.setShadowLayer(0.5f, 0f, 1f, Color.YELLOW);
mPaint.setDither(true); // 获取跟清晰的图像采样
mPaint.setFilterBitmap(true);// 过滤一些
// 抗锯齿
mPaint.setAntiAlias(true);
StaticLayout layout = new StaticLayout(text, mPaint, canvas.getWidth() - paddingLeft - paddingLeft, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
//文字坐标
if (position == 1) {
//左上
canvas.translate(paddingLeft, paddingTop);
} else if (position == 2) {
//右上
canvas.translate(canvas.getWidth() - bounds.width() - paddingLeft, paddingTop);
} else if (position == 3) {
//右下
canvas.translate(canvas.getWidth() - bounds.width() - paddingLeft,
canvas.getHeight() - bounds.height() - paddingTop);
} else if (position == 4) {
//左下
canvas.translate(paddingLeft, canvas.getHeight() - bounds.height() - paddingTop);
}
layout.draw(canvas);
//保存所有元素
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return bitmap;
}
方法调用:
注意:文本信息使用\n换行。
String watermarkTime = "地点:北京市\n时间:2020-09-11 16:44:23" ;
Bitmap bitmap = PictureUtil.drawRichText(mContext, bitmap, watermarkTime, 6,Color.RED, 10, 10, 1);
2、同时添加多个水印(日期+地点):
/**
* 绘制富文本
* StaticLayout可实现换行
* @return
*/
public static Bitmap getWatermarkBitmap(Context context, String localUrl, String dateTimeStr, String address) {
int paddingTop = dp2px(context, 10);
Bitmap bitmap = BitmapFactory.decodeFile(localUrl);
Bitmap.Config bitmapConfig = bitmap.getConfig();
if (bitmapConfig == null) {
bitmapConfig = Bitmap.Config.ARGB_8888;
}
bitmap = bitmap.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
//创建画笔
TextPaint mPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(ContextCompat.getColor(context, R.color.white1));
mPaint.setTextSize(dp2px(context, 18));
// 文字阴影
// mPaint.setShadowLayer(0.5f, 0f, 1f, Color.YELLOW);
mPaint.setDither(true); // 获取跟清晰的图像采样
mPaint.setFilterBitmap(true);// 过滤一些
// 抗锯齿
mPaint.setAntiAlias(true);
//日期
Rect rect1 = new Rect();
mPaint.getTextBounds(dateTimeStr, 0, dateTimeStr.length(), rect1);
int datePadding = (bitmap.getWidth() - rect1.width()) / 2;
canvas.drawText(dateTimeStr, datePadding, paddingTop * 4, mPaint);
//地址
Rect rect2 = new Rect();
mPaint.getTextBounds(address, 0, address.length(), rect2); // 水印的区域
//文本自动换行
StaticLayout layout = new StaticLayout(address, mPaint, bitmap.getWidth() - paddingTop * 2, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
canvas.translate(paddingTop, bitmap.getHeight() - paddingTop * 6 - rect2.height());
layout.draw(canvas);
//保存所有元素
canvas.save();
canvas.restore();
return bitmap;
}
方法调用:
val bitmap = PictureUtil.getWatermarkBitmap2(
this,
"$targetPath/test.jpg",
"2022-03-14 16:54:35",
"不生我李淳罡,剑道万古长如夜,这句话出自网脱落小说《雪中悍刀行》",
)