diff --git a/index.html b/index.html index 9f0cf74..b5e7875 100644 --- a/index.html +++ b/index.html @@ -1485,13 +1485,29 @@ downloadBtn.addEventListener('click', () => { const now = new Date(); const pad = n => String(n).padStart(2, '0'); const ts = `${now.getFullYear()}${pad(now.getMonth()+1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`; - const link = document.createElement('a'); - link.download = `camera-spec-card-${ts}.jpg`; - link.href = canvas.toDataURL('image/jpeg', 0.92); - link.style.display = 'none'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); + const filename = `camera-spec-card-${ts}.jpg`; + + canvas.toBlob(blob => { + if (!blob) { + const link = document.createElement('a'); + link.download = filename; + link.href = canvas.toDataURL('image/jpeg', 0.92); + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + return; + } + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.download = filename; + link.href = url; + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + setTimeout(() => URL.revokeObjectURL(url), 1000); + }, 'image/jpeg', 0.92); }); function getFileType(file) { @@ -1698,7 +1714,7 @@ function buildMetaFromRaw(exif) { const parts = exif.DateTimeOriginal.split(' '); if (parts[0]) { const parsed = new Date(parts[0].replace(/:/g, '-')); - if (!isNaN(parsed)) date = parsed.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); + if (!isNaN(parsed)) date = parsed.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' }); } } return { camera, lensModel, focalLength, aperture, shutter, iso, date }; @@ -1923,7 +1939,7 @@ function parseFitsHeader(text) { const dateObs = get('DATE-OBS') || get('DATE'); if (dateObs) { const parsed = new Date(dateObs.split('T')[0]); - meta.date = isNaN(parsed) ? dateObs : parsed.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); + meta.date = isNaN(parsed) ? dateObs : parsed.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' }); } else { meta.date = null; } @@ -2144,7 +2160,7 @@ function extractMetaFromTiffIfd(ifd) { if (parts[0]) { const d = parts[0].replace(/:/g, '-'); const parsed = new Date(d); - result.date = isNaN(parsed) ? null : parsed.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); + result.date = isNaN(parsed) ? null : parsed.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' }); } } return result; @@ -2192,7 +2208,7 @@ function extractMeta(exif) { if (parts[0]) { const d = parts[0].replace(/:/g, '-'); const parsed = new Date(d); - if (!isNaN(parsed)) date = parsed.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }); + if (!isNaN(parsed)) date = parsed.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', timeZone: 'UTC' }); } } return { camera, lensModel, focalLength, aperture, shutter, iso, date };