# zhao-utils 实现 图片 位数 修改与压缩 操作 *开源技术栏* zhao-utils 库中,具有一个 PalettePng 类,其可以将一个 图片 的颜色位数进行修改操作,能够实现良好的图片压缩效果,且性能非常快 其还支持透明度的保留,接下来我们一起来看看如何操作吧! ## 目录 [TOC] ## 开始 ### 准备需要被压缩的图片 在这里我们准备了一个图片,其对应的路径是 `C:\Users\zhao\Downloads\图片2.png`,是一个 32 位的图片,我们接下来可以直接将这个图片进行处理。  ### 导入项目 直接使用 maven 来导入即可! ```xml <dependency> <groupId>io.github.BeardedManZhao</groupId> <artifactId>zhao-utils</artifactId> <version>1.0.20241026</version> <!-- <scope>provided</scope>--> </dependency> ``` ### 开始写代码,进行8位压缩 在这里我们将图片压缩为了8位的png格式,代码中执行了三次压缩,是为了演示性能,第一次压缩需要初始化调色板,因此时间比较久,但是初始化操作结束之后将不需要初始化动作,因此速度会比较快,从这里可以看到单张图片的压缩时间! ```java package org.example; import top.lingyuzhao.utils.PalettePng; import javax.imageio.ImageIO; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public class Main2 { public static void main(String[] args) throws IOException { { try (final FileInputStream fileInputStream = new FileInputStream("C:\\Users\\zhao\\Downloads\\图片2.png")) { final long l = System.currentTimeMillis(); // 这里是关键代码 开始处理操作 final ByteArrayOutputStream byteArrayOutputStream = PalettePng.RGB_8.translate( ImageIO.read(fileInputStream) ); // 到这里处理操作结束 System.out.println(System.currentTimeMillis() - l); byteArrayOutputStream.writeTo(Files.newOutputStream(Paths.get("C:\\Users\\zhao\\Downloads\\defimage21.svg.png"))); byteArrayOutputStream.close(); } } { try (final FileInputStream fileInputStream = new FileInputStream("C:\\Users\\zhao\\Downloads\\图片2.png")) { final long l = System.currentTimeMillis(); // 这里是关键代码 开始处理操作 final ByteArrayOutputStream byteArrayOutputStream = PalettePng.RGB_8.translate( ImageIO.read(fileInputStream) ); // 到这里处理操作结束 System.out.println(System.currentTimeMillis() - l); byteArrayOutputStream.writeTo(Files.newOutputStream(Paths.get("C:\\Users\\zhao\\Downloads\\defimage21.svg.png"))); byteArrayOutputStream.close(); } } { try (final FileInputStream fileInputStream = new FileInputStream("C:\\Users\\zhao\\Downloads\\图片2.png")) { final long l = System.currentTimeMillis(); // 这里是关键代码 开始处理操作 final ByteArrayOutputStream byteArrayOutputStream = PalettePng.RGB_8.translate( ImageIO.read(fileInputStream) ); // 到这里处理操作结束 System.out.println(System.currentTimeMillis() - l); byteArrayOutputStream.writeTo(Files.newOutputStream(Paths.get("C:\\Users\\zhao\\Downloads\\defimage21.svg.png"))); byteArrayOutputStream.close(); } } } } ``` ### 执行结果 下面是执行结果,可以看到初始化结束之后,再次压缩的速度是 99 毫秒左右,速度非常的快 ``` 366 99 96 ``` 我们可以直接观察到压缩之后的图片大小。  ## 其它操作 在这里演示了更多的操作,各位可以慢慢了解!!! ```java import top.lingyuzhao.utils.PaletteGenerator; import top.lingyuzhao.utils.PalettePng; import javax.imageio.ImageIO; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; /** * @author zhao */ public class MAIN { public static void main(String[] args) throws IOException { try (final FileInputStream fileInputStream = new FileInputStream("C:\\Users\\zhao\\Downloads\\图片3.png")) { // 清除调色板,因为我们要调整透明度,在这里执行后 // 再次使用就会重新生成调色板(如果在这里之前没有初始化过调色板就不需要调用这个函数) PalettePng.RGB_8.clearPalette(); // 设置调色板生成器 默认就是 X255 我们在这里更换为 RANDOM255 PalettePng.RGB_8.setPaletteGenerator(PaletteGenerator.RANDOM255); // 设置支持透明度 PalettePng.RGB_8.getPaletteGenerator().setTransparent(true); // 再次生成 final ByteArrayOutputStream byteArrayOutputStream = PalettePng.RGB_8.translate( ImageIO.read(fileInputStream) ); byteArrayOutputStream.writeTo(Files.newOutputStream(Paths.get("C:\\Users\\zhao\\Downloads\\defimage211.svg.png"))); byteArrayOutputStream.close(); } } } ``` ------ ***操作记录*** 作者:[zhao](https://www.lingyuzhao.top//index.html?search=4 "zhao") 操作时间:2024-10-26 11:08:46 星期六 【时区:UTC 8】 事件描述备注:保存/发布 中国 天津 [](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)