javacv里面有类型转换器的使用,对视频图片的处理工具等等

一、UML图

二、代码

pom依赖


<!-- fastdfs--><dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.27.2</version></dependency><!--JavaCV的依赖--><!-- 视频操作类--><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.4.3</version></dependency><dependency><groupId>org.bytedeco.javacpp-presets</groupId><artifactId>ffmpeg-platform</artifactId><version>4.0.2-1.4.3</version></dependency><!--项目在本地window用FFmpeg-windows-x86_64,项目在Linux用FFmpeg-linux-x86_64--><dependency><groupId>com.github.hoary.ffmpeg</groupId><artifactId>FFmpeg-windows-x86_64</artifactId><version>2.0.1.1</version></dependency><dependency><groupId>com.github.hoary.ffmpeg</groupId><artifactId>FFmpeg-linux-x86_64</artifactId><version>2.0.1.1</version></dependency><!-- 网络资源转File--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.15</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--pdf转图片--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.9</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.9</version></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>

工具类

FileCaseUtil

package com.zykj.healthcode.utils;import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.http.entity.ContentType;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;/*** 文件类型转换* * @author lc* @version 1.0* @date 2022/3/29 16:36*/
@Component
@Slf4j
public class FileCaseUtil {public static final ThreadLocal<String> threadLocal = new ThreadLocal<>();/*** 读取网络中的图片- 网络资源转File* 需要引入依赖commons-io** @param url https://www.kziyue.com/wp-content/uploads/2019/06/5bca-hxyuaph9825616.jpg* @return*/public File URLToFile(String url){File file1 = new File("test.png");try {URL url1 = new URL(url);FileUtils.copyURLToFile(url1,file1);} catch (IOException e) {e.printStackTrace();}File absoluteFile = file1.getAbsoluteFile();return file1;}/*** 文件上传 - 网络资源转MultipartFile* 需要引入依赖spring-web** @param urlStr url地址* @return multipartFile*/public MultipartFile fileUpload(String urlStr) throws Exception {try {//把地址转换成URL对象URL url = new URL(urlStr);//创建http链接HttpURLConnection conn = (HttpURLConnection)url.openConnection();//设置超时间为3秒conn.setConnectTimeout(3*1000);//防止屏蔽程序抓取而返回403错误conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36)");//得到输入流InputStream inputStream = conn.getInputStream();//截取链接中的文件名String fileName= urlStr.substring(urlStr.lastIndexOf("/")+1);MultipartFile multipartFile = new MockMultipartFile(fileName,fileName, ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);return multipartFile;} catch (Exception e) {e.printStackTrace();}throw new Exception();}/*** 文件类型转换 - File转MultipartFile** @param filePath 文件file* @return MultipartFile*/public static MultipartFile caseFileToMultipartFile(File filePath) {MultipartFile multipartFile = null;try {log.info("开始进行文件转换");FileInputStream fileInputStream = new FileInputStream(filePath);multipartFile = new MockMultipartFile(filePath.getName(), filePath.getName(),ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);} catch (IOException e) {e.printStackTrace();return null;}return multipartFile;}/*** 将文件转为字节数组 - File转字节数组** @param file* @param size 1024* @return*/public static byte[] BufferStreamForByte(File file, int size) {byte[] content = null;try {BufferedInputStream bis = null;ByteArrayOutputStream out = null;try {FileInputStream input = new FileInputStream(file);bis = new BufferedInputStream(input, size);byte[] bytes = new byte[1024];int len;out = new ByteArrayOutputStream();while ((len = bis.read(bytes)) > 0) {out.write(bytes, 0, len);}bis.close();content = out.toByteArray();} finally {if (bis != null) {bis.close();}if (out != null) {out.close();}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return content;}/*** Frame转BufferedImage* 需要引入依赖javacv** @param frame* @return*/public static BufferedImage FrameToBufferedImage(Frame frame) {//创建BufferedImage对象Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage bufferedImage = converter.getBufferedImage(frame);return bufferedImage;}/*** BufferedImage转MultipartFile** @param image* @return*/public static MultipartFile fileCase(BufferedImage image){//得到BufferedImage对象// BufferedImage bufferedImage = JoinTwoImage.testEncode(200, 200, url);MultipartFile multipartFile= null;try {//创建一个ByteArrayOutputStreamByteArrayOutputStream os = new ByteArrayOutputStream();//把BufferedImage写入ByteArrayOutputStreamImageIO.write(image, "jpg", os);//ByteArrayOutputStream转成InputStreamInputStream input = new ByteArrayInputStream(os.toByteArray());//InputStream转成MultipartFilemultipartFile =new MockMultipartFile("file", "file.jpg", "text/plain", input);} catch (IOException e) {e.printStackTrace();}return multipartFile;}}

FileUploadUtil

package com.zykj.healthcode.utils;import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;/*** @author lc* @version 1.0* @date 2022/3/29 16:05*/
@Slf4j
@Component
public class FileUploadUtil {private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();private static String group="http://192.168.y.y:8888/group1/";@Autowiredprivate static FastFileStorageClient fastFileStorageClient;public static File URLToFile(String url){log.info("读取FastDFS上的ppt");File file1 = new File("test.pdf");try {URL url1 = new URL(url);FileUtils.copyURLToFile(url1,file1);} catch (IOException e) {e.printStackTrace();}File absoluteFile = file1.getAbsoluteFile();threadLocal.set(absoluteFile.toString());log.info("ppt已经存储到本地"+absoluteFile.toString());return file1;}public static BufferedImage FrameToBufferedImage(Frame frame) {//创建BufferedImage对象Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage bufferedImage = converter.getBufferedImage(frame);return bufferedImage;}public static MultipartFile fileCase(BufferedImage image){//得到BufferedImage对象// BufferedImage bufferedImage = JoinTwoImage.testEncode(200, 200, url);MultipartFile multipartFile= null;try {//创建一个ByteArrayOutputStreamByteArrayOutputStream os = new ByteArrayOutputStream();//把BufferedImage写入ByteArrayOutputStreamImageIO.write(image, "jpg", os);//ByteArrayOutputStream转成InputStreamInputStream input = new ByteArrayInputStream(os.toByteArray());//InputStream转成MultipartFilemultipartFile =new MockMultipartFile("file", "file.jpg", "text/plain", input);} catch (IOException e) {e.printStackTrace();}return multipartFile;}public static String fileLoad(MultipartFile mf) throws IOException {//上传视频并返回视频地址StorePath storePath = fastFileStorageClient.uploadFile(group,mf.getInputStream(), mf.getSize(), mf.getOriginalFilename().substring(mf.getOriginalFilename().lastIndexOf(".")+1));//将视频地址和项目id存到项目资料表中String videoUrl = "http://d-godone.yyy.tech/goDone/" + storePath.getPath();return videoUrl;}
}

抽象类

package com.zykj.healthcode.controller;/*** @author lc* @version 1.0* @date 2022/3/29 16:19*/
public abstract class TypeProcessing {public abstract  String fileUpload(String videoFileName);
}

2.1 上传图片生成缩略图 – FastDFS

package com.zykj.healthcode.controller;import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.fdfs.ThumbImageConfig;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;/*** 图片缩略图** @author lc* @version 1.0* @date 2022/3/29 15:31*/
@Component
public class ImageProcessing extends TypeProcessing{@Autowiredprivate FastFileStorageClient fastFileStorageClient;@Autowiredprivate ThumbImageConfig thumbImageConfig;private  String group="http://192.168.y.y:8888/group1/";/**** @param fileName 本地文件的位置* @return*/@Overridepublic String fileUpload(String fileName) {File file = new File(fileName);// 上传并且生成缩略图StorePath storePath = null;try {storePath = this.fastFileStorageClient.uploadImageAndCrtThumbImage(new FileInputStream(file), file.length(), "png", null);} catch (FileNotFoundException e) {e.printStackTrace();}//String path = thumbImageConfig.getThumbImagePath(storePath.getPath());String imageUrl=group+thumbImageConfig.getThumbImagePath(storePath.getPath());return imageUrl;}}

2.2 上传视频生成缩略图 – javacv

package com.zykj.healthcode.controller;import com.zykj.healthcode.utils.FileCaseUtil;
import com.zykj.healthcode.utils.FileUploadUtil;
import lombok.extern.slf4j.Slf4j;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.awt.image.BufferedImage;/*** @Author: Promsing(张有博)* @Date: 2021/9/18 - 0:37* @Description: 视频的处理类* @version: 1.0*/
@Component
@Slf4j
public class VideoProcessing extends TypeProcessing {@Overridepublic String fileUpload(String videoFileName) {//最后获取到的视频的图片的路径String videPicture="";//Frame对象Frame frame = null;//标识int flag = 0;try {/*获取视频文件*/// FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(videoPath + "/" + videoFileName);FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber( videoFileName);fFmpegFrameGrabber.start();//获取视频总帧数int ftp = fFmpegFrameGrabber.getLengthInFrames();log.info("时长 " + ftp / fFmpegFrameGrabber.getFrameRate() / 60);while (flag <= ftp) {frame = fFmpegFrameGrabber.grabImage();/*对视频的第五帧进行处理*/if (frame != null && flag==5) {//                    //文件转换BufferedImage bufferedImage =FileCaseUtil.FrameToBufferedImage(frame);MultipartFile multipartFile = FileCaseUtil. fileCase(bufferedImage);log.info("开始文件上传:");//文件上传String fileLoad = FileUploadUtil.fileLoad(multipartFile);videPicture=fileLoad;log.info("文件上传成功{}",fileLoad);break;}flag++;}fFmpegFrameGrabber.stop();fFmpegFrameGrabber.close();} catch (Exception E) {E.printStackTrace();}return videPicture;}}

2.3 上传PDF生成缩略图 – pdfbox

package com.zykj.healthcode.controller;import org.apache.pdfbox.rendering.ImageType;
import com.zykj.healthcode.utils.FileCaseUtil;
import com.zykj.healthcode.utils.FileUploadUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;/*** @author lc* @version 1.0* @date 2022/3/29 16:47*/
@Slf4j
@Component
public class PDFProcessing extends TypeProcessing{@Overridepublic String fileUpload(String fileName) {String pdfUrl="";try{//将读取URL生成FileFile file = FileCaseUtil.URLToFile(fileName);// 打开来源 使用pdfbox中的方法PDDocument pdfDocument = PDDocument.load(file);PDFRenderer pdfRenderer = new PDFRenderer(pdfDocument);// 提取的页码int pageNumber = 0;// 以300 dpi 读取存入 BufferedImage 对象int dpi = 300;BufferedImage buffImage = pdfRenderer.renderImageWithDPI(pageNumber, dpi, ImageType.RGB);// 将 BufferedImage 写入到 png// ImageIOUtil.writeImage(buffImage, "c:/temp/xx.png", dpi);//这里使用文件BufferedImage上传// 文件上传MultipartFile multipartFile =FileCaseUtil. fileCase(buffImage);log.info("PDF开始上传:");pdfUrl= FileUploadUtil. fileLoad(multipartFile);log.info("PDF上传成功:{}",pdfUrl);//            //文件储存对象
//            File outPut = new File("C:\\Users\\Administrator\\Videos\\"+ UUID.randomUUID().toString()+".jpg");
//            // ImageIO.write(FrameToBufferedImage(frame), "jpg", outPut);
//            ImageIO.write(buffImage, "jpg",outPut);// 关闭文档pdfDocument.close();//注意关闭文档与删除文档的顺序//删除临时的fileString s = FileCaseUtil.threadLocal.get();System.out.println(s);File f=new File(s);boolean delete = f.delete();System.out.println("文件的删除状态"+delete);}catch (InvalidPasswordException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}return pdfUrl;}
}

三、编码过程中遇到的问题

1.文件截取比较慢,如何解决?

方法:使用多线程

2.通过new File()无法获取网络文件?

File file = new File(“http://d-godone.dmsd.tech/goDone/M00/00/0A/wKg8O2D2mnqEMg7wAAAAALbl5Ys275.pdf”);

方法:使用工具类FileUtils.copyURLToFile(url,file)

3.文件上传需要MultipartFile类型,但是截取出来的类型为Frame和BufferedImage,怎么弄?

方法:查阅资料封装出,文件转换的方法。

fastdfs上传文件资料(PDF,视频,图片,FileCaseUtil,FileUploadUtil)并生成缩略图相关推荐

  1. 上传文件资料并生成缩略图

    目录 一:需求 二:如何实现需求,以及其中遇到的问题? 需求分析时遇到的问题 编码过程中遇到的问题 三:流程图与UML图 四:上传文件资料生成缩略图 1.上传图片生成缩略图--FastDFS 2.上传 ...

  2. fastdfs上传文件_SpringBoot+FastDFS搭建分布式文件系统

    1.pom包配置 我们使用Spring Boot最新版本1.5.9.jdk使用1.8.tomcat8.0. org.csource fastdfs-client-java 1.27-SNAPSHOT ...

  3. fastdfs上传文件时候报错

    在上传文件的时候报错如下; [2018-10-22 18:50:14] ERROR - file: tracker_proto.c, line: 48, server: 192.168.2.111:2 ...

  4. ajax上传文件表单,图片、文件无刷新上传,jquery.form.js的使用

    我们在进行一些web开发时,有时会需要上传文件,图片等等的功能.这篇文章记录一下我实现用ajax实现无刷新上传图片的方法. 我们先要了解一下ajax,在前后端分离的开发环境中ajax被广泛的用原来前后 ...

  5. php 上传文件工具类,PHP 图片上传工具类(支持多文件上传)

    //ImageUploadTool.class.php class ImageUploadTool{ private $file; //文件信息 private $fileList; //文件列表 p ...

  6. 【FASTDFS】fastdfs上传文件报错 org.csource.common.MyException: getStoreStorage fail, errno code: 28 解决方法

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程. 这个报错要从一个tracker ...

  7. fastDFS上传文件后台报错空指针NullPointException

    服务器中部署好之后,用命令上传是可以成功的.返回文件位置id 但页面点击上传文件失败,后台会报空指针 之后在其他地方继续测试上传/下载文件 发现测试会有的成功有的失败 再于服务器用命令测试上传会报错: ...

  8. FASTDFS上传文件时报错,org.csource.commom.MyException:getStoreStorage fail,error code : 28解决办法

    原因:这是因为文件服务器上的磁盘空间不大于10%了 storage上的剩余磁盘空间必须在10%以上才能上传文件成功,否则上传失败. 解决方法: 拓展服务器的内存空间,也可以删除一些不用的文件

  9. android上传文件到服务器(图片、文本等)

    首先,在项目中导入SmartAndroid.jar包. 然后加入相应的方法: public void uploadFile(String imagePath){//服务器端地址String url = ...

最新文章

  1. 2017年深度学习十大趋势预测
  2. Counting Divisors HDU - 6069
  3. 常考数据结构与算法:每k个节点反转链表
  4. python django 表单_Django-表单处理
  5. Awesome-XJTLU 项目宣传
  6. python函数返回多个值时的数据类型是_Python3 注释多个返回值的函数类型
  7. python语音转文字软件_python编写语音转文字软件|语音转文字工具免费版下载(语音批量转换文字) v2.0 最新版_数码资源网...
  8. TF-IDF 提取文本关键词
  9. 被3亿农民力挺,仍惨遭封杀!中国最冤产品,出路在哪?
  10. linux获取主板温度电压_主板供电
  11. 给大家分享10个值得关注的C语言开源项目
  12. 一天一个产品分析之抖音短视频_米米米米粒口红_新浪博客
  13. mine 规范_2016国家最新设计及验收标准名称汇编GB
  14. 北京驾驶证期满换证(2021-06)
  15. 10天竟然只写了一行代码,谁的锅?
  16. darts-clone、RABIT交叉编译
  17. 使用计算机的安全事项,电脑安全使用注意事项
  18. 小技巧:不显示打印对话框直接打印网页到打印机
  19. Arcgis模型导出之一
  20. Xdebug中文文档-堆栈跟踪

热门文章

  1. 精华回顾|观测云CEO蒋烁淼QCon大会《技术创业的体悟》演讲分享
  2. vscode保存卡顿,显示正在从“‘Vetur‘, ‘ESLint‘”获取代码...
  3. 【JAVA基础】重新系统学习Java(五)案例一
  4. 35岁大数据行业从业者,如何培养大数据核心竞争力
  5. python做值班表_如何用Python 实现自动排班
  6. gom引擎和java,GOM和GEE引擎小心!最新漏洞独家首发公布,请各大GM注意了
  7. Android 常用正则表达式,android编程实战
  8. 从战略管理角度看ERP系统信息缺失
  9. linux swift开发环境,Linux平台swift语言开发学习环境搭建
  10. ESXi+黑群晖 由静态ip改回DHCP