前言
本文提供java操作图片生成旋转、翻转后的图片工具类,拿来即用。
Maven依赖
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>30.1.1-jre</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.5.2</version> </dependency> <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.5</version> </dependency>
代码
不废话上代码。
package ai.hy.csdn.tools; import cn.hutool.core.util.IdUtil; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import org.bytedeco.javacpp.Loader; import java.io.File; import java.text.MessageFormat; import java.util.Arrays; import java.util.List; /** @Author 剑客阿良_ALiang @Date 2021/11/18 17:40 @Description: 图片移动处理工具 */ public class ImageMoveTool { /** * 垂直翻转 * * @param imagePath 图片地址 * @param outputDir 输出目录 * @return 图片地址 * @throws Exception 异常 */ public static String vflip(String imagePath, String outputDir) throws Exception { List<String> paths = Splitter.on(".").splitToList(imagePath); String ext = paths.get(paths.size() - 1); if (!Arrays.asList("png", "jpg").contains(ext)) { throw new Exception("format error"); } String resultPath = Joiner.on(File.separator).join(Arrays.asList(outputDir, IdUtil.simpleUUID() + "." + ext)); String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class); ProcessBuilder builder = new ProcessBuilder(ffmpeg, "-i", imagePath, "-vf", "vflip", "-y", resultPath); builder.inheritIO().start().waitFor(); return resultPath; } /** * 水平翻转 * * @param imagePath 图片地址 * @param outputDir 输出目录 * @return 图片地址 * @throws Exception 异常 */ public static String hflip(String imagePath, String outputDir) throws Exception { List<String> paths = Splitter.on(".").splitToList(imagePath); String ext = paths.get(paths.size() - 1); if (!Arrays.asList("png", "jpg").contains(ext)) { throw new Exception("format error"); } String resultPath = Joiner.on(File.separator).join(Arrays.asList(outputDir, IdUtil.simpleUUID() + "." + ext)); String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class); ProcessBuilder builder = new ProcessBuilder(ffmpeg, "-i", imagePath, "-vf", "hflip", "-y", resultPath); builder.inheritIO().start().waitFor(); return resultPath; } /** * 旋转 * * @param imagePath 图片地址 * @param outputDir 输出目录 * @param angle 角度 * @return 图片地址 * @throws Exception 异常 */ public static String rotate(String imagePath, String outputDir, Integer angle) throws Exception { List<String> paths = Splitter.on(".").splitToList(imagePath); String ext = paths.get(paths.size() - 1); if (!Arrays.asList("png", "jpg").contains(ext)) { throw new Exception("format error"); } String resultPath = Joiner.on(File.separator).join(Arrays.asList(outputDir, IdUtil.simpleUUID() + "." + ext)); 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", resultPath); builder.inheritIO().start().waitFor(); return resultPath; } /** * 转置 type:0 逆时针旋转90度,对称翻转 type:1 顺时针旋转90度 type:2 逆时针旋转90度 type:3 顺时针旋转90度,对称翻转 * * @param imagePath 图片地址 * @param outputDir 输出目录 * @param type 转置类型 * @return 图片地址 * @throws Exception 异常 */ public static String transpose(String imagePath, String outputDir, Integer type) throws Exception { List<String> paths = Splitter.on(".").splitToList(imagePath); String ext = paths.get(paths.size() - 1); if (!Arrays.asList("png", "jpg").contains(ext)) { throw new Exception("format error"); } String resultPath = Joiner.on(File.separator).join(Arrays.asList(outputDir, IdUtil.simpleUUID() + "." + ext)); String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class); ProcessBuilder builder = new ProcessBuilder( ffmpeg, "-i", imagePath, "-vf", MessageFormat.format("transpose={0}", String.valueOf(type)), "-y", resultPath); builder.inheritIO().start().waitFor(); return resultPath; } }
代码说明
1、vflip主要是对图片做垂直翻转,hflip对图片做水平翻转,rotate对图片做顺时针旋转(参数angle为角度,例如:90),transpose对图片有4个类型的转置(type参数为:0,1,2,3,类型如下图)。
2、输出路径避免重复,使用uuid作为文件名。
3、图片后缀校验目前只有两种,如需增加,自行添加。
验证一下
准备好的图片如下
验证代码
public static void main(String[] args) throws Exception { System.out.println(vflip("C:/Users/huyi/Desktop/2.jpg", "C:/Users/huyi/Desktop/")); System.out.println(hflip("C:/Users/huyi/Desktop/2.jpg", "C:/Users/huyi/Desktop/")); System.out.println(rotate("C:/Users/huyi/Desktop/2.jpg", "C:/Users/huyi/Desktop/", 280)); System.out.println(transpose("C:/Users/huyi/Desktop/2.jpg", "C:/Users/huyi/Desktop/", 2)); }
vflip效果
hflip效果
rotate效果
transpose效果
OK,没什么毛病。
总结
没什么好总结。