pic / src /utils /resize.ts
chriswu25's picture
Add squish app source, Dockerfile and HF config
2bc6d22
import { createCanvas, imageDataToCanvas } from './canvas';
interface ResizeOptions {
width?: number;
height?: number;
maintainAspectRatio?: boolean;
}
export function calculateDimensions(
originalWidth: number,
originalHeight: number,
options: ResizeOptions
): { width: number; height: number } {
const { width: targetWidth = 0, height: targetHeight = 0, maintainAspectRatio = true } = options;
if (!targetWidth && !targetHeight) {
return { width: originalWidth, height: originalHeight };
}
let finalWidth = targetWidth || originalWidth;
let finalHeight = targetHeight || originalHeight;
if (maintainAspectRatio) {
const aspectRatio = originalWidth / originalHeight;
if (targetWidth && !targetHeight) {
finalWidth = targetWidth;
finalHeight = Math.round(targetWidth / aspectRatio);
} else if (!targetWidth && targetHeight) {
finalHeight = targetHeight;
finalWidth = Math.round(targetHeight * aspectRatio);
} else {
const widthRatio = targetWidth / originalWidth;
const heightRatio = targetHeight / originalHeight;
const ratio = Math.min(widthRatio, heightRatio);
finalWidth = Math.round(originalWidth * ratio);
finalHeight = Math.round(originalHeight * ratio);
}
}
return {
width: Math.max(1, finalWidth),
height: Math.max(1, finalHeight),
};
}
export function resizeImage(imageData: ImageData, options: ResizeOptions): ImageData {
const sourceCanvas = imageDataToCanvas(imageData);
const { width, height } = calculateDimensions(
imageData.width,
imageData.height,
options
);
const destCanvas = createCanvas(width, height);
const ctx = destCanvas.getContext('2d')!;
// Use better image scaling algorithm
ctx.imageSmoothingEnabled = true;
ctx.imageSmoothingQuality = 'high';
ctx.drawImage(sourceCanvas, 0, 0, width, height);
return ctx.getImageData(0, 0, width, height);
}