使用javacv,opencv进行保存图片处理无法保存中文路径问题

一、代码逻辑

我得逻辑是传入rtsp流和文件路径来进行截图保存,但是当传入的路径包含中文时那么路径下的图片就不显示也就是保存失败。修改之前的代码如下:

public static String captureScreen(String rtspStreamUrl, String outputFolderPath) {
        String outputFileName = null; // 在try块之外定义outputFileName

        FrameGrabber grabber = new FFmpegFrameGrabber(rtspStreamUrl);
        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();

        try {
            grabber.start();
            Frame frame = null;
            boolean captureOneImage = true;

            while (captureOneImage) {
                frame = grabber.grab();
                if (frame != null) {
                    Mat mat = converter.convert(frame);
                    // Generate a unique file name for each captured image
                    outputFileName = outputFolderPath + "/" + System.currentTimeMillis() + ".jpg";
                    org.bytedeco.opencv.global.opencv_imgcodecs.imwrite(outputFileName, mat);
                    captureOneImage = false; // Set the flag to false to stop capturing after one image
                }

                // Add a delay (adjust as needed)
                Thread.sleep(1000);
            }
        } catch (FrameGrabber.Exception | InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                grabber.stop();
            } catch (FrameGrabber.Exception e) {
                e.printStackTrace();
            }
        }
        return outputFileName; // 在方法的最后返回outputFileName的值
    }

二、修改代码 

1、导入Java2DFrameConverter类:

import org.bytedeco.javacv.Java2DFrameConverter;

2、在代码中使用Java2DFrameConverter进行转换:

// 创建Java2DFrameConverter对象
Java2DFrameConverter converter = new Java2DFrameConverter();
// 将Frame对象转换为BufferedImage对象
BufferedImage image = converter.getBufferedImage(frame);

3、使用PathFiles类来创建文件和目录。这样可以确保文件操作正确处理中文路径。

outputFileName = outputFolderPath + "/" + System.currentTimeMillis() + ".jpg";
Path outputPath = Paths.get(outputFileName);
try {
    Files.createDirectories(outputPath.getParent()); // 创建目录
    org.bytedeco.opencv.global.opencv_imgcodecs.imwrite(outputPath.toString(), mat); //保存图片
} catch (IOException e) {
    e.printStackTrace();
}

三、修改之后的代码

代码修改之后已经可以正常保存带有中文路径的图片了

public static String captureScreen(String rtspStreamUrl, String outputFolderPath) {
        String outputFileName = null; // 在try块之外定义outputFileName
        FrameGrabber grabber = new FFmpegFrameGrabber(rtspStreamUrl);
        //OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
        Java2DFrameConverter converter = new Java2DFrameConverter();
        try {
            grabber.start();
            Frame frame = null;
            boolean captureOneImage = true;

            while (captureOneImage) {
                frame = grabber.grab();
                if (frame != null) {
                    //Mat mat = converter.convert(frame);

                    // Generate a unique file name for each captured image
                    outputFileName = outputFolderPath + "/" + System.currentTimeMillis() + ".jpg";
                    Path outputPath = Paths.get(outputFileName);

                    // 将Mat对象转换为BufferedImage对象
                    BufferedImage image = converter.getBufferedImage(frame);

                    try {
                        Files.createDirectories(outputPath.getParent()); // 创建目录
                        // 保存图片
                        ImageIO.write(image, "jpg", outputPath.toFile());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    captureOneImage = false; // Set the flag to false to stop capturing after one image
                }
                // Add a delay (adjust as needed)
                Thread.sleep(1000);
            }
        } catch (FrameGrabber.Exception | InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                grabber.stop();
            } catch (FrameGrabber.Exception e) {
                e.printStackTrace();
            }
        }
        return outputFileName; // 在方法的最后返回outputFileName的值
    }

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值