diff --git a/src/components/image-converter.tsx b/src/components/image-converter.tsx index 7fc52e8..b9cd025 100644 --- a/src/components/image-converter.tsx +++ b/src/components/image-converter.tsx @@ -135,7 +135,7 @@ export function ImageConverter() { setFilenames(newFilenames); }; - const generateFinalFilename = (index: number) => { + const generateFinalFilename = (index: number, withDimensions: boolean = false) => { const baseName = filenames[index] || "filename"; let finalName = `${prefix}${baseName}${suffix}`; @@ -144,52 +144,64 @@ export function ImageConverter() { finalName += `${counter}`; } + if (withDimensions && width && height) { + finalName += `_${width}x${height}`; + } + return finalName; }; - const handleConvertAndDownload = async () => { - if (images.length === 0 || !width || !height) { - toast.error("Please upload images and set dimensions."); + const convertAndDownload = (image: File, previewUrl: string, index: number) => { + return new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = "anonymous"; + img.src = previewUrl; + + img.onload = () => { + const canvas = document.createElement("canvas"); + const targetWidth = width ? Number(width) : img.naturalWidth; + const targetHeight = height ? Number(height) : img.naturalHeight; + + canvas.width = targetWidth; + canvas.height = targetHeight; + const ctx = canvas.getContext("2d"); + + if (ctx) { + ctx.drawImage(img, 0, 0, targetWidth, targetHeight); + const mimeType = `image/${format}`; + const dataUrl = canvas.toDataURL(mimeType, format === 'png' ? undefined : quality / 100); + const link = document.createElement("a"); + link.href = dataUrl; + + const dimensionSuffix = width && height ? `_${width}x${height}` : ''; + link.download = `${generateFinalFilename(index)}${dimensionSuffix}.${format}`; + + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + resolve(); + } else { + reject(new Error(`Could not process ${image.name}.`)); + } + }; + img.onerror = () => { + reject(new Error(`Failed to load ${image.name} for conversion.`)); + }; + }); + }; + + const handleConvertAndDownloadAll = async () => { + if (images.length === 0) { + toast.error("Please upload images first."); return; } setIsConverting(true); toast.info(`Starting conversion for ${images.length} images...`); - const conversionPromises = images.map((image, index) => { - return new Promise((resolve, reject) => { - const previewUrl = previewUrls[index]; - const img = new Image(); - img.crossOrigin = "anonymous"; - img.src = previewUrl; - - img.onload = () => { - const canvas = document.createElement("canvas"); - canvas.width = Number(width); - canvas.height = Number(height); - const ctx = canvas.getContext("2d"); - - if (ctx) { - ctx.drawImage(img, 0, 0, Number(width), Number(height)); - const mimeType = `image/${format}`; - const dataUrl = canvas.toDataURL(mimeType, format === 'png' ? undefined : quality / 100); - const link = document.createElement("a"); - link.href = dataUrl; - const finalFilename = generateFinalFilename(index); - link.download = `${finalFilename}_${width}x${height}.${format}`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - resolve(); - } else { - reject(new Error(`Could not process ${image.name}.`)); - } - }; - img.onerror = () => { - reject(new Error(`Failed to load ${image.name} for conversion.`)); - }; - }); - }); + const conversionPromises = images.map((image, index) => + convertAndDownload(image, previewUrls[index], index) + ); try { await Promise.all(conversionPromises); @@ -206,50 +218,11 @@ export function ImageConverter() { }; const handleConvertAndDownloadSingle = async (index: number) => { - if (!width || !height) { - toast.error("Please set dimensions before downloading."); - return; - } - setConvertingIndex(index); toast.info(`Starting conversion for ${filenames[index]}...`); - const image = images[index]; - const previewUrl = previewUrls[index]; - try { - const img = new Image(); - img.crossOrigin = "anonymous"; - img.src = previewUrl; - - await new Promise((resolve, reject) => { - img.onload = () => { - const canvas = document.createElement("canvas"); - canvas.width = Number(width); - canvas.height = Number(height); - const ctx = canvas.getContext("2d"); - - if (ctx) { - ctx.drawImage(img, 0, 0, Number(width), Number(height)); - const mimeType = `image/${format}`; - const dataUrl = canvas.toDataURL(mimeType, format === 'png' ? undefined : quality / 100); - const link = document.createElement("a"); - link.href = dataUrl; - const finalFilename = generateFinalFilename(index); - link.download = `${finalFilename}_${width}x${height}.${format}`; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - resolve(); - } else { - reject(new Error(`Could not process ${image.name}.`)); - } - }; - img.onerror = () => { - reject(new Error(`Failed to load ${image.name} for conversion.`)); - }; - }); - + await convertAndDownload(images[index], previewUrls[index], index); toast.success(`Successfully exported ${filenames[index]}!`); } catch (error) { if (error instanceof Error) { @@ -281,11 +254,11 @@ export function ImageConverter() {
- setWidth(e.target.value)} /> + setWidth(e.target.value)} />
- setHeight(e.target.value)} /> + setHeight(e.target.value)} />
@@ -382,14 +355,6 @@ export function ImageConverter() { -
@@ -418,7 +383,7 @@ export function ImageConverter() { Uploaded Images
- @@ -428,45 +393,48 @@ export function ImageConverter() {
- {previewUrls.map((url, index) => ( -
- {`Preview -
- - handleFilenameChange(index, e.target.value)} - className="text-sm font-medium h-8 mt-1" - /> -

- Final name: {generateFinalFilename(index)}.{format} -

+ {previewUrls.map((url, index) => { + const finalFilename = generateFinalFilename(index, true); + return ( +
+ {`Preview +
+ + handleFilenameChange(index, e.target.value)} + className="text-sm font-medium h-8 mt-1" + /> +

+ Final name: {finalFilename}.{format} +

+
+
+ + +
-
- - -
-
- ))} + ); + })}