图片分页
This commit is contained in:
114
src/main/java/com/example/sso/dao/ThumbnailCompressor.java
Normal file
114
src/main/java/com/example/sso/dao/ThumbnailCompressor.java
Normal file
@ -0,0 +1,114 @@
|
||||
package com.example.sso.dao;
|
||||
|
||||
import net.coobird.thumbnailator.Thumbnails;
|
||||
import net.coobird.thumbnailator.geometry.Positions;
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.*;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
public class ThumbnailCompressor {
|
||||
|
||||
private static final long MAX_SIZE = 300 * 1024; // 500KB
|
||||
|
||||
/**
|
||||
* 使用Thumbnailator压缩图片
|
||||
*/
|
||||
public static long compressWithThumbnailator(String inputPath, String outputPath) throws IOException {
|
||||
File inputFile = new File(inputPath);
|
||||
long fileSize = inputFile.length();
|
||||
|
||||
System.out.println("原始大小: " + formatFileSize(fileSize));
|
||||
|
||||
// 如果小于500KB,直接复制
|
||||
if (fileSize <= MAX_SIZE) {
|
||||
Files.copy(inputFile.toPath(), Paths.get(outputPath));
|
||||
return fileSize;
|
||||
}
|
||||
|
||||
// 获取图片尺寸
|
||||
BufferedImage originalImage = ImageIO.read(inputFile);
|
||||
int width = originalImage.getWidth();
|
||||
int height = originalImage.getHeight();
|
||||
|
||||
// 计算缩放比例
|
||||
float scale = 1.0f;
|
||||
if (width > 1920 || height > 1080) {
|
||||
float widthRatio = 1920f / width;
|
||||
float heightRatio = 1080f / height;
|
||||
scale = Math.min(widthRatio, heightRatio);
|
||||
}
|
||||
|
||||
// 逐步压缩
|
||||
float quality = 0.9f;
|
||||
long compressedSize = Long.MAX_VALUE;
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
|
||||
while (quality > 0.1f && compressedSize > MAX_SIZE) {
|
||||
baos.reset();
|
||||
|
||||
Thumbnails.of(inputFile)
|
||||
.scale(scale)
|
||||
.outputQuality(quality)
|
||||
.outputFormat("jpg")
|
||||
.toOutputStream(baos);
|
||||
|
||||
compressedSize = baos.size();
|
||||
System.out.println("质量: " + quality + ", 大小: " + formatFileSize(compressedSize));
|
||||
|
||||
quality -= 0.1f;
|
||||
}
|
||||
|
||||
// 保存文件
|
||||
try (FileOutputStream fos = new FileOutputStream(outputPath)) {
|
||||
fos.write(baos.toByteArray());
|
||||
}
|
||||
|
||||
return compressedSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量压缩
|
||||
*/
|
||||
public static void batchCompress(String inputDir, String outputDir, long maxSize) throws IOException {
|
||||
File dir = new File(inputDir);
|
||||
File[] imageFiles = dir.listFiles((d, name) ->
|
||||
name.toLowerCase().endsWith(".jpg") ||
|
||||
name.toLowerCase().endsWith(".jpeg") ||
|
||||
name.toLowerCase().endsWith(".png") ||
|
||||
name.toLowerCase().endsWith(".bmp")
|
||||
);
|
||||
|
||||
if (imageFiles == null) return;
|
||||
|
||||
for (File imageFile : imageFiles) {
|
||||
String outputPath = outputDir + File.separator + "compressed_" + imageFile.getName();
|
||||
long compressedSize = compressWithThumbnailator(imageFile.getPath(), outputPath);
|
||||
|
||||
System.out.println(imageFile.getName() +
|
||||
" 压缩后: " + formatFileSize(compressedSize));
|
||||
}
|
||||
}
|
||||
|
||||
private static String formatFileSize(long size) {
|
||||
if (size < 1024) return size + " B";
|
||||
if (size < 1024 * 1024) return String.format("%.2f KB", size / 1024.0);
|
||||
if (size < 1024 * 1024 * 1024) return String.format("%.2f MB", size / (1024.0 * 1024.0));
|
||||
return String.format("%.2f GB", size / (1024.0 * 1024.0 * 1024.0));
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
// 压缩单个图片
|
||||
long size = compressWithThumbnailator("D:\\下载模板\\微信图片_20251224111834_4_27.jpg", "D:\\下载模板\\微信图片_20251224111834_4_27.jpg");
|
||||
System.out.println("最终大小: " + formatFileSize(size));
|
||||
|
||||
// 批量压缩
|
||||
// batchCompress("input_images", "output_images", 500 * 1024);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user