scrunchjs
v2.0.5
Published
An extremely efficient image resizer
Downloads
31
Maintainers
Readme
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
- Create an API route for image compression (e.g.,
pages/api/compress-image.js
orapp/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 thecompressImageServer
function orcompressImageClient
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' });
}
};
- 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
: Objectinput
: 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.