opencv for java给图片添加水印中文问题

2023-05-16

    opencv提供的给图片添加文字的方法Imgproc.putText()可以给图片添加文字,最后类似一个添加水印的效果,但是这个方法对中文支持不好,在没有字体支持的情况下,默认中文显示?。如下图所示:

    代码如下:

package org.example;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.net.URL;
public class AddWatermark1 {
    public static void main(String[] args) {
        try{
            URL url = null;
            String os = System.getProperty("os.name");
            if(os.startsWith("Linux")){
                url = ClassLoader.getSystemResource("opencvlib/libopencv_java453.so");
            }else{
                url = ClassLoader.getSystemResource("opencvlib/opencv_java453.dll");
            }
            System.load(url.getPath());
            Mat src= Imgcodecs.imread("C:\\Users\\86159\\Pictures\\watermark.png");
            if(src.empty()){
                throw new Exception("no file");
            }
            Mat dst = src.clone();
            int height = src.height();
            int width = src.width();
            //设置遮罩层
            Imgproc.rectangle(dst,new Point(0,height - 200),new Point(width-2,height-2),new Scalar(50,48,48,158),-1);

            Point p=new Point(0,height-120);
            Point p2 = new Point(0,height-54);
            Point p3 = new Point(width-150,height-80);
            //添加时间
            Imgproc.putText(dst, "2022-04-01 09:21:13", p, 4, 0.8, new Scalar(245,168,1),2);
            //添加地点
            Imgproc.putText(dst, "湖北省武汉市", p2, 4, 0.8, new Scalar(245,168,1),2);
            //添加使用人
            Imgproc.putText(dst, "张三", p3, 4, 0.8, new Scalar(245,168,1),2);

            boolean flag = Imgcodecs.imwrite("watermark.png", dst);
            System.out.println("done."+flag);
            //输出图像
        }catch(Exception e){
            System.out.println("例外:" + e);
        }
    }
}

    解决这个乱码问题的办法也不是没有,这个好像需要在编译opencv的时候就把字体添加进去。总体来说,还是很麻烦的。

    还有一种原始的办法,就是回到java.awt提供的画图工具上,使用Graphics2D类提供的办法。这里也给出一个代码:

package org.example;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;

