Node-vibrant: [рдлрд╝реАрдЪрд░] рд╡реЗрдмрдкреА рд╕рдкреЛрд░реНрдЯ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЬреБрд▓ре░ 2017  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Vibrant-Colors/node-vibrant

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗрдмрдк рд╕рдорд░реНрдерди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рджред

help wanted wontfix

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

fyi: рдпрд╣рд╛рдВ рддреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ ImageClass рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрд╣ рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡реЗрдмрдк рдФрд░ рдПрд╕рд╡реАрдЬреА рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдКрдкрд░ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдХреЗ рдХрд╛рд░рдг, рдХреЛрдб load рд╡рд┐рдзрд┐ рдореЗрдВ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ, рдиреЛрдб-рд╡рд╛рдЗрдмреНрд░реЗрдВрдЯ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ:

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> рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рдд рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд┐рд╕ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред [рдмреНрд░рд╛рдЙрдЬрд╝рд░.ts] рджреЗрдЦреЗрдВред
рдиреЛрдб.рдЬреЗрдПрд╕ рдореЗрдВ, [рдЬрд┐рдВрдк] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╢реБрджреНрдз рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдореИрдВ рдХреБрдЫ рдмрд╛рдЗрдирд░реА/рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬреЛ рдХреБрдЫ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЯреВрдЯ рд╕рдХрддреЗ рд╣реИрдВред [рдиреЛрдб.ts] рджреЗрдЦреЗрдВред

рдиреЛрдб-рд╡рд╛рдЗрдмреНрд░реЗрдВрдЯ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдк рд╕рдорд░реНрдерди ImageClass s рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдИ рднреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ ImageClass рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Vibrant.DefaultOpts.ImageClass = YourCustomImageClass рд╕реЗрдЯ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

  • рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ [ ImageBase ] рдмрдврд╝рд╛рдПрдБред
  • рдпрд╛ рдЦрд░реЛрдВрдЪ рд╕реЗ [ Image ] рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдЖрдЙрдЯрдкреБрдЯ рдкрд┐рдХреНрд╕реЗрд▓ рд╕рд░рдгреА [ ImageData.data ] рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╛рд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ "рдПрдХ рдЖрдпрд╛рдореА рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрд░рдЬреАрдмреАрдП рдХреНрд░рдо рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 0 рдФрд░ 255 (рд╢рд╛рдорд┐рд▓) рдХреЗ рдмреАрдЪ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ"ред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдиреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдмрдк рдбрд┐рдХреЛрдбрд░ рдкреИрдХреЗрдЬ рдЦреЛрдЬрдиреЗ рдХреА рдмрд╛рдд рд╣реИред

рдорд╣рд╛рди! рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рдЕрдЪреНрдЫрд╛!

рдПрдлрд╡рд╛рдИрдЖрдИред рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг 3.1.0 рдХреЗ рд▓рд┐рдП рдХрдИ рдЫреЛрдЯреЗ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдиреЛрдб-рд╡рд╛рдЗрдмреНрд░реЗрдВрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд╕рднреА рдЫрд╡рд┐ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ npm рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП @vibrant/image-node ред рдпрд╣ рдЕрднреА рднреА рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЬреИрд╕рд╛ рд╣реА рд╣реИред рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЕрдм рдЖрдкрдХреЛ рдкреВрд░реЗ рд░реЗрдкреЛ рдХреЛ рдлреЛрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ @vibrant/image рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЪреАрдЬреЗрдВ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдВрдЧреАред

рдорд╣рд╛рди !

рдореИрдВ рдЕрдкрдиреЗ рдбрд┐рд╕реНрдХреЙрд░реНрдб рдмреЙрдЯ рдореЗрдВ рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рдЗрд╕рдХреЗ рдХрдИ рдлрд╛рдпрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡реЗрдмрдк рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЕрдкрдиреА рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝реА рдЪреАрдЬ рдмрдирдиреЗ рд▓рдЧреА рд╣реИред рдореБрдЭреЗ рдПрдХ wontfix рд▓реЗрдмрд▓ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рд╕рдЪрдореБрдЪ рдЪрд┐рдВрддрд╛ рд╣реЛрддреА рд╣реИред

@nitriques рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрднреА рддрдХ "рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ" рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдХрд┐рдпрд╛ рд╣реИ? рдпрд╛ рдЖрдк рдЖрдЦрд┐рд░ @akfish рдкрд░ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ?

@ рдлрд╡рдирд╛ рдЗрд╕реЗ рдореБрдЦреНрдп рдкреИрдХреЗрдЬ/рд░реЗрдкреЛ рдореЗрдВ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХрд╕реНрдЯрдо ImageClass (рдФрд░ рдПрдХ рдЕрд▓рдЧ npm рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдареАрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред Node.js (рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП WebP libs рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдпрд╛ рдиреЗрдЯрд┐рд╡ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдиреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рдкреИрдХреЗрдЬ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯ-рдСрдл-рдмреЙрдХреНрд╕ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред

рдореИрдВ рдЕрдкрдиреЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реВрдЪреА рдореЗрдВ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЬрд▓реНрдж рд╣реА рдХрд┐рд╕реА рднреА рд╕рдордп рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@Favna

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрднреА рддрдХ рдЕрдкрдирд╛ рдХреЛрдИ "рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ" рдХрд┐рдпрд╛ рд╣реИ?

рд╣рд╛рдВ рдФрд░ рдореИрдВ рдЬреЛ рдХреБрдЫ рднреА рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рджреЗрд╢реА рдРрдб-рдбреЙрди рд╣реИрдВ

рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдЬрд▓реНрдж рд╣реА рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡реИрдХрд▓реНрдкрд┐рдХ рдзреНрд╡рдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд┐рдВрдк рдХреЗ рдмрдЬрд╛рдп рддреЗрдЬ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ? рдЪреВрдВрдХрд┐ v0.20 рд╢рд╛рд░реНрдк рдХреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд┐рд╕реНрдЯрдо рдкрд░ npm install рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЪрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ webp рдФрд░ svg рд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рднреА рдЖрддрд╛ рд╣реИ рдФрд░ рдПрдХ рддреЗрдЬрд╝ рд╕рдорд╛рдзрд╛рди рд╣реЛрдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рддреЗрдЬ-рдЖрдзрд╛рд░рд┐рдд ImageClass рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдзреЗ рдЖрдЧреЗ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ resize / scaleDown рдХреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рддреЗрдЬ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХрд╛ рдСрдкрд░реЗрд╢рди async рд╣реИред

fyi: рдпрд╣рд╛рдВ рддреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ ImageClass рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрд╣ рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡реЗрдмрдк рдФрд░ рдПрд╕рд╡реАрдЬреА рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдКрдкрд░ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рдореБрджреНрджреЗ рдХреЗ рдХрд╛рд░рдг, рдХреЛрдб load рд╡рд┐рдзрд┐ рдореЗрдВ рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рддрд╛ рд╣реИ, рдиреЛрдб-рд╡рд╛рдЗрдмреНрд░реЗрдВрдЯ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ:

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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

inbarshani picture inbarshani  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Kikobeats picture Kikobeats  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

eggers picture eggers  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chetstone picture chetstone  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

catusmagnus picture catusmagnus  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