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

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

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

解决方法是获取照片的尺寸,然后根据照片的尺寸进行文字大小的设置;并利用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() - 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 绘制文字属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在不同大小的图片上添加相同大小水印,并且保证水印位置相同,你需要根据图片的大小来计算水印位置字体大小。 具体来说,你可以按照以下步骤进行: 1. 首先,确定水印大小位置,以及你想要的字体大小。假设你想要的水印大小是 100x50 像素,位于图片的右下角,字体大小是 16 像素。 2. 然后,获取图片的宽度和高度。假设你的图片大小是 800x600 像素。 3. 计算出水印位置。因为你想要的水印位于图片的右下角,所以你可以将水印的 x 坐标设置为图片宽度减去水印宽度,将水印的 y 坐标设置为图片高度减去水印高度。在本例中,水印位置应该是 (700, 550)。 4. 计算出字体大小。由于你希望每个水印都具有相同的字体大小,因此你需要将字体大小与图片的宽度进行比例缩放。你可以根据水印的宽度和图片的宽度来计算出缩放比例,并将字体大小乘以该比例。在本例中,缩放比例为 0.2(即水印宽度为图片宽度的 0.2 倍),因此字体大小应该是 3.2 像素。 5. 最后,你可以在 canvas 上绘制水印。使用 `drawImage()` 方法将图片绘制到 canvas 上,然后使用 `fillText()` 方法将水印绘制到 canvas 上。在本例中,你需要将水印位置字体大小传递给 `fillText()` 方法。 下面是一个示例代码,演示如何在不同大小的图片上添加相同大小水印,并保持水印位置字体大小相同: ```javascript const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // 假设水印大小是 100x50 像素,位于图片右下角,字体大小是 16 像素 const watermarkWidth = 100; const watermarkHeight = 50; const watermarkFontSize = 16; // 假设图片大小为 800x600 像素 const imageWidth = 800; const imageHeight = 600; // 计算水印位置字体大小 const watermarkX = imageWidth - watermarkWidth; const watermarkY = imageHeight - watermarkHeight; const scale = watermarkWidth / imageWidth; const watermarkFont = `${watermarkFontSize * scale}px Arial`; // 绘制图片和水印 const img = new Image(); img.onload = function() { // 绘制图片 ctx.drawImage(img, 0, 0); // 绘制水印 ctx.font = watermarkFont; ctx.fillStyle = 'rgba(0, 0, 0, 0.5)'; ctx.fillText('watermark', watermarkX, watermarkY); }; img.src = 'image.jpg'; ``` 在上面的代码中,我们首先定义了水印大小位置字体大小,以及图片的大小。然后,我们计算出水印位置字体大小,并将其传递给 `fillText()` 方法。最后,我们在 canvas 上绘制了图片和水印
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值