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

来源:互联网 发布:北京数据分析师工资 编辑:程序博客网 时间:2024/05/20 22:28

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";//读取matMat mat = JavaCVUtil.imRead(filePath);//显示图像JavaCVUtil.imShow(mat, "莲花");//保存matJavaCVUtil.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 0
原创粉丝点击