JavaCV读写包含中文路径的图片

JavaCV读写包含中文路径的图片,一直存在问题:中文乱码;无法读取,显示框为中文无法显示。

推测原因是,JavaCV调用OpenCV原生的读写方法时,Java和DLL交互时,字节编码不一致导致的,直接解决不好解决。

现在,思路上做一个转换:

读取过程:文件----->Java2D的Image----->JavaCV的Frame----->Mat;

保存过程:Mat------>JavaCV的Frame----->Java2D的Image---->文件

测试代码

ImageChinese


package com.linghushaoxia.javacv;
import org.bytedeco.javacpp.opencv_core.Mat;
import com.linghushaoxia.image.util.JavaCVUtil;

/**功能说明:测试中文路径下,中文窗口的图像显示
 * @author:linghushaoxia
 * @time:2016年3月31日下午12:38:57
 * @version:1.0
 * 为中国孱弱的技术,
 * 撑起一片自立自强的天空!
 * 
 */
public class ImageChinese {
    public static void main(String[] args) {
	String filePath = "中文/莲花.png";
	//读取mat
	Mat mat = JavaCVUtil.imRead(filePath);
	//显示图像
	JavaCVUtil.imShow(mat, "莲花");
	//保存mat
	JavaCVUtil.imWrite(mat, "中文/莲花-保存.png");
	System.out.println("文件路径:" + filePath);
    }
}

/**
* 现实就是实现理想的过程。
* 
*/

测试效果



读取、展示、保存,均含有中文。转换过程对于程序是透明的,程序主体中数据类型是Mat,只有涉及到I/O,即读写展示时,才会出现编码问题,这一部分由转换方法完成,不影响主程序中,对Mat的处理。

JavaCVUtil


package com.linghushaoxia.image.util;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter.ToMat;

/**功能说明:JavaCV1.1 mat读取/显示工具类
 * @author:linghushaoxia
 * @time:2016年3月31日上午8:49:25
 * @version:1.0
 * 为中国羸弱的技术,
 * 撑起一片自立自强的天空!
 * 
 */
public class JavaCVUtil {
   
  /**
   * 
   * 功能说明:显示图像
   * @param mat
   * 要显示的mat类型图像
   * @param title
   * 窗口标题
   * @time:2016年3月31日下午1:28:01
   * @author:linghushaoxia
   * @exception:
   *
   */
  public static void imShow(Mat mat,String title) {
    ToMat converter = new OpenCVFrameConverter.ToMat();
    CanvasFrame canvas = new CanvasFrame(title, 1);
    canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    canvas.showImage(converter.convert(mat));
    
  }
  /***
   * 
   * 功能说明:显示图像
   * @param filePath
   * 图像路径(可以包含中文)
   * @param title 
   * 窗口标题(可以包含中文)
   * @time:2016年3月31日下午1:26:05
   * @author:linghushaoxia
   * @exception:
   *
   */
  public static void show(String filePath,String title) {
      Mat mat= imRead(filePath);
      imShow(mat, title);
   }

  
  /**
   * 
   * 功能说明:读取图像
   * @param filePath
   * 文件路径,可以包含中文
   * @return Mat
   * @time:2016年3月31日下午1:26:51
   * @author:linghushaoxia
   * @exception:
   *
   */
  public static Mat imRead(String filePath){
      Mat mat = null;
      try {
	  //使用java2D读取图像
	  Image image = ImageIO.read(new File(filePath));
	  /**
	   * 转为mat
	   * 1、由Java2D的image转为javacv自定义的Frame
	   * 2、由Frame转为Mat
	   */
	  Java2DFrameConverter java2dFrameConverter = new Java2DFrameConverter();
	  Frame frame = java2dFrameConverter.convert((BufferedImage) image);
	  ToMat converter = new OpenCVFrameConverter.ToMat();
	  mat = converter.convert(frame);
	  
    } catch (Exception e) {
	System.out.println("读取图像出现异常:filePath="+filePath);
	e.printStackTrace();
    }
      return mat;
  }
  /**
   * 
   * 功能说明:保存mat到指定路径
   * @param mat
   * 要保存的Mat
   * @param filePath 
   * 保存路径
   * @time:2016年3月31日下午8:39:50
   * @author:linghushaoxia
   * @exception:
   *
   */
  public static boolean imWrite(Mat mat,String filePath){
     try {
	 /**
	  * 将mat转为java的BufferedImage
	  */
	  ToMat convert= new ToMat();
	  Frame frame= convert.convert(mat);
	  Java2DFrameConverter java2dFrameConverter = new Java2DFrameConverter();
	  BufferedImage bufferedImage= java2dFrameConverter.convert(frame);
	  ImageIO.write(bufferedImage, "PNG", new File(filePath));
	  
	  return true;
    } catch (Exception e) {
	System.out.println("保存文件出现异常:"+filePath);
	e.printStackTrace();
    }
  return false;
  }
}

/**
* 现实就是实现理想的过程。
* 
*/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值