public class AddWatermark2 {
    private static URL picLocationURL;
    private static URL picTimeURL;
    public static void main(String[] args) {
        String path = "C:\\Users\\86159\\Pictures\\watermark.png";
        try {

            URL url = null;
            String os = System.getProperty("os.name");
            if(os.startsWith("Linux")){
                url = ClassLoader.getSystemResource("opencvlib/libopencv_java453.so");
            }else{
                url = ClassLoader.getSystemResource("opencvlib/opencv_java453.dll");
            }
            System.load(url.getPath());
            picLocationURL = ClassLoader.getSystemResource("pic_location.png");
            picTimeURL = ClassLoader.getSystemResource("pic_time.png");
            BufferedImage image = ImageIO.read(new File(path));
            int width = image.getWidth();
            int height = image.getHeight();
            Graphics2D g = image.createGraphics();

            Color fillColor = new Color(50, 48, 48,158);
            g.setColor(fillColor);
            g.fillRect(0,height-200,width,200);
            Color fontColor = new Color(245,168,1);
            g.setColor(fontColor);
            Image locationIcon = new ImageIcon(picLocationURL.getPath()).getImage();
            Image timeIcon = new ImageIcon(picTimeURL.getPath()).getImage();
            g.drawImage(timeIcon,34,height-157,null);
            g.drawImage(locationIcon,34,height-93,null);
            Font font = new Font("微软雅黑",Font.PLAIN,40);
            g.setFont(font);
            g.drawString("2022-04-03 20:53:00",80,height-120);

            g.drawString("湖北省武汉市",80,height-54);
            font = new Font("微软雅黑",Font.PLAIN,44);
            g.setFont(font);
            g.drawString("张三",width-150,height-80);
            g.dispose();
            Mat dst = WeChatQRCodeTool.bufImg2Mat(image,BufferedImage.TYPE_3BYTE_BGR, CvType.CV_8UC3);
            boolean flag = Imgcodecs.imwrite("watermark.png", dst);
            System.out.println("done."+flag);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

    这种办法加水印的效果如下:

 

     中文问题很好解决。

     这个里面使用了微软雅黑字体,在windows下没有问题,但是部署到linux下,可能缺失微软雅黑字体,所以最终还是会显示中文乱码,这个乱码是因为系统缺失字体,直接拷贝windows系统下的msyh.ttf字体文件(C:\Windows\Fonts)到linux字体目录(usr/share/fonts)下新建的目录myfonts即可,系统字体,windows和linux倒是通用的,字体文件要生效,可以执行一个这样的命令:

[root@server myfonts]# fc-cache -fv

     上面提到opencv提供的添加文字Imgproc.putString()要解决中文乱码,需要在opencv提供的依赖库里面编译的时候就安装上字体,显然更麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv for java给图片添加水印中文问题 的相关文章

  • Deepin 下安装 Vmware 无法联网的问题

    问题描述 1 Could not connect 39 Ethernet0 39 to virtual network 39 dev vmnet0 39 解决办法 使用sudo vmware networks start查看是否能够启动网络
  • Mac下使用虚拟专用网络

    虚拟专用网络 xff0c 简称vpn xff0c 目前还是有很多地方有使用到的 xff0c 除了越狱 xff0c 很多公司也会给员工开通虚拟专用网的账号 xff0c 这样 xff0c 员工即使在家里也可以方便的与公司内网进行联通 xff0c
  • Mac下远程连接windows

    如题 xff0c 如果在windows系统下 xff0c 一台机器A如果开启了容许远程连接 xff0c 那么可以直接通过另一台机器B的远程桌面连接客户端 xff0c 输入主机地址 xff0c 然后加上用户名和密码 xff0c 就可以登入机器
  • 索引失效问题整理

    在面试的时候 xff0c 数据库方面的问题对于开发人员来说 xff0c 是绕不过的一个点 xff0c 而数据库方面 xff0c 很少直接面试SQL怎么写 xff0c 而是问效率相关的问题 xff0c 索引是提高查询效率的一种手段 xff0c
  • geoserver配合openlayers框架加载地图

    geoserver地图服务器如果搭建成功 xff0c 那么会有很多图层示例 这些图层可以用作练手示例 在实际工作中 xff0c 可能需要我们自己设计地图 xff0c 自己发布 xff0c 然后使用 这里以上一篇最后发布的中国地图为例 xff
  • Java操作mysql插入记录带时间戳时差问题

    如题所示 xff0c 我们在做mybatis相关项目的时候 xff0c 会用到mysql xff0c 如今更多的是直接使用springboot 43 mybatis组合 这样 xff0c 在配置数据源的时候 xff0c 会有这样的配置 xf
  • ArcGis导入经纬度坐标然后导出shp文件

    如题所示 xff0c 一般使用ArcGis制作shp文件 xff0c 需要数据 xff0c 这里直接利用经纬度坐标即可 1 获取经纬度数据 经纬度坐标从哪里获取 xff0c 这里推荐一个方法 xff1a 使用一个html页面 xff0c 配
  • win10安装ceres环境

    ceres是一个开源的c 43 43 库 xff0c 在windows上安装有点复杂 xff0c 它依赖其他三个库 Eigen gflags glog 好在这些依赖都可以通过源码安装 在windows上进行源码编译安装 xff0c 需要对应
  • 使用ceres库将经纬度坐标GCJ02到WGS84精确转换

    在之前的一篇博客中 xff0c 介绍了经纬度坐标系的关系 xff0c WGS84是世界大地坐标系 xff0c 属于原始坐标系 xff0c 在商用中 xff0c 需要通过火星加密算法将经纬度做转换 xff0c 转换之后的坐标 xff0c 称为
  • 百度地图api调用出现“APP Referer校验失败“错误

    如题所示 xff0c 在使用百度地图API的时候 xff0c 出现App Referer校验失败 这个是因为百度地图安全设置导致 xff0c 解决办法就是进入百度地图开放平台 xff0c 控制台下 xff0c 切换到 xff0c 应用管理
  • postgresql与postgis结合示例

    postgresql支持空间数据存储 postgis是postgresql的一个扩展 与postgresql配合使用 xff0c 需要对应的版本 如果是windows上安装 xff0c 可以参考这里选择对应的postgis版本 如果不安装p
  • vue3 语法糖获取axios返回值,vue3语法和vue2语法区别

    typescript怎么定义全局的函数 第一步 xff0c 双击打开HBuilderX编辑工具 xff0c 新建TypeScript文件并定义类Apple xff0c 定义三个变量a b c xff0c a是具体的数据类型 xff0c 而b
  • 蓝桥杯单片机开发板-数码管显示

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • postgresql导入shp地理文件并用uDig连接postgresql显示地图信息

    postgresql与postgis结合 xff0c 可以很好的支持空间数据库 shp文件可以通过postgis插件安装之后的工具 xff1a PostGIS Boundle 3 for PostgreSQL X64 9 6 Shapefi
  • 快速搭建springboot+mybatis+postgresql开发环境

    这里 xff0c 利用eclipse或者idea提供的springboot项目创建向导 xff0c 不用去找依赖 普通的eclipse需要安装spring插件 可以直接使用sts版本 全称是Spring Tools Suite 在eclip
  • mysql创建hash索引

    mysql支持的存储引擎与索引结构对照表如下 xff1a Storage Engine Permissible Index Types InnoDBBTREEMyISAMBTREEMEMORY HEAPHASH BTREENDBHASH B
  • docker搭建hbase环境

    hbase是hadoop生态中的一员 xff0c 最早搭建hbase xff0c 需要先安装hadoop xff0c 然后安装zookeeper xff0c 再安装hbase 现在通过docker可以直接安装hbase xff0c 而且容器
  • 使用c语言库asn1c对asn文件格式实现编解码

    针对asn文件编解码工作 xff0c asn1c这个开源工具对c c 43 43 的支持非常好 可以很方便的安装和使用 xff0c 目前这个工具是开源的 xff0c 最新版本是0 9 28 xff0c 项目地址 xff1a github c
  • ubuntu20.04版本安装gcc-4.8

    ubuntu20 04版本默认已经将gcc支持的版本更新到了gcc 9 xff0c 如果要降级gcc的版本 xff0c 需要设置新的源 xff0c 然后安装指定版本 xff0c 思路就是这样 可以看到如下这个图片 xff0c 4 8版本对应
  • WinRAR(去广告)中文繁体

    win10系统中 xff0c 如果没有winrar xff0c 可以使用本文提到的这个工具 xff0c 中文繁体 xff0c 不带广告 下载地址 xff1a tools 各种简单的工具 工具放在csdn xff0c 需要积分 xff0c 这

随机推荐

  • 单片机仿真软件proteus8安装与使用

    最近对Arduino 阿德伟诺 微控制器有点兴趣 xff0c 在学习的过程中 xff0c 如果我们没有机器 xff0c 其实可以通过仿真软件来模拟 xff0c 而proteus这个工具就非常适合单片机仿真 为此 xff0c proteus的
  • proteus电路仿真设计图中很多器件之间没有实线连线,它们是怎么实现的?

    如题所示 xff0c 在proteus电路仿真设计图中 xff0c 我们发现 xff0c 电子元器件之间 xff0c 很多时候并没有实线连接 xff0c 但是他们却可以工作 对于新手的我们 xff0c 可能觉着很奇怪 xff0c 独立的器件
  • 七段数码管显示原理研究

    在51单片机学习过程中 xff0c 相对基础的一个实验就是利用七段数码管依次显示数字0 9 很多时候 xff0c 我们按照要求 xff0c 搭建了电路 xff0c 编写了对应的显示控制程序 xff0c 最后运行 xff0c 可能对于七段数码
  • Cloudkitty – OpenStack计费服务

    https mp weixin qq com s biz 61 MzU0NDEyODkzMQ 61 61 amp mid 61 2247494964 amp idx 61 1 amp sn 61 259f86891d8e7bc07debd3
  • 51单片机c语言开发工具keil安装

    单片机分好几种 xff0c 常见的51单片机开发需要安装keil对应c51版本 xff0c 不能安装成了mdk版本 这个需要注意 目前 xff0c 比较好的工具 xff0c windows下自然是keil了 但是它是收费的 xff0c 只能
  • 仿真软件proteus构建LCD1602显示字符串实验

    LCD1602模块的显示需要注意几点 xff1a 1 显示两行 xff0c 第一行的起始地址是0x80 xff0c 第二行的地址是0x80 43 0x40 61 0xC0 2 RS RW EN接线没有说一定要接到P1 P2 P3上 xff0
  • 仿真软件proteus点亮led实验

    在这个实验之前 xff0c 确保系统已经正确安装了proteus和keil工具 proteus是用来设计电路图的 xff0c keil是用来编写c语言代码并编译成芯片可用的hex程序的 前面安装keil的时候 xff0c 最后提到 xff0
  • 仿真软件proteus构建七段数码管显示数字0-9实验

    七段数码管显示原理研究在前一篇博客中已经阐述过 xff0c 就是利用7个数码管构建一个 8 字形 xff0c 然后利用数字的形状特点 xff0c 依次点亮某一些段 xff0c 就可以显示数字了 七段数码管显示数字还是二极管发光原理的利用 这
  • 仿真软件proteus构建LCD1602四线驱动实验

    默认的LCD1602都是8线驱动 xff0c 数据口D0 D7都要接线 xff0c 这种方式对于写数据而言 xff0c 很方便 xff0c 不需要考虑太多 但是因为要的数据线过多 xff0c 在实际布线过程中 xff0c 可能会考虑使用四线
  • 液晶显示屏LCD1602直连STC89C52RC单片机程序

    我买的普中 2单片机类型开发板 xff0c 单片机自带有一排插槽 xff0c 是留给LCD1602显示用的 虽然这个插槽正好可以连接上LCD1602 xff0c 但是因为他的引脚特殊性 xff0c 有三个引脚 xff0c RW RS EN需
  • 记录一次单片机芯片插反通电故障

    昨天晚上在家里捣鼓单片机最小系统 xff0c 把开发板上的芯片从卡座上拆下来 xff0c 然后放在面包板上diy最小系统 xff0c 后来放回去 但是我只记着芯片有缺口的地方朝上 xff0c 并没有记住它从卡座上卸载下来的方向 xff0c
  • mac系统安装win10双系统

    一个月前 xff0c 为了在家里学习单片机 xff0c 在mac book air系统基础上 xff0c 安装了win10 xff0c 搞了一个双系统 在安装之前 xff0c 看了很多资料 xff0c 基本上提到两点 xff0c 一个是准备
  • 谐振电路应用之LED交替闪烁

    谐振电路主要利用三极管特性 xff0c 让电路持续交替出现高低电平的现象 xff0c 根据这个特点 xff0c 可以制作LED交替闪烁的效果 谐振电路图如下所示 xff1a 根据这个图 xff0c 可以很方便的利用三极管 xff0c 电阻
  • Python基础-TypeError:takes 2 positional arguments but 3 were given

    Error xff1a 今天写一段简单类定义python代码所遇到报错问题 xff1a TypeError drive takes 2 positional arguments but 3 were given 代码如下 class Car
  • node使用netcat依赖库做socket编程

    node编程里面 xff0c 默认有一个net库可以做socket编程 xff0c 这里要说的是netcat这个库 xff0c 思路都是一样的 xff0c 甚至代码逻辑都很像 netcat可以支持tcp udp xff0c 同时很方便的构造
  • 荔枝派nano初体验-windows写入镜像到TF卡启动

    荔枝派nano是一个很小的系统 xff0c 搭载全志F1C100S芯片 xff0c 具有ddr内存 xff0c 支持tf flash启动 本人在了解荔枝派的特点之后 xff0c 在淘宝上找到了一个57块钱的荔枝派nano xff0c 一般价
  • linux下socket编程中setsockopt的作用

    如题所示 xff0c 在linux进行socket编程的时候 xff0c 一般而言 xff0c socket bind listen三步曲之后 xff0c 就开始接收客户端请求 xff0c 然后实现收发数据 如下所示的代码 xff0c 是没
  • 悲观锁与乐观锁以及如何用java语言和mysql实现

    悲观锁 xff0c 乐观锁跟字面意思一样 xff0c 悲观锁认为在多线程场景下 xff0c 不一定能够获取资源 xff0c 所以要先获取锁 xff0c 再做相关业务 xff0c 保证不会发生冲突 乐观锁认为多线程场景下 xff0c 不会发生
  • opencv结合微信二维码识别功能实现图片二维码识别

    opencv本身有二维码识别功能 xff0c 但是识别效果不是很好 xff0c 它对二维码图片要求较高 xff0c 虽然可以有图片处理 xff0c 甚至抠出二维码区域 xff0c 但是整体识别与微信二维码识别功能还是有差距的 微信二维码识别
  • opencv for java给图片添加水印中文问题

    opencv提供的给图片添加文字的方法Imgproc putText 可以给图片添加文字 xff0c 最后类似一个添加水印的效果 xff0c 但是这个方法对中文支持不好 xff0c 在没有字体支持的情况下 xff0c 默认中文显示 如下图所