当前位置: 首页 > news >正文

javacv-ffmpeg ProcessBuilder实现对图片的旋转

javacv-ffmpeg ProcessBuilder实现对图片的旋转,最近需要处理很多图片,量有点多,所以不能一个一个去编辑旋转图片,所以写一个工具类,实现对图片的旋转

maven配置文件,加上对ffmpeg的依赖,由于ffmpeg依赖cpp,所以加上javacppjavacpp是可以支持调用c/c++方法的库。加上<classifier>标签,因为ffmpeg是基于c语言编写的,在不同平台上的编译结果不同,所以这个标签指定一下平台的类型

<dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><version>1.5.6</version><classifier>windows-x86_64</classifier></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg-platform</artifactId><version>4.4-1.5.6</version></dependency>

如果不想引入两个jar,可以直接引入javacv-platform,但是这个会引入其它的依赖

<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.5</version>
</dependency>

这里使用jdk中的ProcessBuilder 用于创建操作系统进程来运行程序,ProcessBuilder 是jdk提供的用于创建操作系统进程的类,使用Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);支持对ffmpeg(c语言编写)方法的调用

package com.example.common.util.file;import org.bytedeco.javacpp.Loader;
import java.text.MessageFormat;public class PictureProcess {/*** 旋转** @Date 2024/08/27 15:46* @Param imagePath 图片地址* @Param outputPath 输出地址* @Param angle 角度* @return java.lang.String 图片地址*/public static String rotate(String imagePath, String outputPath , Integer angle) throws Exception {String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);ProcessBuilder builder =new ProcessBuilder(ffmpeg,"-i",imagePath,"-vf",MessageFormat.format("rotate=PI*{0}/180", String.valueOf(angle)),"-y",outputPath);builder.inheritIO().start().waitFor();return outputDir;}
}

这里介绍一下弧度的计算公式:弧度= 角度 * Math.PI / 180 PI*{0}/180李的{0}是占位符,来传入角度的值

在这里插入图片描述

写个测试类,将文件夹里的所有图片都旋转90度

@Test
public void testProcess() {File file = new File("D:\\picture");File[] files = file.listFiles();String targetPath = "D:\\picture_NEW";for (File file1 : files) {System.out.println(rotate(file1.getPath(), targetPath +"/"+ file1.getName(), 90));}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【MySQL数据库管理问答题】第1章 MySQL 简介
  • 一文讲清协同过滤,矩阵分解,spark als,显示反馈与隐式反馈
  • 蓝牙耳机百元内怎么选?四款上榜百元品牌机型合集
  • HTB-Explosion(rdp连接)和preignition(目录遍历)
  • 外包干了2年,女朋友跑了...
  • 【Linux】基本命令(第二篇)
  • 【系统分析师】-综合知识-计算机网络与信息安全
  • 无损放大图片,盘点5款最新无损放大图片软件
  • Python和MATLAB和R对比敏感度函数导图
  • Redis单线程和多线程
  • YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】
  • Apache Doris 使用 CBO 和 RBO 结合的优化策略
  • JMeter Plugins之内网插件问题解决
  • 【C++】继承详解
  • Swift性能优化:掌握Swift性能分析工具的实用指南
  • 【前端学习】-粗谈选择器
  • create-react-app项目添加less配置
  • CSS魔法堂:Absolute Positioning就这个样
  • eclipse(luna)创建web工程
  • Hibernate【inverse和cascade属性】知识要点
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Mithril.js 入门介绍
  • Mybatis初体验
  • Tornado学习笔记(1)
  • v-if和v-for连用出现的问题
  • vue 个人积累(使用工具,组件)
  • vue的全局变量和全局拦截请求器
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 力扣(LeetCode)21
  • 一文看透浏览器架构
  • 用jQuery怎么做到前后端分离
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #NOIP 2014# day.2 T2 寻找道路
  • $().each和$.each的区别
  • (10)STL算法之搜索(二) 二分查找
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)计算机毕业设计ssm电影分享网站
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (十三)Maven插件解析运行机制
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原创)可支持最大高度的NestedScrollView
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ******之网络***——物理***
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .Net 8.0 新的变化
  • .NET CLR基本术语