Kompresia obrázkov pre váš web alebo v rámci vašej aplikácie môže radikálne zlepšiť výkon. Sharp robí ťažké zdvíhanie.

Zbytočne veľké obrázky môžu viesť k pomalším časom odozvy, spotrebúvať nadmernú šírku pásma a poskytovať pomalý zážitok pre používateľov, najmä tých, ktorí majú pomalšie pripojenie. Výsledkom môže byť vyššia miera odchodov alebo menej konverzií.

Komprimácia obrázkov pred ich odovzdaním môže zmierniť tieto problémy a poskytnúť lepšiu používateľskú skúsenosť. Vďaka modulu Sharp je tento proces rýchly a jednoduchý.

Nastavenie vývojového prostredia

Ak chcete demonštrovať proces kompresie obrázkov, začnite tým nastavenie služby nahrávania obrázkov pomocou funkcie multer. Proces môžete urýchliť klonovaním toto úložisko GitHub.

Po naklonovaní úložiska GitHub spustite tento príkaz na inštaláciu závislostí pre službu nahrávania obrázkov:

npm install

Ďalej nainštalujte Sharp spustením tohto príkazu:

npm install sharp

The Ostrý modul je vysoko výkonná knižnica Node.js na spracovanie a manipuláciu s obrázkami. Pomocou Sharp môžete efektívne meniť veľkosť, orezávať, otáčať a vykonávať rôzne ďalšie operácie s obrázkami. Sharp má tiež vynikajúcu podporu pre kompresiu obrázkov.

instagram viewer

Kompresné techniky pre rôzne formáty obrázkov

Rôzne obrazové formáty majú odlišné kompresné techniky. Je to preto, že každý z nich zodpovedá špecifickému použitiu a požiadavkám a uprednostňuje rôzne faktory vrátane kvality, veľkosti súboru a funkcií, ako je priehľadnosť a animácie.

JPG/JPEG

JPEG je štandard pre kompresiu obrázkov vyvinutý skupinou Joint Photographic Experts Group na kompresiu fotografií a realistických obrázkov so súvislými tónmi a farebnými prechodmi. Používa sa stratový kompresný algoritmus, generovanie menších súborov odstránením niektorých obrazových údajov.

Ak chcete komprimovať obrázok JPEG pomocou nástroja Sharp, importujte modul Sharp a zadajte cestu k súboru alebo vyrovnávaciu pamäť obrázka ako argument. Ďalej zavolajte na .jpeg metóda na Ostrý príklad. Potom odovzdajte konfiguračný objekt s a kvality vlastnosť, ktorá má číslo medzi 0 a 100 ako hodnotu. Kde 0 vráti najmenšiu kompresiu s najnižšou kvalitou a 100 vráti najväčšiu kompresiu s najvyššou kvalitou.

Hodnotu si môžete nastaviť podľa svojich potrieb. Pre najlepšie výsledky kompresie udržujte hodnotu medzi 50-80 dosiahnuť rovnováhu medzi veľkosťou a kvalitou.

Dokončite uložením komprimovaného obrázka do systému súborov pomocou .vyplniť metóda. Ako argument zadajte cestu k súboru, do ktorého chcete zapisovať.

Napríklad:

await sharp(req.file.path)
.jpeg({ quality: 60 })
.toFile(`./images/compressed-${req.file.filename}`)
.then(() => {
console.log(`Compressed ${req.file.filename} successfully`);
});

Predvolená hodnota pre kvality je 80.

PNG

PNG (Portable Network Graphics) je formát obrazového súboru známy svojou bezstratovou kompresiou a podporou priehľadného pozadia.

Kompresia obrázka PNG pomocou Sharp je podobná ako kompresia obrázka JPEG pomocou Sharp. Ak je však obrázok vo formáte PNG, musíte vykonať dve zmeny.

  1. Sharp spracováva obrázky PNG pomocou .png metóda namiesto .jpeg metóda.
  2. The .png metóda používa úroveň kompresie, čo je číslo medzi 0 a 9 namiesto kvality vo svojom konfiguračnom objekte. 0 poskytuje najrýchlejšiu a najväčšiu možnú kompresiu 9 poskytuje najpomalšiu a najmenšiu možnú kompresiu.

Napríklad:

await sharp(req.file.path)
.png({
compressionLevel: 5,
})
.toFile(`./images/compressed-${req.file.filename}`)
.then(() => {
console.log(`Compressed ${req.file.filename} successfully`);
});

