mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-08-19 22:09:27 +02:00
feat: 修改为压缩图直接替换原图
This commit is contained in:
parent
2019aa17da
commit
18bc663f04
@ -10,7 +10,6 @@ const __filename = fileURLToPath(import.meta.url);
|
|||||||
const __dirname = path.dirname(__filename);
|
const __dirname = path.dirname(__filename);
|
||||||
|
|
||||||
const sourceDir = 'public/images';
|
const sourceDir = 'public/images';
|
||||||
const outputDir = 'dist/images';
|
|
||||||
const SMALL_FILE_THRESHOLD = 5 * 1024; // 5KB
|
const SMALL_FILE_THRESHOLD = 5 * 1024; // 5KB
|
||||||
|
|
||||||
// 动态计算最佳参数
|
// 动态计算最佳参数
|
||||||
@ -81,7 +80,7 @@ async function calculateOptimalParams() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 检测是否在RAM disk上
|
// 检测是否在RAM disk上
|
||||||
const isRamDisk = await checkIfRamDisk(outputDir);
|
const isRamDisk = await checkIfRamDisk(sourceDir);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
batchSize,
|
batchSize,
|
||||||
@ -134,15 +133,13 @@ function formatBytes(bytes) {
|
|||||||
|
|
||||||
// 工作线程逻辑
|
// 工作线程逻辑
|
||||||
if (!isMainThread) {
|
if (!isMainThread) {
|
||||||
const { files, sourceDir, outputDir, isRamDisk } = workerData;
|
const { files, sourceDir, isRamDisk } = workerData;
|
||||||
|
|
||||||
async function optimizeImage(inputPath) {
|
async function optimizeImage(inputPath) {
|
||||||
const relativePath = path.relative(sourceDir, inputPath);
|
const relativePath = path.relative(sourceDir, inputPath);
|
||||||
const outputPath = path.join(outputDir, relativePath);
|
const tempPath = `${inputPath}.temp`;
|
||||||
const outputDirPath = path.dirname(outputPath);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await fs.mkdir(outputDirPath, { recursive: true });
|
|
||||||
const inputStats = await fs.stat(inputPath);
|
const inputStats = await fs.stat(inputPath);
|
||||||
const isSmallFile = inputStats.size < SMALL_FILE_THRESHOLD;
|
const isSmallFile = inputStats.size < SMALL_FILE_THRESHOLD;
|
||||||
|
|
||||||
@ -164,7 +161,7 @@ if (!isMainThread) {
|
|||||||
colors: 128,
|
colors: 128,
|
||||||
dither: 0.4
|
dither: 0.4
|
||||||
})
|
})
|
||||||
.toFile(outputPath);
|
.toFile(tempPath);
|
||||||
} else {
|
} else {
|
||||||
await sharpInstance
|
await sharpInstance
|
||||||
.png({
|
.png({
|
||||||
@ -175,21 +172,36 @@ if (!isMainThread) {
|
|||||||
dither: 0.4,
|
dither: 0.4,
|
||||||
effort: 10
|
effort: 10
|
||||||
})
|
})
|
||||||
.toFile(outputPath);
|
.toFile(tempPath);
|
||||||
}
|
|
||||||
|
|
||||||
const outputStats = await fs.stat(outputPath);
|
|
||||||
if (outputStats.size > inputStats.size) {
|
|
||||||
await fs.copyFile(inputPath, outputPath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const outputStats = await fs.stat(tempPath);
|
||||||
|
if (outputStats.size < inputStats.size) {
|
||||||
|
// 如果优化后的文件更小,则替换原文件
|
||||||
|
await fs.rename(tempPath, inputPath);
|
||||||
return {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
inputSize: inputStats.size,
|
inputSize: inputStats.size,
|
||||||
outputSize: Math.min(inputStats.size, outputStats.size),
|
outputSize: outputStats.size,
|
||||||
path: relativePath
|
path: relativePath
|
||||||
};
|
};
|
||||||
|
} else {
|
||||||
|
// 如果优化后的文件更大,则删除临时文件
|
||||||
|
await fs.unlink(tempPath);
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
inputSize: inputStats.size,
|
||||||
|
outputSize: inputStats.size,
|
||||||
|
path: relativePath,
|
||||||
|
skipped: true
|
||||||
|
};
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
// 清理临时文件
|
||||||
|
try {
|
||||||
|
await fs.unlink(tempPath);
|
||||||
|
} catch {}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
path: relativePath,
|
path: relativePath,
|
||||||
@ -221,10 +233,6 @@ else {
|
|||||||
console.log(`RAM Disk: ${optimalParams.isRamDisk ? '是' : '否'}`);
|
console.log(`RAM Disk: ${optimalParams.isRamDisk ? '是' : '否'}`);
|
||||||
console.log('==================================\n');
|
console.log('==================================\n');
|
||||||
|
|
||||||
// 清空输出目录
|
|
||||||
await fs.rm(outputDir, { recursive: true, force: true });
|
|
||||||
await fs.mkdir(outputDir, { recursive: true });
|
|
||||||
|
|
||||||
// 获取所有PNG文件
|
// 获取所有PNG文件
|
||||||
const files = await glob(path.join(sourceDir, '**/*.png'));
|
const files = await glob(path.join(sourceDir, '**/*.png'));
|
||||||
const totalFiles = files.length;
|
const totalFiles = files.length;
|
||||||
@ -236,6 +244,7 @@ else {
|
|||||||
let totalOptimizedSize = 0;
|
let totalOptimizedSize = 0;
|
||||||
let successCount = 0;
|
let successCount = 0;
|
||||||
let failCount = 0;
|
let failCount = 0;
|
||||||
|
let skippedCount = 0;
|
||||||
const startTime = Date.now();
|
const startTime = Date.now();
|
||||||
|
|
||||||
const results = [];
|
const results = [];
|
||||||
@ -257,7 +266,6 @@ else {
|
|||||||
workerData: {
|
workerData: {
|
||||||
files: currentBatch,
|
files: currentBatch,
|
||||||
sourceDir,
|
sourceDir,
|
||||||
outputDir,
|
|
||||||
isRamDisk: optimalParams.isRamDisk
|
isRamDisk: optimalParams.isRamDisk
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -304,6 +312,9 @@ else {
|
|||||||
successCount++;
|
successCount++;
|
||||||
totalOriginalSize += result.inputSize;
|
totalOriginalSize += result.inputSize;
|
||||||
totalOptimizedSize += result.outputSize;
|
totalOptimizedSize += result.outputSize;
|
||||||
|
if (result.skipped) {
|
||||||
|
skippedCount++;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
failCount++;
|
failCount++;
|
||||||
console.error(`\n✗ 处理 ${result.path} 时出错:`, result.error);
|
console.error(`\n✗ 处理 ${result.path} 时出错:`, result.error);
|
||||||
@ -318,6 +329,7 @@ else {
|
|||||||
console.log('\n\n========== 优化结果报告 ==========');
|
console.log('\n\n========== 优化结果报告 ==========');
|
||||||
console.log(`处理总文件数: ${totalFiles}`);
|
console.log(`处理总文件数: ${totalFiles}`);
|
||||||
console.log(`成功处理: ${successCount} 个文件`);
|
console.log(`成功处理: ${successCount} 个文件`);
|
||||||
|
console.log(`跳过处理: ${skippedCount} 个文件(优化后体积更大)`);
|
||||||
console.log(`处理失败: ${failCount} 个文件`);
|
console.log(`处理失败: ${failCount} 个文件`);
|
||||||
console.log(`原始总大小: ${(totalOriginalSize / 1024 / 1024).toFixed(2)}MB`);
|
console.log(`原始总大小: ${(totalOriginalSize / 1024 / 1024).toFixed(2)}MB`);
|
||||||
console.log(`优化后总大小: ${(totalOptimizedSize / 1024 / 1024).toFixed(2)}MB`);
|
console.log(`优化后总大小: ${(totalOptimizedSize / 1024 / 1024).toFixed(2)}MB`);
|
||||||
|
Loading…
Reference in New Issue
Block a user