您的位置:首页 > 编程语言 > Java开发

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

2016-03-31 23:47 309 查看
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;
}
}

/**
* 现实就是实现理想的过程。
*
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv 编码 乱码 1.1 java