Files
gw-svelte/scripts/convert-png-to-jpg.mjs
T
2026-05-12 00:45:02 +12:00

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`);