设置相机水印字体的大小、位置_平板拍照的水印字体大小-程序员宅基地

技术标签: 相机水印  

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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37168878/article/details/80738247

智能推荐

Linux中rsyslog与journal对系统日志进行管理_rsyslog journal-程序员宅基地

文章浏览阅读3.2k次。系统日志在管理中的作用:系统日志具有审计与监测作用,通过对日志中相关信息的分析,可以检查系统发生错误的相关信息,实时进行监控。有效利用日志信息并会分析与监控管理,对维护系统安全性有重要作用。系统日志分类###系统日志一般存放在/var/log/file下/var/log/messages ###记录服务信息,系统报错信息等/var/log/secure ###存放用户认证相关信..._rsyslog journal

2021 年软件开发趋势大预测!-程序员宅基地

文章浏览阅读520次。点击上方“逆锋起笔”,公众号回复编程资源领取大佬们推荐的学习资料作者| Md Kamaruzzaman译者|张健欣策划| InfoQ蔡芳芳对于软件开发行业来说,2020 年是意..._未来软件开发技术的演变方向 csdn

linux内核更新前后配置文件的比较-程序员宅基地

文章浏览阅读1.1k次。说明:这里先给出一个比较的结果,作为记录,后续会给出内核配置差异的详细解释。[root@xiaolyu linux-4.7.2]# diff .config .config_bak 3c3< # Linux/x86_64 3.10.0-327.el7.x86_64 Kernel Configuration---> # Linux/x86 4.7.2 Kernel Configur..._kernel configuration config_arch_mmap_rnd_bits_min

单片机实验笔记(汇编、Proteus仿真)_protues的单片机基础实验与课程设计开关控制共阴极数码管 汇编语言-程序员宅基地

文章浏览阅读6.2k次,点赞32次,收藏141次。实验基础51单片机本门课程硬件平台为ATMEL公司的AT89C52单片机,在Proteus软件进行仿真实验。51单片机是8位单片机、8k ROM 、256bytes RAM、四个8位并行I/O口汇编语言本门课程使用汇编语言编程。51单片机汇编指令;汇编语言指令格式[标号:] 操作码 [第一操作数] [,第二操作数] [,第三操作数] [;注释] 操作码操作数字节数周期数数据传递类指令MOVA,Rn寄存器传送到累加器1MOVA,dire_protues的单片机基础实验与课程设计开关控制共阴极数码管 汇编语言

Java基于web的健康饮食信息管理系统(开题+源码)_基于web技术的家庭健康管理系统开题报告-程序员宅基地

文章浏览阅读264次。然而,如何在繁忙的生活中保持健康饮食,是许多人面临的挑战。该系统的研究意义在于,通过信息化的手段,帮助用户了解自己的饮食习惯,掌握食材的热量摄入,科学地进行饮食登记,记录运动情况,接收运动提醒,并得到个性化的饮食建议,从而更好地实现健康饮食的目标。本系统的研究目的在于解决现有健康饮食管理的痛点,通过构建一个具有用户友好性、易操作性的健康饮食信息管理系统,帮助用户提高健康饮食的意识,改善饮食习惯,实现健康生活。2023年4月至5月:文档编写和培训,编写用户手册和系统文档,并进行相关人员的培训。_基于web技术的家庭健康管理系统开题报告

nodejs 通过本地终端询问chat-gpt、智普ai寻找答案!_nodejs 智谱ai-程序员宅基地

文章浏览阅读519次,点赞11次,收藏7次。nodejs 通过本地终端询问chat-gpt、智普ai寻找答案!_nodejs 智谱ai

随便推点

R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用plot函数可视化模型诊断图(第二幅图可视化QQ图、判断残差是否符合正态分布)-程序员宅基地

文章浏览阅读393次。R语言使用lm函数构建简单线性回归模型(建立线性回归模型)、拟合回归直线、使用plot函数可视化模型诊断图(第二幅图可视化QQ图、判断残差是否符合正态分布)

加密文件如何解密?_文件解密-程序员宅基地

文章浏览阅读1.1k次。加密文件如何解密?_文件解密

腾讯面试之软件测试_腾讯广研软件测试复试-程序员宅基地

文章浏览阅读4.4k次,点赞3次,收藏5次。前期准备:看了一个星期的程序员面试宝典,并且参考了数据结构书籍。网申填写了一份电子简历,之后就按部就班的学习。结果简历筛选为过,未收到腾讯短信通知,有点郁闷,想就此结束,准备百度实习招聘。但是经过思想斗争,最后还会决定和同学一块参加了霸笔。笔试:霸笔的人被安排在一个房间,按填报岗位,分区入座。结果偌大的教室里竟然绝大部分都是研发。监考人员说这个房间的人不一定每人都有试卷。我来的较晚_腾讯广研软件测试复试

从零配置webpack-vue项目(2)-程序员宅基地

文章浏览阅读899次,点赞28次,收藏21次。const path = require(‘path’) //需要引入node模块const VueLoaderPlugin = require(‘vue-loader/lib/plugin’) //vue插件const HtmlWebpackPlugin = require(‘html-webpack-plugin’) //html插件//自动清理打包后文件插件entry:{},output:{ //导出文件配置。

[MATLAB&SIMULINK] 如何提取并处理Simscape Power System 中powergui的谐波分析数据-程序员宅基地

文章浏览阅读3.1k次,点赞5次,收藏22次。花了一两个小时研究了一番powergui的fft。在powergui中,FFT Analysis Tool如图所示开发环境:MATLAB R2015a + Window 10 enterpirse那么如果我想提取出Simulink模型中的数据并且做fft处理,得到自己想要的分析图像,应该怎么办呢?方法一:其实MATLAB在这个过程中调用了power_fftscop..._simulink simscape 频谱

elementUI 日期时间选择器el-date-picker开始时间与结束时间约束_el-date-picker属性-程序员宅基地

文章浏览阅读7.6k次,点赞10次,收藏21次。1.设置el-date-picker的属性:picker-options <el-date-picker :picker-options="startDatePicker"></el-date-picker> <el-date-picker :picker-options="endDatePicker"></el-date-picker>2..._el-date-picker属性

推荐文章

热门文章

相关标签