πΌοΈβπ
Image to TIFF Converter
Upload any image and convert it to high-quality TIFF format instantly for better compression and lossless support.
100% browser-based & secure. Perfect for modern web images, photography, and archiving.
Learn more about convert image to tiff.
Convert JPG, PNG, HEIC, AVIF, WebP & more to lossless TIFF β 100% in-browser β’ Private β’ No upload
β¬οΈ
Drag & Drop or Click to Upload
JPG β’ PNG β’ HEIC β’ AVIF β’ WebP β’ SVG β’ ARW β’ TIFF β’ GIF
Original Image
TIFF Result (Preview as PNG)
How to Use This Tool
- Drag & drop or click to upload your image (JPG, PNG, HEIC, AVIF, WebP, SVG, ARW, etc.)
- Click Convert to TIFF β creates a lossless TIFF file in-browser
- View preview (shown as PNG since browsers can’t display TIFF natively) & compare sizes
- Click Download .tiff β open in Photoshop, GIMP, Preview, etc.
Note: TIFF is uncompressed/lossless here β file size is often larger than compressed formats like JPG/WebP.
Size: ${(file.size / 1024 / 1024).toFixed(2)} MB
Type: ${file.type.split(‘/’)[1]?.toUpperCase() || file.type} `; mainContent.classList.remove(‘hidden’); previewResult.src = ”; tiffInfo.innerHTML = ”; } async function convertToTIFF() { if (!selectedFile) return alert(“Upload an image first”); convertBtn.disabled = true; convertBtn.innerHTML = ‘Converting… β»‘; try { const img = await new Promise((res, rej) => { const i = new Image(); i.onload = () => res(i); i.onerror = rej; i.src = URL.createObjectURL(selectedFile); }); const canvas = document.createElement(‘canvas’); canvas.width = img.width; canvas.height = img.height; const ctx = canvas.getContext(‘2d’); ctx.drawImage(img, 0, 0); previewResult.src = canvas.toDataURL(‘image/png’); // Create TIFF from canvas (uncompressed RGB/RGBA) tiffBlob = await canvasToTiff(canvas); const origMB = (selectedFile.size / 1024 / 1024).toFixed(2); const tiffMB = (tiffBlob.size / 1024 / 1024).toFixed(2); const pct = ((tiffBlob.size – selectedFile.size) / selectedFile.size * 100).toFixed(1); tiffInfo.innerHTML = ` TIFF Size: ${tiffMB} MB
Dimensions: ${canvas.width} Γ ${canvas.height}
Compression: None (lossless uncompressed) `; resultMessage.innerHTML = ` Success! Original: ${origMB} MB β TIFF: ${tiffMB} MB <span class="${pct (${pct < 0 ? '-' : '+'}${Math.abs(pct)}%)
TIFF files are usually larger (uncompressed format). `; resultMessage.classList.remove(‘hidden’); downloadBtn.disabled = false; } catch (err) { console.error(err); resultMessage.innerHTML = “Failed to create TIFF.
Try smaller image or different format.
Error: ” + err.message; resultMessage.classList.remove(‘hidden’); } convertBtn.disabled = false; convertBtn.innerHTML = ‘Convert to TIFF π‘; } // Simple custom TIFF writer (uncompressed RGB/RGBA) async function canvasToTiff(canvas) { const ctx = canvas.getContext(‘2d’); const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); const pixels = imageData.data; const hasAlpha = pixels.some((v, i) => i % 4 === 3 && v < 255); const width = canvas.width; const height = canvas.height; const samplesPerPixel = hasAlpha ? 4 : 3; const bitsPerSample = 8; const byteOrder = 0x4949; // II (little-endian) // TIFF header let offset = 0; const buffer = new ArrayBuffer(8 + 200 + width * height * samplesPerPixel + 1000); // rough size const view = new DataView(buffer); // Header: II* (little-endian) + magic 42 + offset to IFD view.setUint16(offset, byteOrder, true); offset += 2; view.setUint16(offset, 42, true); offset += 2; view.setUint32(offset, 8, true); offset += 4; // IFD starts at byte 8 // IFD count = 12 entries view.setUint16(offset, 12, true); offset += 2; // IFD entries (tag, type, count, value/offset) const tags = [ [254, 4, 1, 0], // NewSubfileType = 0 [256, 4, 1, width], // ImageWidth [257, 4, 1, height], // ImageLength [258, 3, samplesPerPixel, hasAlpha ? 8 : 8], // BitsPerSample (offset later) [259, 3, 1, 1], // Compression = 1 (none) [262, 3, 1, hasAlpha ? 2 : 2], // PhotometricInterpretation = 2 (RGB) [266, 3, 1, 1], // FillOrder = 1 [273, 4, 1, 0], // StripOffsets (patch later) [274, 3, 1, 1], // Orientation = 1 [277, 3, 1, samplesPerPixel], // SamplesPerPixel [278, 4, 1, height], // RowsPerStrip [279, 4, 1, 0] // StripByteCounts (patch later) ]; let dataOffset = offset + tags.length * 12 + 4; // after IFD + next IFD offset = 0 // Write tags for (let tag of tags) { view.setUint16(offset, tag[0], true); offset += 2; view.setUint16(offset, tag[1], true); offset += 2; view.setUint32(offset, tag[2], true); offset += 4; if (tag[0] === 258) { // BitsPerSample – needs offset view.setUint32(offset, dataOffset, true); dataOffset += 6; // 3 shorts } else if (tag[0] === 273) { // StripOffsets view.setUint32(offset, dataOffset, true); } else if (tag[0] === 279) { // StripByteCounts view.setUint32(offset, width * height * samplesPerPixel, true); } else { view.setUint32(offset, tag[3], true); } offset += 4; } // Next IFD offset = 0 view.setUint32(offset, 0, true); offset += 4; // BitsPerSample values view.setUint16(offset, 8, true); offset += 2; view.setUint16(offset, 8, true); offset += 2; if (hasAlpha) { view.setUint16(offset, 8, true); offset += 2; } // Image data (RGBA or RGB interleaved) const imageDataOffset = offset; for (let i = 0; i URL.revokeObjectURL(url), 100); } function resetAll() { selectedFile = null; tiffBlob = null; fileInput.value = ”; mainContent.classList.add(‘hidden’); resultMessage.classList.add(‘hidden’); previewOriginal.src = ”; previewResult.src = ”; origInfo.innerHTML = ”; tiffInfo.innerHTML = ”; downloadBtn.disabled = true; }
Latest posts by allbesttool.com (see all)
- Why Ziptie? On Choosing a Search Performance Tool - February 8, 2026
- AdSense Approval Checker tools - May 23, 2024
