Node-vibrant: [Feature] ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° webp

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 7 июл. 2017  Β·  12ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: Vibrant-Colors/node-vibrant

Π― знаю, Ρ‡Ρ‚ΠΎ это нСпростая Ρ€Π°Π±ΠΎΡ‚Π°, Π½ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ webp Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ.

Бпасибо.

help wanted wontfix

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠΊ свСдСнию: Π²ΠΎΡ‚ рСализация 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 {}
}

ВсС 12 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Как ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это?

Ну ΠΊΠ°ΠΊ Ρ‚Π΅Π±Π΅ сСйчас ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ изобраТСния Π² массивы пиксСлСй?

Π’ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ это Π΄Π΅Π»Π°Π΅Ρ‚ <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 {}
}
Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