-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPNGCompressor.java
More file actions
79 lines (71 loc) · 3.37 KB
/
PNGCompressor.java
File metadata and controls
79 lines (71 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
public class PNGCompressor {
public static void main(String[] args) {
String inputFolder = ".";
String outputFolder = "compressed_images";
File inputDir = new File(inputFolder);
File outputDir = new File(outputFolder);
if (!outputDir.exists()) {
outputDir.mkdirs();
}
File[] files = inputDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".png"));
if (files != null) {
for (File file : files) {
try {
BufferedImage image = ImageIO.read(file);
long originalSize = file.length();
byte[] compressedData = compressImage(image);
if (compressedData.length < originalSize) {
File compressedFile = new File(outputDir, file.getName());
saveImageWithoutMetadata(image, compressedFile);
System.out.println("Saved: " + file.getName() + " (reduced by " + (originalSize - compressedData.length) + " bytes)");
} else {
System.out.println("Skipping: " + file.getName() + " (not smaller " + (originalSize - compressedData.length) + " bytes bigger)");
}
} catch (IOException e) {
System.err.println("Error processing file: " + file.getName());
e.printStackTrace();
}
}
}
}
private static byte[] compressImage(BufferedImage image) throws IOException {
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("png");
if (!writers.hasNext()) {
throw new IOException("No PNG writers available");
}
ImageWriter writer = writers.next();
ImageWriteParam param = writer.getDefaultWriteParam();
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(baos)) {
writer.setOutput(ios);
writer.write(null, new javax.imageio.IIOImage(image, null, null), param);
writer.dispose();
return baos.toByteArray();
}
}
private static void saveImageWithoutMetadata(BufferedImage image, File output) throws IOException {
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("png");
if (!writers.hasNext()) {
throw new IOException("No PNG writers available");
}
ImageWriter writer = writers.next();
ImageWriteParam param = writer.getDefaultWriteParam();
IIOMetadata metadata = writer.getDefaultImageMetadata(new javax.imageio.ImageTypeSpecifier(image), param);
try (ImageOutputStream ios = ImageIO.createImageOutputStream(output)) {
writer.setOutput(ios);
writer.write(null, new javax.imageio.IIOImage(image, null, metadata), param);
} finally {
writer.dispose();
}
}
}