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

    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提供的依赖库里面编译的时候就安装上字体,显然更麻烦。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
在Android上使用OpenCV图片添加文字水印可以通过以下步骤实现: 1. 导入OpenCV库:首先需要在Android项目中导入OpenCV库文件,可以从OpenCV官方网站下载或者使用Gradle依赖方式导入。 2. 图片加载:使用Android提供的方式加载需要加水印图片,例如使用BitmapFactory.decodeResource()方法加载本地资源图片,或者使用第三方库加载网络图片。 3. 创建OpenCV Mat对象:使用OpenCV库提供的Mat类,将加载的图片转为Mat对象用于后续操作。可以使用Imgcodecs.imread()方法将Bitmap转为Mat。 4. 添加文字水印:使用OpenCV提供的绘制文本的方法将文字水印添加到Mat对象中。可以使用Imgproc.putText()方法指定水印的位置、文本内容、颜色、字体大小等参数。 5. 转换为Bitmap:将带有水印的Mat对象转换为Bitmap对象。可以使用Bitmap.createBitmap()方法将Mat转为Bitmap。 6. 保存图片:可以选择将带有水印的Bitmap保存到本地存储器或者上传到服务器。使用Bitmap.compress()方法可以将Bitmap对象转为文件输出流,然后保存到指定路径。 需要注意的是,在添加文字水印之前,可能需要对图片进行一些预处理,例如调整大小、旋转、裁剪等操作,可以使用OpenCV提供的相关方法。 以上是使用OpenCV在Android上给图片加文字水印的简要步骤说明,具体实现可以参考OpenCV官方文档和相关示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值