46 lines
1.5 KiB
JavaScript
46 lines
1.5 KiB
JavaScript
|
|
import sharp from 'sharp';
|
||
|
|
import { writeFile, unlink, stat } from 'node:fs/promises';
|
||
|
|
import { join } from 'node:path';
|
||
|
|
|
||
|
|
// Opaque-photo PNGs to convert to JPG (verified via metadata: no alpha)
|
||
|
|
const targets = [
|
||
|
|
'archie-auckland-dog-walking-review',
|
||
|
|
'monty-auckland-dog-walking-review',
|
||
|
|
'otis-auckland-dog-walking-review',
|
||
|
|
'wallace-auckland-dog-walking-review',
|
||
|
|
'one-on-one-dog-portrait-1',
|
||
|
|
'one-on-one-dog-portrait-2',
|
||
|
|
'one-on-one-dog-portrait-3',
|
||
|
|
'small-medium-dogs-pack-walk',
|
||
|
|
'auckland-pack-walk-small-dogs-group',
|
||
|
|
'founder-image-aless-goodwalk'
|
||
|
|
];
|
||
|
|
|
||
|
|
const dirs = ['src/lib/images', 'static/images'];
|
||
|
|
const MAX_WIDTH = 1600;
|
||
|
|
|
||
|
|
let totalOrig = 0;
|
||
|
|
let totalNew = 0;
|
||
|
|
for (const dir of dirs) {
|
||
|
|
for (const name of targets) {
|
||
|
|
const png = join(dir, name + '.png');
|
||
|
|
const jpg = join(dir, name + '.jpg');
|
||
|
|
try {
|
||
|
|
const orig = (await stat(png)).size;
|
||
|
|
const buf = await sharp(png)
|
||
|
|
.rotate()
|
||
|
|
.resize({ width: MAX_WIDTH, withoutEnlargement: true })
|
||
|
|
.jpeg({ quality: 82, mozjpeg: true, progressive: true })
|
||
|
|
.toBuffer();
|
||
|
|
await writeFile(jpg, buf);
|
||
|
|
await unlink(png);
|
||
|
|
totalOrig += orig;
|
||
|
|
totalNew += buf.length;
|
||
|
|
console.log(`${name.padEnd(45)} ${(orig/1024).toFixed(0).padStart(5)}KB png → ${(buf.length/1024).toFixed(0).padStart(4)}KB jpg`);
|
||
|
|
} catch (err) {
|
||
|
|
console.error('FAILED', png, err.message);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
console.log(`\nTotal: ${(totalOrig/1024/1024).toFixed(2)} MB → ${(totalNew/1024/1024).toFixed(2)} MB`);
|