设置相机水印字体的大小、位置 您所在的位置:网站首页 vivos9e照片水印 设置相机水印字体的大小、位置

设置相机水印字体的大小、位置

2024-07-05 11:11| 来源: 网络整理| 查看: 265

需求是根据保存的照片的不同分辨率设置不同大小的文字水印,文字需要黑色描边,白底色,位于照片右下角

水印描边是非常重要的,两种区别明显的颜色(示例代码中使用的就是黑色和白色)可以有效的提升在不同背景下水印的可识别度。

解决方法是获取照片的尺寸,然后根据照片的尺寸进行文字大小的设置;并利用canvas.drawText(test,x,y,paint) 设置文字绘制的位置。

根据Bitmap的尺寸获取水印字体的size /** * 根据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; } 然后根据size去绘制水印字体,并设置绘制的位置 /** * 设置文字颜色、大小、对齐方式 * @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() - painasureText(xy.trim()) - size; float direcAndTimeDrawX = bitmap.getWidth() - painasureText(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 绘制文字属性

45°的水印 /** * 45度的水印 * * @param bmp * @param text * @return */ public static Bitmap drawTextToBitmapDiagonal(Bitmap bmp, String text, int size) { int bmpWidth = bmp.getWidth(); int bmpHeight = bmp.getHeight(); //创建一样大小的图片 Bitmap newBmp = Bitmap.createBitmap(bmpWidth, bmpHeight, Config.ARGB_8888); //创建画布 Canvas canvas = new Canvas(newBmp); canvas.drawBitmap(bmp, 0, 0, null); //绘制原始图片 canvas.save(); canvas.rotate(45, bmpWidth/2, 0); //顺时针转45度 Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.argb(50, 255, 255, 255)); //白色半透明 paint.setTextSize(size); paint.setDither(true); paint.setFilterBitmap(true); Rect rectText = new Rect(); //得到text占用宽高, 单位:像素 paint.getTextBounds(text, 0, text.length(), rectText); //根据,行 和 列 控制绘制 , 绘制国土调查云水印 int widthNum = (int) Math.ceil(bmpWidth / (rectText.width() * 2)); int heightNum = (int) Math.ceil(bmpHeight / (rectText.height() * 2)); for (int i = 0; i < widthNum; i++) { for (int j = 0; j < heightNum; j++) { double beginX = (i * rectText.width() * 2 + rectText.width() / 2) * 1.4; //45度角度值是1.414 double beginY = (j * rectText.width() * 2 + rectText.width() / 2) * 1.4; canvas.drawText(text, (int) beginX, (int) beginY, paint); } } canvas.restore(); return newBmp; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有