java 实现图片压缩

转载https://www.cnblogs.com/strongmore/p/14158639.html

复制代码
添加依赖

<dependency>
  <groupId>net.coobird</groupId>
  <artifactId>thumbnailator</artifactId>
  <version>0.4.8</version>
</dependency>

按质量压缩
 
import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;

public class Client {

  public static void main(String[] args) throws Exception {
    Thumbnails.of(new File("D:/showqrcode.jpg"))
        .scale(1f) //图片大小(长宽)压缩比例 从0-1,1表示原图
        .outputQuality(0.5f) //图片质量压缩比例 从0-1,越接近1质量越好
        .toOutputStream(new FileOutputStream("D:/showqrcode_50.jpg"));
  }

}
复制代码
复制代码
按比例缩放

import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;

public class Client2 {

  public static void main(String[] args) throws Exception {
    Thumbnails.of(new File("D:/showqrcode.jpg"))
        .scale(0.5f) //图片大小(长宽)压缩 从0按照
        .outputQuality(0.5f) //图片质量压缩比例 从0-1,越接近1质量越好
        .toOutputStream(new FileOutputStream("D:/showqrcode_50%.jpg"));
  }

}
复制代码
复制代码
按大小和比例缩放

import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;

public class Client21 {

  public static void main(String[] args) throws Exception {
    Thumbnails.of(new File("D:/showqrcode.jpg"))
        .size(500, 300) // 图片比例不变
        .toOutputStream(new FileOutputStream("D:/showqrcode_500_300.jpg"));
  }

}
复制代码
复制代码
按大小缩放

import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;

public class Client22 {

  public static void main(String[] args) throws Exception {
    Thumbnails.of(new File("D:/showqrcode.jpg"))
        .forceSize(500, 300) //不保持图片比例
        .toOutputStream(new FileOutputStream("D:/showqrcode_500_300.jpg"));
  }

}
复制代码
复制代码
旋转 
import java.io.File;
import java.io.FileOutputStream;
import net.coobird.thumbnailator.Thumbnails;

public class Client3 {

  public static void main(String[] args) throws Exception {
    Thumbnails.of(new File("D:/showqrcode.jpg"))
        .forceSize(500, 300)
        .rotate(90f) //向右旋转
        .toOutputStream(new FileOutputStream("D:/showqrcode+90.jpg"));
  }

}
复制代码
复制代码
加水印
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

public class Client4 {

  public static void main(String[] args) throws IOException {
    Thumbnails.of("D:/showqrcode.jpg")
        .size(1280, 1024)
        .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("D:/watermark.jpg")),
            0.5f) //位置,水印来源,透明度
        .outputQuality(0.8f)
        .toFile("D:/showqrcode_watermark_bottom_right.jpg");
  }

}
复制代码
复制代码
裁剪

import java.io.IOException;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

public class Client5 {

  public static void main(String[] args) throws IOException {
    Thumbnails.of("D:/showqrcode.jpg")
        .sourceRegion(Positions.CENTER, 800, 600) //位置,宽,高
        .size(800, 600)
        .keepAspectRatio(false)
        .toFile("D:/showqrcode_region_center.jpg");
  }

}
复制代码
复制代码
拼接

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.imageio.ImageIO;

public class Client6 {

  public static void main(String[] args) throws Exception {
    byte[] bytes = joinImages(false, new File("D:/showqrcode.jpg"), new File("D:/showqrcode.jpg"));
    if (Objects.nonNull(bytes)) {
      new ByteArrayInputStream(bytes).transferTo(new FileOutputStream("D:/showqrcode_join.jpg"));
    }
  }

  /**
   * 将多张图片拼接成一张
   *
   * @param horizontal 是否为水平拼接
   * @param files 文件列表
   * @return 拼接后的文件字节数组
   */
  private static byte[] joinImages(boolean horizontal, File... files) throws IOException {
    if (Objects.isNull(files) || files.length == 0) {
      return null;
    }
    List<BufferedImage> imageList = new ArrayList<>();
    for (File file : files) {
      BufferedImage image = ImageIO.read(file);
      imageList.add(image);
    }
    int height = imageList.get(0).getHeight();
    int width = imageList.get(0).getWidth();
    if (horizontal) {
      width = imageList.stream().mapToInt(BufferedImage::getWidth).sum();
    } else {
      height = imageList.stream().mapToInt(BufferedImage::getHeight).sum();
    }
    //创建拼接后的图片画布,参数分别为宽,高,类型,这里我们使用RGB3元色类型
    BufferedImage resultImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics graphics = resultImage.getGraphics();
    int previousWidth = 0;
    int previousHeight = 0;
    for (BufferedImage image : imageList) {
      //向画布上画图片
      graphics.drawImage(image, previousWidth, previousHeight, null);
      if (horizontal) {
        previousWidth += image.getWidth();
      } else {
        previousHeight += image.getHeight();
      }
    }
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    ImageIO.write(resultImage, "jpg", output);
    return output.toByteArray();
  }
}
复制代码

 

posted @   ___mouM  阅读(6616)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2019-04-19 Oracle day04 DML_事务_序列_视图_数据类型_DDL

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示