这周花三天做了一demo,算上之前的,怎么也有五天,上一篇是opencv介绍,以及定义native方法,通过本地图片路径传参,底层调用Opencv图像库合成,有兴趣的可以看看,这篇重点在于krpano的全景图展示,话说刚才上传了22张片照片合成全景图,感觉有半个小时也没有合成完,我这电脑是有多垃圾
那我们代码走一走(都说不上代码是老流氓)
这是demo的目录结构
@Controller
public class PanoramaController {
/**
* @Description: 文件上传以及全景合成
* @Date: 15:58 2018/7/6
* @Params: * @param null
*/
@RequestMapping("/upload")
public ModelAndView login07(@RequestParam(value = "file", required = false)MultipartFile[] files,
@RequestParam(value = "title",defaultValue = "未命名") String title,HttpServletRequest request) {
ModelAndView mv=new ModelAndView("success.html");
MultipartFile tempMultipartFile;
//基本路径
StringBuffer sb=new StringBuffer();
String baseURL="E:/demo";
String tempStr = "/" + UUID.randomUUID().toString();
for (int j = 0; j < files.length; j++) {
tempMultipartFile = files[j];
// 获得上传的文件名称-带有后缀
String fileNameAndSuffixName = tempMultipartFile.getOriginalFilename();
// 获取上传的文件名称
//String fileName = fileNameAndSuffixName.substring(0, fileNameAndSuffixName.lastIndexOf("."));
String urlPath;
urlPath = Imgeupload.fileUpdata(tempMultipartFile, "E:/demo", "" + tempStr);
System.out.println("=====" + urlPath);
if (j==files.length-2){
sb.append(baseURL+tempStr+"/"+urlPath);
break;
}else if (j
sb.append(baseURL+tempStr+"/"+urlPath+",");
}else {
System.out.println();
}
}
//拼接URL
System.out.println("拼接URL"+sb.toString());
//调用native
String result= OpenCVUtil.changeArrValue(sb.toString());
if(!result.contains(",")){
mv.setViewName("failure.html");
return mv;
}
//System.out.println(result);
//复制图片
String basedirNew=UUID.randomUUID().toString()+","+title;
String dirNew="D:\\tupian\\img\\"+basedirNew+"\\";
try {
copyFile(new File("D:/result.jpg"),new File(dirNew+title+".jpg"),dirNew);
} catch (IOException e) {
e.printStackTrace();
}
mv.addObject("imgUrl","/img/"+basedirNew+"/"+title+".jpg");
mv.addObject("title",title);
mv.addObject("fileName",basedirNew);
return mv;
}
@RequestMapping("/index")
public String login06() {
return "upload.html";
}
/**
* @Description: 复制生成的图片到全景图静态区
* @Date: 9:45 2018/7/5
* @Params: * @param null
*/
public void copyFile(File fromFile, File toFile,String fromUrl) throws IOException {
File file=new File(fromUrl);
if (!file.exists()) {
file.mkdir();
}
FileInputStream ins = new FileInputStream(fromFile);
FileOutputStream out = new FileOutputStream(toFile);
byte[] b = new byte[1024];
int n=0;
while((n=ins.read(b))!=-1){
out.write(b, 0, n);
}
ins.close();
out.close();
}
}
这个主要是文件上传以及全景图合成调用native,生成result.jpg全景图,利用生成的全景图通过krpano工具,生成相应的文件放在tomcat对应webapp,启动tomcat即可访问,这是最开始使用krpano看效果的流程,当然java项目不可能手动复制粘贴文件吧,一切都是通过程序控制,所以不可避免java IO操作,这时遇到一个很大的坑,听我细细道来
当时想已经通过krpano生成的相应的文件复制到webapp这部分的操作通过io进行操作,后来才发现,用IO发现权限不够,我使用的是spring boot 项目,tomcat是嵌入式,所以复制到当前项目classes文件下,那换一条路既然生成的都是静态文件,那从当前的项目,引用绝对路径,从本地获取静态资源,呵呵,通过指定端口当用的项目,静态资源权限只限当前项目,从网上收集许多资料,最终使用
spring:
resources:static-locations: //相当于,这块空间和static目录下,resource下,webjar下同级,
//而这块空间可以io进行操作
好了,这个问题解决了,那java代码如何将某个图片拖到本地某个应用XX.bat上看如下代码
public class CmdBat {
/*public static void main(String[] args) {
Room r = new Room();
//项目的位置
String dpath = "D:\\tupian\\vshow";
//全景图的位置
String file = "3";
String[] fn1 = { "2",
"3" };
String[] fn2 = { "客厅", "卧室","大客厅" };
String title = "哈哈哈哈哈哈哈哈";
String music = "vshow/backgroundmusic/default.mp3";
try {
setKrpano(r,dpath, file, fn1, fn2, title,music);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("上传失败");
}
}*/
/**
* @De