Java 旋转、翻转图片工具类(附代码) | Java工具类

简介: Java 旋转、翻转图片工具类(附代码) | Java工具类

前言

本文提供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,类型如下图)。


image.png


2、输出路径避免重复,使用uuid作为文件名。


3、图片后缀校验目前只有两种,如需增加,自行添加。


验证一下


准备好的图片如下


image.png


验证代码


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效果


image.png


hflip效果


image.png


rotate效果


image.png


transpose效果


image.png


OK,没什么毛病。


总结

没什么好总结。


相关文章
|
4天前
|
设计模式 缓存 算法
编写高效的Java工具类:实用技巧与设计模式
编写高效的Java工具类:实用技巧与设计模式
|
1天前
|
并行计算 Java API
Java中的并发工具类详解
Java中的并发工具类详解
|
2天前
|
设计模式 缓存 算法
编写高效的Java工具类:实用技巧与设计模式
编写高效的Java工具类:实用技巧与设计模式
|
7天前
|
Java
JAVA工具类匹配重复或者连续的字符和符号
JAVA工具类匹配重复或者连续的字符和符号
10 2
|
8天前
|
算法 Java
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
15 3
|
9天前
|
Java easyexcel
java开发excel导入导出工具类基于EasyExcel
java开发excel导入导出工具类基于EasyExcel
19 1
|
4天前
|
Java
用java 将 jb2 文件转图片的方法
用java 将 jb2 文件转图片的方法
|
7天前
|
XML 安全 Java
一篇文章讲明白JAVA常用的工具类
一篇文章讲明白JAVA常用的工具类
|
8天前
|
Java 数据安全/隐私保护
随机密码生成工具类(java)
随机密码生成工具类(java)
16 0
|
9天前
|
Java 数据安全/隐私保护
AES加密工具类(java)
AES加密工具类(java)
43 0