Sourav Mukherjee
@Design By
100% FREE LIFETIME
100% FREE LIFETIME
Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
Convert Any Image to TIFF – Free Online Converter | AllBestTool { “@context”: “https://schema.org”, “@type”: “WebApplication”, “name”: “Image to TIFF Converter”, “url”: “https://allbesttool.com/Convert-Any-Image-to-TIFF”, “description”: “Free online tool to convert images to TIFF format with live compression preview. 100% client-side.”, “applicationCategory”: “UtilityApplication”, “offers”: { “@type”: “Offer”, “price”: “0”, “priceCurrency”: “USD” } } @import url(‘https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Playfair+Display:wght@700&display=swap’); body { font-family: ‘Inter’, sans-serif; background: linear-gradient(135deg, #f0fdfa, #ecfdf5); } .title-font { font-family: ‘Playfair Display’, serif; } .glow-cyan { box-shadow: 0 0 35px rgba(6, 182, 212, 0.3); } .btn-hover:hover { transform: translateY(-3px); box-shadow: 0 15px 35px rgba(6, 182, 212, 0.4); } .drop-active { background: rgba(6, 182, 212, 0.12); border-color: #06b6d4 !important; box-shadow: 0 0 0 6px rgba(6, 182, 212, 0.2); }
πŸ–ΌοΈβ†’πŸ“„

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

How to Use This Tool

  1. Drag & drop or click to upload your image (JPG, PNG, HEIC, AVIF, WebP, SVG, ARW, etc.)
  2. Click Convert to TIFF β€” creates a lossless TIFF file in-browser
  3. View preview (shown as PNG since browsers can’t display TIFF natively) & compare sizes
  4. 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.

// Globals let selectedFile = null; let tiffBlob = null; // DOM elements const dropZone = document.getElementById(‘drop-zone’); const fileInput = document.getElementById(‘file-input’); const mainContent = document.getElementById(‘main-content’); const previewOriginal = document.getElementById(‘preview-original’); const previewResult = document.getElementById(‘preview-result’); const origInfo = document.getElementById(‘orig-info’); const tiffInfo = document.getElementById(‘tiff-info’); const convertBtn = document.getElementById(‘convert-btn’); const downloadBtn = document.getElementById(‘download-btn’); const resetBtn = document.getElementById(‘reset-btn’); const resultMessage = document.getElementById(‘result-message’); // Drag & drop + click dropZone.addEventListener(‘click’, () => fileInput.click()); [‘dragover’, ‘dragenter’].forEach(ev => dropZone.addEventListener(ev, e => { e.preventDefault(); dropZone.classList.add(‘drop-active’); })); [‘dragleave’, ‘drop’].forEach(ev => dropZone.addEventListener(ev, e => { e.preventDefault(); dropZone.classList.remove(‘drop-active’); })); dropZone.addEventListener(‘drop’, e => { const file = e.dataTransfer.files[0]; if (file?.type.startsWith(‘image/’)) handleFile(file); }); fileInput.addEventListener(‘change’, e => { const file = e.target.files[0]; if (file) handleFile(file); }); convertBtn.addEventListener(‘click’, convertToTIFF); downloadBtn.addEventListener(‘click’, downloadTIFF); resetBtn.addEventListener(‘click’, resetAll); function handleFile(file) { if (file.size > 15 * 1024 * 1024) { alert(“File >15MB β€” TIFF conversion may be slow or memory-intensive.”); } selectedFile = file; downloadBtn.disabled = true; resultMessage.classList.add(‘hidden’); const url = URL.createObjectURL(file); previewOriginal.src = url; origInfo.innerHTML = ` File: ${file.name}
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; }
allbesttool.com
Latest posts by allbesttool.com (see all)