目录
  • 1. 图片压缩原理
  • 2. ImageIO压缩(java原生)
  • 3.thumbnailator
    • 3.1引入依赖
    • 3.2 图片处理步骤
    • 3.3 使用
      • 3.3.1 构建Thumbnails.Builder
      • 3.3.2 of方法
      • 3.3.3 fromxxx方法
      • 3.3.4 图片尺寸&旋转&水印
      • 3.3.5 输出格式&输出质量
      • 3.3.6 输出
      • 3.3.8 输出到内存输出流(操作内存)
  • 总结

    1. 图片压缩原理

    图片压缩主要分为两种类型:有损压缩和无损压缩

    • 有损压缩:有损压缩通过减少图片中的几余数据来减小图片文件的大小,但会损失定的图片质量。常见的有损压缩算法有JPEG、WebP等。
    • 无损压缩:无损压缩通过优化图片的编码算法来减小图片文件的大小,但不会损失任何图片质量。常见的无损压缩算法有PNG、GIF等
      对于需要压缩至指定大小的需求,我们可以使用有损压缩算法,并通过不断尝试不同的压缩质量来达到目标大小。

    2. ImageIO压缩(java原生)

    3.thumbnailator

    官网地址

    3.1引入依赖

    <!--图片压缩--> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.19</version> </dependency> 

    3.2 图片处理步骤

    3.3 使用

    3.3.1 构建Thumbnails.Builder

    3.3.2 of方法

    有5种重载方法

     * =============of方法============= * scale 代表缩放 * toFile是输出图片的方法 */ @Test public void test() throws IOException { //参数是本地文件路径,支持多参数 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png") .scale(1D) .toFile("C:\\Users\\Administrator\\Desktop\\新建文件夹\\3.png"); } @Test public void test2() throws IOException { // File类型的参数,支持多参数 Thumbnails.of(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png")) .scale(1D) .toFile(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\4.png")); } @Test public void test3() throws IOException { // BufferedImage类型参数 BufferedImage bufferedImage = ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png")); Thumbnails.of(bufferedImage) .scale(1D) .toFile(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\5.jpg")); } @Test public void test4() throws IOException { // FileInputStream类型 InputStream inputStream = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png")); Thumbnails.of(inputStream) .scale(1D) .toFile(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\7.jpg")); } @Test public void test5() throws IOException { // 网络图片 URL url = new URL("https://img1.baidu.com/it/u=,&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500"); Thumbnails.of(url) .scale(1D) .toFile(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\8.jpg")); } 

    3.3.3 fromxxx方法

    / * =============fromImages方法。批量处理BufferedImage类型的图片 ============= * scale 代表缩放 * toFile是输出图片的方法 */ @Test public void test8() throws IOException { // 参数是本地文件路径,支持多参数 URL url = new URL("https://lmg.jj20.com/up/allimg/1114/0Z024/Z024-5-1200.jpg"); URL url2 = new URL("https://lmg.jj20.com/up/allimg/4k/s/02/5O14-0-lp.jpg"); BufferedImage bufferedImage1 = ImageIO.read(url); BufferedImage bufferedImage2 = ImageIO.read(url2); List<BufferedImage> list = new ArrayList<>(); list.add(bufferedImage1); list.add(bufferedImage2); File file = new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\listD\\11.png"); File file2 = new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\listD\\22.png"); List<File> files = new ArrayList<>(); files.add(file); files.add(file2); Thumbnails.fromImages(list) .scale(1D) // 这里必须使用`toFiles`,因为处理的是多图 .toFiles(files);//Rename.SUFFIX_HYPHEN_THUMBNAIL 这里用这个会报错,注意. } / * =============fromInputStreams 方法。批量处理InputStream类型的图片。 ============= * scale 代表缩放 * toFile是输出图片的方法 */ @Test public void test9() throws IOException, URISyntaxException { // 参数是本地文件路径,支持多参数 FileInputStream fileInputStream1 = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\listD\\11.png")); FileInputStream fileInputStream2 = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\listD\\22.png")); List<InputStream> list = new ArrayList<>(); list.add(fileInputStream1); list.add(fileInputStream2); File file = new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\listD\\111.png"); File file2 = new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\listD\\222.png"); List<File> files = new ArrayList<>(); files.add(file); files.add(file2); Thumbnails.fromInputStreams(list) .scale(1D) // 这里必须使用`toFiles`,因为处理的是多图 .toFiles(files);//Rename.SUFFIX_HYPHEN_THUMBNAIL 这里用这个会报错,注意. } 

    3.3.4 图片尺寸&旋转&水印

    图片尺寸控制可以通过width、height,size, forceSize,scale方法控制。

    • 处理的图片必须指定大小,size,width,height,forcesize,scale;不可重复设置同一种类型的属性;有的属性设置会互斥;
    • width、height,size方法会默认保证原始图片比例(可以通过设置keepAspectRatio(false)取消,如果取消则等价于forceSize方法。) 因为收到原始图片宽高比例的限制,即便设置了宽高可能也不会引起图片的尺寸(像素)变化 forceSize则会强制保证宽高,
    • scale是设置图片宽高比例,不大于1的数参数。
    • 有以下异常情况要注意:
      调用width和height方法后不能再使用size或者scale方法,否则会抛出异常。
      调用size方法后不能再使用size,scale方法,否则会抛出异常。
      调用scale方法后不能调用size或keepAspectRatio(boolean) 方法,否则会抛出异常。

    3.3.4.1 等比例缩放,控制宽高比(以实际图 宽高相对长度长的为准)

    比如原图高大于宽,则 size宽设置失效,否则相反

    @Test //等比例缩放, //源:宽:681,长:563,长宽比:0. 压缩结果:宽:110,高:91,长宽比:0. public void test10() throws IOException { //参数是本地文件路径,支持多参数 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png") .size(110, 900) .toFile("C:\\Users\\Administrator\\Desktop\\新建文件夹\\44.png"); } 

    3.3.4.2 forceSize方法,强制控制宽高

    @Test //forceSize方法 //源:宽:681,长:563,长宽比:0. 压缩到:宽:50, public void test11() throws IOException { //参数是本地文件路径,支持多参数 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png") .forceSize(50, 50) .toFile("C:\\Users\\Administrator\\Desktop\\新建文件夹\\test11.png"); } 

    3.3.4.3 scale方法,宽高压缩比例

    @Test //scale 方法 //源:宽:681,长:563,长宽比:0. 压缩到:宽681/2 ,高563/2, public void test12() throws IOException { //参数是本地文件路径,支持多参数 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png") .scale(0.5) .toFile("C:\\Users\\Administrator\\Desktop\\新建文件夹\\test22.png"); } 

    3.3.4.4 rotate方法,控制旋转

    @Test //rotate 方法 //源:宽:681,长:563,长宽比:0. 压缩到:宽681/2 ,高563/2, public void test13() throws IOException { //参数是本地文件路径,支持多参数 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png") .rotate(30) // 旋转30度 .scale(0.5) .toFile("C:\\Users\\Administrator\\Desktop\\新建文件夹\\test22.png"); } 

    3.3.4.5 watermark方法,添加水印

    @Test //watermark 方法 public void test14() throws IOException { //参数是本地文件路径,支持多参数 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png") // 水印放到右下角 .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\watermark.jpg")), 0.5f) .scale(1D) .toFile("C:\\Users\\Administrator\\Desktop\\新建文件夹\\test14.png"); } 

    3.3.5 输出格式&输出质量

     @Test / * outputFormat 方法 * outputFormat(String format)方法用于设置输出文件格式。支持的格式可以通过ImageIO.getWriterFormatNames()获取。 * 常用: JPG jpg tiff bmp BMP gif GIF WBMP png PNG JPEG tif TIF TIFF jpeg wbmp。 * * outputQuality(float quality)设置输出质量,参数介于0和1之间,支持小数,数字越小质量越差。 */ public void test15() throws IOException { //参数是本地文件路径,支持多参数 Thumbnails.of("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png") // 如果不设置默认跟原图片一致 .outputFormat("jpg") // 设置质量 0.1F-1F之间 .outputQuality(0.1F) .scale(1D) .toFile("C:\\Users\\Administrator\\Desktop\\新建文件夹\\test15"); } 

    3.3.6 输出

    3.3.6.1 输出到文件

    • 输出多文件
      批量接入的文件处理完毕后,可以通过toFiles输出到指定目录下。

    public void toFiles(File destinationDir, Rename rename) throws IOException // ①
    public void toFiles(Rename rename) throws IOException // ②
    public void toFiles(Iterable iterable) throws IOException { // ③

    / * public void toFiles(File destinationDir, Rename rename) throws IOException // 只有file类型输入才可以用 * 第一个参数是文件夹路径,第二个参数是文件名处理类型 * NO_CHANGE:文件名不修改。 * PREFIX_DOT_THUMBNAIL:追加 thumbnail.到文件名的开头。例如,给定 picture.jpg,结果为thumbnail.picture.jpg。 * SUFFIX_DOT_THUMBNAIL:.thumbnail追加到文件扩展名之前的文件名。例如,给定 picture.jpg,结果为 picture.thumbnail.jpg * SUFFIX_HYPHEN_THUMBNAIL:-thumbnail追加到文件扩展名之前的文件名。例如,给定 picture.jpg,结果为 picture-thumbnail.jpg。 * * * public void toFiles(Rename rename) throws IOException // ② * 此方法是①的简化,等价于①中的第一个参数destinationDir为空。 * * public void toFiles(Iterable<File> iterable) throws IOException { // ③ * 参数是Iterable类型,也就是说可以给每个文件设置输出文件名。 */ 

    3.3.6.1 输出到单个输出流&多输出流

    @Test //输出到多输出流 public void toOutPUtStreamTest2() throws IOException { OutputStream os = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\新建文件夹\\55.png"); OutputStream os2 = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\新建文件夹\\66.png"); List<OutputStream> list=new ArrayList<>(); list.add(os); list.add(os2); Thumbnails.of("C:\\Users\\Administrator\\Desktop\\新建文件夹\\1.png") .scale(1D) .toOutputStreams(list); } 

    toFiles有三种多态方法

    3.3.7 allowOverwrite 覆盖文件

    3.3.8 输出到内存输出流(操作内存)

    @Test //输出到内存输出流 public void toOutPUtStreamTest3() throws IOException { ByteArrayOutputStream os = new ByteArrayOutputStream();//内存输出流 Thumbnails.of("F:\\company2\\浙江\\02-需求开发\\23年12月\\图片附件上传问题\\2.jpg") .scale(1D) .toOutputStream(os); // os.writeTo(new FileOutputStream(new File("C:\\Users\\Administrator\\Desktop\\新建文件夹\\66.png")));//直接输出 ByteArrayInputStream inputStream = new ByteArrayInputStream(os.toByteArray());//转化为内存输入流 Thumbnails.of(inputStream) .size(200,220) .outputQuality(1D) .toFile("F:\\company2\\浙江\\02-需求开发\\23年12月\\图片附件上传问题\\99"); }

    总结

    到此这篇关于后端java压缩图片的文章就介绍到这了,更多相关java压缩图片内容请搜索本网站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本网站!

    您可能感兴趣的文章:

    • Java 图片压缩实现思路及代码
    • java图片压缩工具类
    • Java中上传图片压缩处理的方法示例
    • Java 实现图片压缩的两种方法
    • java 压缩图片(只缩小体积,不更改图片尺寸)的示例
    • Java实现压缩图片大小