2.0.5 • Published 1 year ago

scrunchjs v2.0.5

Weekly downloads
-
License
ISC
Repository
github
Last release
1 year ago

ScrunchJs

ScrunchJs is an extremely efficient image resizer that compresses images to meet specified size and quality constraints. It provides both client-side and server-side compression capabilities.

Table of Contents

Installation

npm install scrunchjs --save

Usage

Server-side Usage

import {compressImageServer}  from 'scrunchjs/server';


const inputBuffer = await fs.readFile('./images/input.png');
const compressedBuffer = await compressImageServer({
  input: inputBuffer,
  maxWidth: 1920,
  initialQuality: 70,
  minQuality: 10,
  maxFileSize: 200 * 1024
});

Client-side Usage

import React, { useState } from 'react';
import {compressImageClient} from 'scrunchjs/client';

const ImageUploader = () => {
  const [image, setImage] = useState(null);
  const [compressedImage, setCompressedImage] = useState(null);

  const handleImageChange = (e) => {
    const file = e.target.files[0];
    setImage(file);
  };

  const handleUpload = async () => {
    if (!image) return;

    const compressedBuffer = await compressImageClient({
      input: image,
      maxWidth: 1920,
      initialQuality: 70,
      minQuality: 10,
      maxFileSize: 200 * 1024
    });

    const compressedImage = new Image();
    compressedImage.src = URL.createObjectURL(compressedBuffer);
    setCompressedImage(compressedImage.src);
  };

  return (
    <div>
      <input type="file" onChange={handleImageChange} />
      <button onClick={handleUpload}>Upload and Compress</button>
      {compressedImage && <img src={compressedImage} alt="Compressed" />}
    </div>
  );
};

Next.js Usage

  1. Create an API route for image compression (e.g., pages/api/compress-image.js or app/api/compress-image/route.js for App Router): Note: When using Next.js, you can create an API route to handle the image compression using the compressImageServer function or compressImageClient function for client-side compression.
import { NextResponse } from 'next/server';
import {compressImageServer} from 'scrunchjs/server';

export async function POST(req, res) {
  
    try {
      const buffer = Buffer.from(await req.arrayBuffer());
      const compressedBuffer = await compressImageServer({
        input: buffer,
        maxWidth: 1920,
        initialQuality: 70,
        minQuality: 10,
        maxFileSize: 200 * 1024
      });

      return new Response(compressedBuffer, {
        status: 200,
        headers: {
          'Content-Type': 'image/jpeg',
          'Content-Length': compressedBuffer.length.toString(),
        },
      });
    } catch (error) {
      console.error(error);
      return NextResponse.json({ message: 'Error compressing image' });
    }
};
  1. Use the API route in your Next.js application:
import React, { useState } from 'react';

const ImageUploader = () => {
  const [image, setImage] = useState(null);
  const [compressedImage, setCompressedImage] = useState(null);

  const handleImageChange = (e) => {
    const file = e.target.files[0];
    setImage(file);
  };

  const handleUpload = async () => {
    if (!image) return;

    try {
      const response = await fetch('/api/compress-image', {
        headers: {
          'Content-Type': 'image/jpeg',
        },  
        method: 'POST',
        body: image
      });

      if (!response.ok) {
        throw new Error('Failed to compress image');
      }

      const blob = await response.blob();
      const url = URL.createObjectURL(blob);
      setCompressedImage(url);

    } catch (error) {
      console.error(error);
      alert('Error compressing image');
    }
  };

  return (
    <div>
      <input type="file" onChange={handleImageChange} />
      <button onClick={handleUpload}>Upload and Compress</button>
      {compressedImage && <img src={compressedImage} alt="Compressed" />}
    </div>
  );
};

API Reference

compressImage(options)

Compresses an image based on the provided options.

Parameters

  • options: Object
    • input: Buffer | File | Blob | string
      • The image to compress.
    • maxWidth: number
      • The maximum width for the compressed image.
    • initialQuality: number
      • The initial quality setting for the image compression.
    • minQuality: number
      • The minimum quality setting for the image compression.
    • maxFileSize: number
      • The maximum file size in bytes for the compressed image.

Client-side Returns

  • Buffer: The compressed image buffer.

Testing

npm test

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

License

This project is licensed under the MIT License. See the LICENSE file for details.

2.0.5

1 year ago

2.0.3

1 year ago

2.0.2

1 year ago

2.0.1

1 year ago

2.0.0-alpha.1

1 year ago

2.0.0

1 year ago

1.0.9

1 year ago

1.0.8

1 year ago

1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago