JavaCV读写包含中文路径的图片
2016-03-31 23:47
309 查看
JavaCV读写包含中文路径的图片,一直存在问题:中文乱码;无法读取,显示框为中文无法显示。
推测原因是,JavaCV调用OpenCV原生的读写方法时,Java和DLL交互时,字节编码不一致导致的,直接解决不好解决。
现在,思路上做一个转换:
读取过程:文件----->Java2D的Image----->JavaCV的Frame----->Mat;
保存过程:Mat------>JavaCV的Frame----->Java2D的Image---->文件
测试代码
ImageChinese
测试效果
读取、展示、保存,均含有中文。转换过程对于程序是透明的,程序主体中数据类型是Mat,只有涉及到I/O,即读写展示时,才会出现编码问题,这一部分由转换方法完成,不影响主程序中,对Mat的处理。
JavaCVUtil
推测原因是,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; } } /** * 现实就是实现理想的过程。 * */
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树