zhao-utils 实现 图片 位数 修改与压缩 操作
zhao-utils 库中,具有一个 PalettePng 类,其可以将一个 图片 的颜色位数进行修改操作,能够实现良好的图片压缩效果,且性能非常快
其还支持透明度的保留,接下来我们一起来看看如何操作吧!
目录
开始
准备需要被压缩的图片
在这里我们准备了一个图片,其对应的路径是 C:\Users\zhao\Downloads\图片2.png
,是一个 32 位的图片,我们接下来可以直接将这个图片进行处理。
导入项目
直接使用 maven 来导入即可!
<dependency>
<groupId>io.github.BeardedManZhao</groupId>
<artifactId>zhao-utils</artifactId>
<version>1.0.20241026</version>
<!-- <scope>provided</scope>-->
</dependency>
开始写代码,进行8位压缩
在这里我们将图片压缩为了8位的png格式,代码中执行了三次压缩,是为了演示性能,第一次压缩需要初始化调色板,因此时间比较久,但是初始化操作结束之后将不需要初始化动作,因此速度会比较快,从这里可以看到单张图片的压缩时间!
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
我们可以直接观察到压缩之后的图片大小。
其它操作
在这里演示了更多的操作,各位可以慢慢了解!!!
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
操作时间:2024-10-26 11:04:02 星期六 【时区:UTC 8】
事件描述备注:保存/发布
操作记录
操作人员:zhao
操作时间:2024-10-26 11:04:07 星期六
事件描述备注:复制了源文章对应的markdown
文本!