需求是根据保存的照片的不同分辨率设置不同大小的文字水印,文字需要黑色描边,白底色,位于照片右下角
水印描边是非常重要的,两种区别明显的颜色(示例代码中使用的就是黑色和白色)可以有效的提升在不同背景下水印的可识别度。
解决方法是获取照片的尺寸,然后根据照片的尺寸进行文字大小的设置;并利用canvas.drawText(test,x,y,paint) 设置文字绘制的位置。
/**
* 根据Bitmap的尺寸获取水印字体的size
* 照片的分辨率以1080*1920为基准
* 设置缩放比最小阀值,防止某些华为平板图片分辨率过小造成的水印锯齿
*
* @param bitmap
* @return
*/
public static int getBitmapTextSize(Bitmap bitmap) {
// 获取图片的宽和高
int textSize;
// 获取图片的宽和高
int width = bitmap.getWidth();
int height = bitmap.getHeight();
//以分辨率为1920*1080为基准,计算宽高比值
float ratioWidth;
float ratioHeight;
if (width>height) {
ratioWidth = (float) width / 1920;
ratioHeight = (float) height / 1080;
} else {
ratioWidth = (float) width / 1080;
ratioHeight = (float) height / 1920;
}
float ratioMetrics = Math.min(ratioWidth, ratioHeight);
if (ratioMetrics < minLimit) {
ratioMetrics = minLimit;
}
//计算字体大小
textSize = Math.round(38 * ratioMetrics);
return textSize;
}
/**
* 设置文字颜色、大小、对齐方式
* @param context
* @param bitmap
* @param text
* @param size
* @return
*/
public static Bitmap drawTextToRightBottom(Context context, Bitmap bitmap, String text, int size) {
TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(0x99FFFFFF);
paint.setTextSize(size);
paint.setTextAlign(Paint.Align.LEFT);
return drawTextToBitmap(bitmap, text, paint, size);
}
/**
* 图片上绘制文字
* 该方法中计算的绘制位置是图片的右下角
* @param bitmap
* @param text
* @param paint
* @param size
* @return
*/
private static Bitmap drawTextToBitmap(Bitmap bitmap, String text, TextPaint paint, int size) {
android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
//描边TextPaint,TextSize、TextBounds、TextAlign全部和传进来的paint一致
TextPaint paintStroke = new TextPaint(Paint.ANTI_ALIAS_FLAG);
paintStroke.setTextSize(paint.getTextSize());
paintStroke.setColor(0xDD060606);
paintStroke.getTextBounds(text, 0, text.length(), new Rect());
paintStroke.setStyle(Paint.Style.STROKE);
paintStroke.setTextAlign(paint.getTextAlign());
paint.setDither(true); // 获取跟清晰的图像采样
paint.setFilterBitmap(true);// 过滤一些
if (bitmapConfig == null) {
bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
}
bitmap = bitmap.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
Rect textBounds = new Rect();
paint.getTextBounds(text, 0, text.length(), textBounds);
String[] strs = text.split(",");
String xy = strs[0] + "," + strs[1];
String direcAndTime = strs[2] + "," + strs[3];
//右边和底边都留一个size的距离
float xyDrawX = bitmap.getWidth() - paint.measureText(xy.trim()) - size;
float direcAndTimeDrawX = bitmap.getWidth() - paint.measureText(direcAndTime.trim()) - size;
float xyDrawY = bitmap.getHeight() - 3 * size;
float direcAndTimeDrawY = bitmap.getHeight() - 2 * size;
canvas.drawText(xy, xyDrawX, xyDrawY, paint);
canvas.drawText(direcAndTime, direcAndTimeDrawX, direcAndTimeDrawY, paint);
canvas.drawText(xy, xyDrawX, xyDrawY, paintStroke);
canvas.drawText(direcAndTime, direcAndTimeDrawX, direcAndTimeDrawY, paintStroke);
return bitmap;
}
注意
setTextAlign(Align align) 设置对齐方式,会影响文字的绘制起始位置,这个在实现文字位于右下角显示时会有影响。
- Paint.Align.LEFT 左对齐
- Paint.Align.CENTER 中心对齐,绘制从
- Paint.Align.RIGHT 右对齐
设置这三个属性后,在画布上绘制文字( canvas.drawText(test,x,y,paint)
) 时要注意 x 坐标 ,
因为,LEFT 对应 0,CENTER 对应 getWidth()/2 , RIGHT 对应 getWidth() ,要把这个偏移考虑进去,
否则,绘制会出现错乱。
更多细节请 baidu-->Paint / TextPaint 的使用
Android 自定义View学习(三)——Paint 绘制文字属性