2024.1.0 • Published 4 months ago

@misskey-dev/browser-image-resizer v2024.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
4 months ago

browser-image-resizer

Introduction

This library allows for cross-browser image downscaling utilizing OffscreenCanvas.

Note

Installation

NPM/Yarn/pnpm

  • npm install @misskey-dev/browser-image-resizer
  • yarn add @misskey-dev/browser-image-resizer
  • pnpm add @misskey-dev/browser-image-resizer

Usage

In the main thread

import { readAndCompressImage } from 'browser-image-resizer';

const config = {
  quality: 0.7,
  width: 800,
  height: 600
};

// Note: A single file comes from event.target.files on <input>
async function uploadImage(file) {
  try {
    let resizedImage = await readAndCompressImage(file, config);

    const url = `http://localhost:3001/upload`;
    const formData = new FormData();
    formData.append('images', resizedImage);
    const options = {
      method: 'POST',
      body: formData
    };

    let result = await fetch(url, options);

    // TODO: Handle the result
    console.log(result);
    return result;
  } catch (error) {
    console.error(error);
    throw(error);
  }
}

In worker

Even large images can be processed in a separate thread using a worker.

worker.js

import { readAndCompressImage } from "browser-image-resizer";

onmessage = async (e) => {
    const converted = await readAndCompressImage(e.data, { maxWidth: 300 });
    postMessage(converted, [converted]);
}

Main Thread

const worker = new Worker('worker.js');

const img = document.getElementById('viewer_img');
worker.onmessage = (e) => {
  img.src = URL.createObjectURL(e.data);
};

async function convert(file: File) {
  const bmp = await createImageBitmap(file);
  worker.postMessage(bmp, [bmp]);
}

API

readAndCompressImage(file, config) => Promise<Blob | OffscreenCanvas>

Inputs

Property NamePurposeDefault Value
argorithmAlgorithm used for downscaling (see below)'null'
processByHalfWhether to process downscaling by drawImage(source, 0, 0, source.width / 2, source.height / 2) until the size is smaller than twice the target size.true
qualityThe quality of jpeg (or webp)0.5
maxWidthThe maximum width for the downscaled image800
maxHeightThe maximum height for the downscaled image600
debugconsole.log image update operationsfalse
mimeTypespecify image output type other than jpeg / If set null, function returns OffscreenCanvas'image/jpeg'
argorithm
  • null: Just resize with drawImage(). The best quality and fastest.
  • bilinear: Better quality, slower. Comes from upstream (ericnogralesbrowser-image-resizer).
  • hermite: Worse quality, faster. Comes from viliusle/Hermite-resize. Will dispatch workers for better performance.
  • hermite_single: Worse quality, faster. Single-threaded.

Outputs

A Promise that yields an Image Blob or OffscreenCanvas

calculateSize(src, config)

calculateSize(src: { width: number; height: number; }, config) => { width: number; height: number; }

With this function you can get the pre-calculated width and height of the resulting image.

Output Image Specification

The output image is derived from OffscreenCanvas.convertToBlob.
https://developer.mozilla.org/en-US/docs/Web/API/OffscreenCanvas/convertToBlob

2024.1.0

4 months ago

2.2.1-misskey.10

8 months ago

2.2.1-misskey.9

9 months ago

2.2.1-misskey.8

10 months ago

2.2.1-misskey.6

10 months ago