Predvolená hodnota pre kompresiaLevel je 6.

Iné formáty

Sharps podporuje kompresiu v rôznych iných formátoch obrázkov, medzi ktoré patria:

  • WebP: Kompresia obrazu WebP pomocou Sharpu prebieha rovnako ako pri JPG. Jediný rozdiel je v tom, že musíte zavolať webp metóda namiesto .jpeg metóda na inštancii Sharp.
  • TIFF: Kompresia obrázkov TIFF (Tag Image File Format) pomocou Sharp prebieha rovnako ako JPG. Jediný rozdiel je v tom, že musíte zavolať tiff metóda namiesto .jpeg metóda na inštancii Sharp.
  • AVIF: Kompresia obrazu AVIF (formát AV1 Image File Format) pomocou Sharp prebieha rovnako ako JPG. Jediný rozdiel je v tom, že musíte zavolať avif metóda namiesto .jpeg metóda na inštancii Sharp. Predvolená hodnota AVIF pre kvality je 50.
  • HEIF: Kompresia obrázkov HEIF (High Efficiency Image File Format) pomocou Sharpu prebieha rovnako ako JPG. Jediný rozdiel je v tom, že musíte zavolať heif metóda namiesto .jpeg metóda na inštancii Sharp. Predvolená hodnota AVIF pre kvality je 50.

Kompresia obrázkov pomocou Sharp

Ak ste naklonovali úložisko GitHub, otvorte svoj app.js súbor a pridajte nasledujúce importy.

const sharp = require("sharp");
const { exec } = require("child_process");

exec je funkcia poskytovaná child_process modul, ktorý vám umožňuje spúšťať príkazy shellu alebo externé procesy z vašej aplikácie Node.js.

Túto funkciu môžete použiť na spustenie príkazu, ktorý porovnáva veľkosti súborov pred a po kompresii.

Ďalej nahraďte POST ‘/single' handler s blokom kódu nižšie:

app.post("/upload-and-compress", upload.single("image"), async (req, res) => {
try {
if (!req.file) {
return res.status(404).send("Please upload a valid image");
}

const compressedFileName = req.file.filename.split(".")[0];
const compressedImageFilePath = `./images/${compressedFileName}-compressed.png`;

await sharp(req.file.path)
.jpeg({ quality: 50 })
.toFile(compressedImageFilePath)
.then(() => {
let sizeBeforeCompression, sizeAfterCompression;
const sizeBeforeCompressionCommand = `du -h ${req.file.path}`;
const sizeAfterCompressionCommand = `du -h ${compressedImageFilePath}`;

exec(sizeBeforeCompressionCommand, (err, stdout, stderr) => {
sizeBeforeCompression = stdout.split("\\t")[0];

exec(sizeAfterCompressionCommand, (err, stdout, stderr) => {
sizeAfterCompression = stdout.split("\\t")[0];

res.send({
message: "Image uploaded and compressed successfully",
sizeBeforeCompression,
sizeAfterCompression,
});
});
});
});
} catch (error) {
console.log(error);
}
});

Vyššie uvedený blok kódu implementuje techniku ​​kompresie obrázkov JPEG a porovnáva veľkosti pred a po použití du príkaz.

The du command je unixová pomôcka, ktorá znamená "používanie disku." Odhaduje využitie priestoru v súboroch a analyzuje využitie disku v adresári alebo skupine adresárov. Keď spustíte du príkaz s -h príznak, zobrazuje súborový priestor, ktorý každý podadresár používa, a jeho obsah vo forme čitateľnej pre človeka.

Spustite službu nahrávania spustením tohto príkazu:

node app.js

Potom otestujte svoju aplikáciu odoslaním obrázka JPG na trasu localhost:/upload-and-compresspomocou klientskej aplikácie Postman alebo akékoľvek iný nástroj na testovanie API.

Mali by ste vidieť odpoveď podobnú tejto:

{
"message": "Image uploaded and compressed successfully",
"sizeBeforeCompression": "13M",
"sizeAfterCompression": "3.1M"
}

Iné použitia modulu Sharp

Okrem kompresie obrázkov dokáže ostrý modul zmeniť veľkosť, orezať, otočiť a prevrátiť obrázky podľa požadovaných špecifikácií. Podporuje tiež úpravy farebného priestoru, operácie s alfa kanálmi a prevody formátov.