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,没什么毛病。


总结

没什么好总结。


相关文章
|
6月前
|
前端开发 JavaScript Java
Java中将图片转换为base64格式的技巧
这样,你就可以在Java中将图片转换为Base64格式了。这个方法的实现非常简单,只需要使用Java的内置库,无需任何额外的库。希望这个方法对你有所帮助。
374 22
|
7月前
|
人工智能 JSON Java
列表结构与树结构转换分析与工具类封装(java版)
本文介绍了将线性列表转换为树形结构的实现方法及工具类封装。核心思路是先获取所有根节点,将其余节点作为子节点,通过递归构建每个根节点的子节点。关键在于节点需包含 `id`、`parentId` 和 `children` 三个属性。文中提供了两种封装方式:一是基于基类 `BaseTree` 的通用工具类,二是使用函数式接口实现更灵活的方式。推荐使用后者,因其避免了继承限制,更具扩展性。代码示例中使用了 Jackson 库进行 JSON 格式化输出,便于结果展示。最后总结指出,理解原理是进一步优化和封装的基础。
205 0
|
12月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
957 1
|
12月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
373 4
|
12月前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
231 2
|
12月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
136 1
|
12月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
540 1
|
12月前
|
算法 小程序 Java
java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上
这篇文章介绍了如何使用Java获取微信小程序的二维码,并将其调整大小后合成到海报(另一张图片)上。
218 0
|
12月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
204 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
12月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
677 0