From 15deb9e044f501212745e06235449cab84038507 Mon Sep 17 00:00:00 2001 From: "[dyad]" Date: Sun, 18 Jan 2026 11:29:03 +0100 Subject: [PATCH] [dyad] Added individual image download - wrote 1 file(s) --- src/components/image-converter.tsx | 89 ++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 6 deletions(-) diff --git a/src/components/image-converter.tsx b/src/components/image-converter.tsx index 9eb7c99..e1cebf3 100644 --- a/src/components/image-converter.tsx +++ b/src/components/image-converter.tsx @@ -48,6 +48,7 @@ export function ImageConverter() { const [counterDigits, setCounterDigits] = useState(3); const [isConverting, setIsConverting] = useState(false); + const [convertingIndex, setConvertingIndex] = useState(null); const [isDraggingOver, setIsDraggingOver] = useState(false); const fileInputRef = useRef(null); @@ -204,6 +205,63 @@ 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.`)); + }; + }); + + toast.success(`Successfully exported ${filenames[index]}!`); + } catch (error) { + if (error instanceof Error) { + toast.error(error.message); + } else { + toast.error("An unknown error occurred during conversion."); + } + } finally { + setConvertingIndex(null); + } + }; + const hasImages = images.length > 0; return ( @@ -336,7 +394,7 @@ export function ImageConverter() { - + @@ -395,9 +453,28 @@ export function ImageConverter() { Final name: {generateFinalFilename(index)}.{format}

- +
+ + +
))}