Π― Π·Π½Π°Ρ, ΡΡΠΎ ΡΡΠΎ Π½Π΅ΠΏΡΠΎΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°, Π½ΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ webp Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ ΠΎ.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ.
ΠΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ?
ΠΡ ΠΊΠ°ΠΊ ΡΠ΅Π±Π΅ ΡΠ΅ΠΉΡΠ°Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΌΠ°ΡΡΠΈΠ²Ρ ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ?
Π Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ <canvas>
. Π’Π°ΠΊ ΡΡΠΎ Π²ΡΠ΅ Π΄Π΅Π»ΠΎ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΎΡΠΌΠ°ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π±ΡΠ°ΡΠ·Π΅Ρ. Π‘ΠΌ. [Browser.ts].
Π node.js ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ [jimp], ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ ΡΠΈΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ JavaScript. Π― Π½Π΅ Ρ
ΠΎΡΠ΅Π» Π²Π²ΠΎΠ΄ΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π²ΠΎΠΈΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ / Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π½Π°ΡΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ
, Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. Π‘ΠΌ. [Node.ts].
node-vibrant ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ. ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΠΎΡΠΌΠ°ΡΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ImageClass
s. ΠΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ImageClass
ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² Vibrant.DefaultOpts.ImageClass = YourCustomImageClass
.
Π§ΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄ΠΈΠ½, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ
ImageBase
].Image
] Ρ Π½ΡΠ»Ρ.ΠΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΠΎΡΠΌΠ°Ρ, ΡΡΠΎ ΠΈ [ ImageData.data
]. ΠΡΠΎ Β«ΠΎΠ΄Π½ΠΎΠΌΠ΅ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ RGBA Ρ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ ΠΎΡ 0 Π΄ΠΎ 255 (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ)Β».
ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠΏΡΠΎΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠ° Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠ° webp Π΄Π»Ρ ΡΠ·Π»Π°.
ΠΠΎΠ»ΡΡΠΎΠΉ! ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΡ! Π― Π½Π΅ ΡΠ°ΠΊ Ρ ΠΎΡΠΎΡ Π² TypeScript, Π½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ!
ΠΡΠ»ΠΈΡΠ½ΠΎ!
Π Π²Π°ΡΠ΅ΠΌΡ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ. Π― ΡΠ΅ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΡ node-vibrant Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Π΄Π»Ρ Π²Π΅ΡΡΠΈΠΈ 3.1.0. ΠΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΠΊΠ°ΠΊ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ npm.
ΠΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ @vibrant/image-node
Π΄Π»Ρ ΡΡΠ°Π»ΠΎΠ½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ½ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΡΠ΅. ΠΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ @vibrant/image
ΠΎΡ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π²ΠΌΠ΅ΡΡΠΎ ΡΠ°Π·Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ Π²ΡΠ΅Π³ΠΎ ΡΠ΅ΠΏΠΎ. ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΠΏΡΠΎΡΡΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΡ.
ΠΠΎΠ»ΡΡΠΎΠΉ !
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ Π² ΡΠ²ΠΎΠ΅ΠΌ Π±ΠΎΡΠ΅ Discord, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡΡ ΠΊ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΡΠ²ΠΎΠΈΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ webp ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΠ·-Π·Π° Π΅Π³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΡ
ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ², ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄Π»Ρ ΠΌΠ΅Π½Ρ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠΉ Π²Π΅ΡΡΡ. Π― Π²ΠΈΠΆΡ ΡΡΠ»ΡΠΊ wontfix
, ΠΈ ΡΡΠΎ ΠΌΠ΅Π½Ρ ΠΎΡΠ΅Π½Ρ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ.
@nitriques , Π²Ρ ΡΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ· ΡΠ²ΠΎΠ΅Π³ΠΎ Β«Π²ΠΈΠ΄Π΅Π½ΠΈΡ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡΒ»? ΠΈΠ»ΠΈ ΡΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°Π΄ ΡΡΠΈΠΌ Π²ΡΠ΅- ΡΠ°ΠΊΠΈ @akfish ?
@Favna ΠΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅ / ΡΠ΅ΠΏΠΎ. ΠΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ImageClass (ΠΈ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π² Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΠΊΠ΅Ρ npm). ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ WebP Π΄Π»Ρ node.js (ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π²ΠΈΠ΄Π΅Π») ΡΡΠ΅Π±ΡΡΡ Π²Π½Π΅ΡΠ½ΠΈΡ Π΄Π²ΠΎΠΈΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π±Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ½ΡΠΌΠΈ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π½Π° ΡΠ°Π·Π½ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ . ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ "ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ" Π½Π° Π²ΡΠ΅Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ .
Π― ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π°Π΄ ΡΡΠΈΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΈ ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ΡΠΈΡΠ»ΠΎ ΠΌΠΎΠΈΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΡΡ Π·Π°Π΄Π°Ρ. Π’Π°ΠΊ ΡΡΠΎ Ρ Π±ΠΎΡΡΡ, ΡΡΠΎ Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΡΡΠΎ Π½Π΅ ΠΈΡΠΏΡΠ°Π²Π»Ρ.
@Favna
ΠΡ ΡΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ· ΡΠ²ΠΎΠ΅Π³ΠΎ Β«Π²ΠΈΠ΄Π΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡΒ»?
ΠΠ°, ΠΈ Π²ΡΠ΅, ΡΡΠΎ Ρ Π²ΠΈΠΆΡ, ΡΡΠΎ Π½Π°ΡΠΈΠ²Π½Π°Ρ ΡΠ΅ΠΊΠ»Π°ΠΌΠ°
Π₯ΠΎΡΠΎΡΠΎ ΡΠΎ, ΡΡΠΎ ΠΎΠ½ ΠΌΠ½Π΅ Π½ΡΠΆΠ΅Π½, ΡΠ°ΠΊ ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠΊΠΎΡΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ΅ΠΌΡ Π΅Π³ΠΎ ΠΏΠΎΡΡΡΡΡΡ.
ΠΠ°ΠΊ Π²Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅ΡΡ ΠΊ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΠΊΠΎΠ΅ Π²ΠΌΠ΅ΡΡΠΎ jimp Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π°Π³Π°? ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ 0.20, Sharp Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ
Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅, ΠΊΡΠΎΠΌΠ΅ npm install
Π½Π° Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠΈΡΡΠ΅ΠΌ. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ webp ΠΈ svg ΠΈ ΠΎΠ±Π΅ΡΠ°Π΅Ρ ΡΡΠ°ΡΡ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π½Π° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ
ΠΌΠΎΠ΄ΡΠ»ΡΡ
.
Π― ΠΏΡΠΎΡΡΠΎ ΠΏΡΡΠ°ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅Π·ΠΊΡΡ ImageClass
Π½ΠΎ ΡΡΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΡΠΌΡΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ resize
/ scaleDown
Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΌ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Sharp ΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎΠΉ.
ΠΊ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ: Π²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ImageClass Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Sharp. ΠΠ½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ°ΠΊ webp, ΡΠ°ΠΊ ΠΈ svg Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠΎΡΠΌΠ°ΡΠ°ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ·-Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π²ΡΡΠ΅, ΠΊΠΎΠ΄ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ load
, ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ Π²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ ΠΈΠ· node-vibrant:
import * as sharp from "sharp";
import {ImageBase, ImageSource} from "@vibrant/image";
class SharpImage extends ImageBase {
private _image: ImageData = undefined as any;
async load(image: ImageSource): Promise<ImageBase> {
if (typeof image === "string" || image instanceof Buffer) {
const {data, info} = await sharp(image)
.resize(200, 200, {fit: "inside", withoutEnlargement: true})
.ensureAlpha()
.raw()
.toBuffer({resolveWithObject: true});
this._image = {
width: info.width,
height: info.height,
data: (data as unknown) as Uint8ClampedArray,
};
return this;
} else {
return Promise.reject(
new Error("Cannot load image from HTMLImageElement in node environment")
);
}
}
clear(): void {}
update(): void {}
getWidth(): number {
return this._image.width;
}
getHeight(): number {
return this._image.height;
}
resize(targetWidth: number, targetHeight: number, ratio: number): void {
// done in the load step, ignoring any maxDimension or quality options
}
getPixelCount(): number {
const {width, height} = this._image;
return width * height;
}
getImageData(): ImageData {
return this._image;
}
remove(): void {}
}
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΊ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ: Π²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ImageClass Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Sharp. ΠΠ½ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΊΠ°ΠΊ webp, ΡΠ°ΠΊ ΠΈ svg Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎ Π²ΡΠ΅ΠΌ ΡΠΎΡΠΌΠ°ΡΠ°ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠ·-Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π²ΡΡΠ΅, ΠΊΠΎΠ΄ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅
load
, ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ Π²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΡΡΠΏΠ°ΡΡ ΠΈΠ· node-vibrant: