压缩图片(压缩一次,尽可能接近目标大小)
public static void main(String[] args) {
String sourceImagePath = "C:\\Users\\sam\\Desktop\\aa0f40db2c520cce9e3624a8978dc6a.jpg";
String destinationImagePath = "C:\\Users\\sam\\Desktop\\image_compressed.jpg";
int targetMemorySizeKB = 100;
try {
BufferedImage originalImage = ImageIO.read(new File(sourceImagePath));
int originalSizeKB = getMemorySizeKB(originalImage);
if (originalSizeKB <= targetMemorySizeKB) {
System.out.println("Image is already smaller than target memory size.");
return;
}
float compressRatio = (float) targetMemorySizeKB / (float) originalSizeKB;
int newWidth = (int) (originalImage.getWidth() * Math.sqrt(compressRatio));
int newHeight = (int) (originalImage.getHeight() * Math.sqrt(compressRatio));
BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, newWidth, newHeight, null);
g.dispose();
File compressedImageFile = new File(destinationImagePath);
ImageIO.write(resizedImage, "jpg", compressedImageFile);
} catch (IOException e) {
e.printStackTrace();
}
}
private static int getMemorySizeKB(BufferedImage image) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
ImageIO.write(image, "jpg", outputStream);
} catch (IOException e) {
e.printStackTrace();
return 0;
}
return outputStream.size() / 1024;
}
递归压缩
public static void main(String[] args) {
String sourceImagePath = "C:\\Users\\sam\\Desktop\\aa0f40db2c520cce9e3624a8978dc6a.jpg";
String destinationImagePath = "C:\\Users\\sam\\Desktop\\image_compressed.jpg";
int targetSizeKB = 100;
int diffSizeKB = 100;
int initSizeKB = Integer.MAX_VALUE;
int compressAfterSizeKB = 0;
try {
BufferedImage originalImage = ImageIO.read(new File(sourceImagePath));
int originalSizeKB = getMemorySizeKB(originalImage);
initSizeKB = originalSizeKB;
if (originalSizeKB <= targetSizeKB) {
return;
}
float compressRatio = (float) targetSizeKB / (float) originalSizeKB;
BufferedImage compressedImage = compressImage(originalImage, compressRatio);
compressAfterSizeKB = getMemorySizeKB(compressedImage);
while (compressAfterSizeKB > targetSizeKB && initSizeKB - compressAfterSizeKB > diffSizeKB) {
compressRatio = 0.8f;
initSizeKB = compressAfterSizeKB;
compressedImage = compressImage(compressedImage, compressRatio);
compressAfterSizeKB = getMemorySizeKB(compressedImage);
}
File compressedImageFile = new File(destinationImagePath);
ImageIO.write(compressedImage, "jpg", compressedImageFile);
} catch (IOException e) {
e.printStackTrace();
}
}
private static BufferedImage compressImage(BufferedImage image, float compressRatio) {
int newWidth = (int) (image.getWidth() * Math.sqrt(compressRatio));
int newHeight = (int) (image.getHeight() * Math.sqrt(compressRatio));
BufferedImage resizedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(image, 0, 0, newWidth, newHeight, null);
g.dispose();
return resizedImage;
}
private static int getMemorySizeKB(BufferedImage image) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
ImageIO.write(image, "jpg", outputStream);
} catch (IOException e) {
e.printStackTrace();
return 0;
}
return outputStream.size() / 1024;
}