# File Convert Factory — Full Content Export > Free Online Image Converter — 100% client-side, no uploads, no sign-up. Supports HEIC, JPG, PNG, WebP, and ICO formats. All processing happens locally in your browser via WebAssembly (for HEIC) or the HTML5 Canvas API (for JPG, PNG, WebP, and ICO). Your files never leave your device. ## Product Summary File Convert Factory is a free browser-based image conversion tool built for speed, privacy, and simplicity. **Core Features:** - **100% Private**: Your files never leave your device. All conversions run locally in your browser — no uploads, no servers, no logs. - **Zero Friction**: No account, no watermark, no limits. Drop a file, convert it, download it. - **Blazing Fast**: WebAssembly-powered processing at near-native speed. No server round-trips, no queues, no waiting. - **Original Quality Preserved**: Every conversion keeps the original resolution and color accuracy. - **No Software to Install**: Your browser is all you need. - **Truly Free, Forever**: No paywalls, no subscription tiers, no upgrade-for-HD traps. **Supported Conversions:** | Conversion | Input | Output | Technology | |---|---|---|---| | HEIC to JPG | .heic, .heif, .hif | .jpg | WebAssembly (libheif) | | HEIC to PNG | .heic, .heif, .hif | .png | WebAssembly (libheif) | | HEIC to WebP | .heic, .heif, .hif | .webp | WebAssembly (libheif) | | JPG to PNG | .jpg, .jpeg | .png | HTML5 Canvas API | | JPG to WebP | .jpg, .jpeg | .webp | HTML5 Canvas API | | JPG to ICO | .jpg, .jpeg | .ico | HTML5 Canvas API | | PNG to JPG | .png | .jpg | HTML5 Canvas API | | PNG to WebP | .png | .webp | HTML5 Canvas API | | PNG to ICO | .png | .ico | HTML5 Canvas API | | WebP to PNG | .webp | .png | HTML5 Canvas API | | WebP to JPG | .webp | .jpg | HTML5 Canvas API | | WebP to ICO | .webp | .ico | HTML5 Canvas API | | ICO to JPG | .ico | .jpg | icojs + HTML5 Canvas API | | ICO to PNG | .ico | .png | icojs + HTML5 Canvas API | The site also includes a free [Text Repeater](/tools/text-repeater) for repeating text, emojis, and symbols with custom separators up to 10,000×. **Format Comparison:** | Format | Compression | Transparency | Best For | |---|---|---|---| | JPG | Lossy | No | Sharing, printing, social media — opens everywhere | | PNG | Lossless | Yes | Design work, editing, archival — no quality loss | | WebP | Lossy / Lossless | Yes | Websites, apps, storage — 25–35% smaller than JPG | | ICO | Lossless | Yes | Windows icons, website favicons — multi-size container | **How It Works:** 1. Drop your files — drag photos from your device or click to browse. Supports multiple files and entire folders. 2. Choose your format — pick the output format that fits your use case. 3. Convert locally — processing runs entirely inside your browser. No upload, no server queue. 4. Download — save individual images or grab everything as a ZIP archive. ## Tools ### AI Image Upscaler Upscale images to 1K, 2K, or 4K with AI in your browser **About AI Image Upscaling** A small image stretched to a larger size normally goes soft, because the extra pixels are averaged from their neighbors. This tool runs a Real-ESRGAN model trained for image restoration, so edges stay defined and textures keep their grain instead of smearing. You can pick a 1K, 2K, or 4K target for the long edge of the result. The model runs entirely in your browser through WebAssembly and WebGPU. Your image is decoded, upscaled, and encoded on your device, and nothing is sent to a server. On machines with a capable GPU the work is hardware accelerated. Other devices fall back to the CPU and take longer. Upscaling works best on images that are clean but small: screenshots, icons, product photos, older digital photos. It cannot recover detail the camera never captured, and heavily compressed images may keep some artifacts. For 4K output from a small image, anything past 4x the original size is filled in by high-quality scaling rather than new detail. The result downloads as a PNG. **How to Upscale an Image** 1. Add your image — Drag in a JPG, PNG, or WebP file, or click to browse. One image at a time, up to 2048×2048 pixels. 2. Pick a size and upscale — Choose 1K, 2K, or 4K and click Upscale. The AI model rebuilds the image at that resolution, right on your device. The first run downloads the model, so it takes a few extra seconds. 3. Compare and download — Drag the slider to check the result against the original, then download the PNG. Nothing is uploaded at any point. **Frequently Asked Questions:** - Is this AI image upscaler free? Yes. There are no accounts, credits, watermarks, or usage limits. The processing happens on your device, so there is no server cost passed on to you. - Are my images uploaded anywhere? No. The AI model runs locally in your browser. Your image never leaves your device, and nothing is stored or transmitted. - What do the 1K, 2K, and 4K options mean? They set the long edge of the result to 1024, 2048, or 4096 pixels, keeping the original aspect ratio. The AI enhances the image first, then it is resized to the target you picked. For 4K output from a small image, anything past 4x the original size comes from high-quality scaling, not new detail. - Which formats are supported? You can add JPG, PNG, and WebP images up to 2048×2048 pixels and 20 MB. The upscaled result downloads as a PNG. - Why is the first upscale slow? The first run downloads the AI model, a file of a few megabytes, and caches it in your browser. Later visits load it from the cache and start faster. Speed also depends on your device: browsers with WebGPU use the GPU, others use the CPU. - Can it fix a very blurry photo? It can sharpen soft or small images, but it cannot recreate detail the camera never captured. A heavily blurred photo will look cleaner at a larger size, not perfectly sharp. ### Batch HEIC to JPG Convert HEIC format to JPG format **About HEIC to JPG** HEIC is Apple's default photo format since iOS 11. It compresses images at half the file size of JPG while keeping the same visual quality. The trade-off: most Windows PCs, Android devices, web platforms, and older apps cannot open it. This tool converts HEIC files to JPG directly in your browser. The conversion runs locally with WebAssembly, so your photos stay on your device. Nothing is uploaded to a server. Output keeps full resolution and color accuracy. At the default 90% quality, the difference from the original is usually invisible. JPG opens on every device without extra software. We do not add watermarks or impose usage limits. **How to Convert HEIC to JPG** 1. Drop your HEIC files — Drag photos from your iPhone or computer, or click to browse. We accept multiple files at once. 2. Convert instantly — The tool decodes each HEIC file locally in your browser using WebAssembly. Your files are not uploaded to any server. 3. Download JPG — Download JPG — universal on every device. Use the quality slider to balance size and fidelity. **Frequently Asked Questions:** - What is HEIC and why do I need to convert it? HEIC is Apple's default photo format on iPhone and iPad. It saves space but is not supported by many apps, websites, and older devices. Converting to JPG makes your photos universally compatible. - What is JPG format? JPG (or JPEG) is the most widely used image format on the internet. It uses lossy compression to keep file sizes small while maintaining acceptable visual quality for photographs. Every device, browser, and image editor supports it without plugins or conversion. - Will the image quality be preserved? Resolution and color accuracy are fully preserved. JPG is a lossy format, so some data is discarded during compression — this is how it achieves smaller files. At the default 90% quality setting, the difference is invisible to the naked eye. You can lower the slider if you need smaller files, though dropping below 70% may introduce visible artifacts. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most HEIC photos from iPhones convert instantly. - Do I need to sign up or pay? No. You do not need an account, and we never add watermarks or charge for HD output. Every feature is free and unlimited. - Is my photo data safe? Yes. All conversions run in your browser using WebAssembly. Your photos stay on your device and are not uploaded or logged. ### Batch HEIC to PNG Convert HEIC format to PNG format **About HEIC to PNG** HEIC is Apple's default photo format since iOS 11. It compresses images at half the file size of JPG while keeping the same visual quality. The trade-off: most Windows PCs, Android devices, web platforms, and older apps cannot open it. This tool converts HEIC files to PNG directly in your browser. PNG supports transparency and lossless compression, which makes it useful for design work and archival. Because everything runs locally with WebAssembly, your photos never leave your device. Output keeps full resolution and color accuracy. PNG preserves transparency and uses lossless compression, so no image data is discarded. We do not add watermarks or impose usage limits. **How to Convert HEIC to PNG** 1. Drop your HEIC files — Drag photos from your iPhone or computer, or click to browse. We accept multiple files at once. 2. Convert instantly — The HEIC decoder runs locally in your browser via WebAssembly. Your files stay on your device throughout the conversion. 3. Download PNG — Download PNG — lossless with transparency preserved. Ideal for editing, design, and archival. **Frequently Asked Questions:** - What is HEIC and why do I need to convert it? HEIC is Apple's default photo format on iPhone and iPad. It saves space but is not supported by many apps, websites, and older devices. Converting to PNG gives you a lossless format with transparency support. - What is PNG format? PNG is a lossless image format that supports transparency. Unlike JPG, it does not throw away image data during compression, which makes it ideal for graphics with sharp edges, text, logos, and any image where you need a transparent background. - Will the image quality be preserved? Yes. PNG uses lossless compression, meaning no image data is thrown away. Resolution, color accuracy, and any transparency are preserved exactly. The trade-off is larger file sizes compared to JPG or WebP. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most HEIC photos from iPhones convert instantly. - Do I need to sign up or pay? No. We do not ask you to subscribe, add watermarks, or hide higher quality behind a paywall. The tool is free to use. - Is my photo data safe? Yes. The HEIC decoder runs locally in your browser via WebAssembly. Your files never leave your device. ### Batch HEIC to WebP Convert HEIC format to WebP format **About HEIC to WebP** HEIC is Apple's default photo format since iOS 11. It compresses images at half the file size of JPG while keeping the same visual quality. The trade-off: most Windows PCs, Android devices, web platforms, and older apps cannot open it. This tool converts HEIC files to WebP directly in your browser. WebP typically produces smaller files than JPG at the same visual quality. The conversion runs locally with WebAssembly; your photos are not uploaded. Output matches the original in resolution and color, but at 25–35% smaller file sizes than equivalent JPG. WebP is supported by all current browsers. We do not add watermarks or impose usage limits. **How to Convert HEIC to WebP** 1. Drop your HEIC files — Drag photos from your iPhone or computer, or click to browse. We accept multiple files at once. 2. Convert instantly — Each HEIC file is decoded locally in your browser using WebAssembly. Nothing is sent to a server. 3. Download WebP — Download WebP — smaller than JPG at the same quality. Perfect for websites and apps. **Frequently Asked Questions:** - What is HEIC and why do I need to convert it? HEIC is Apple's default photo format on iPhone and iPad. It saves space but is not supported by many apps, websites, and older devices. Converting to WebP gives you a modern format with excellent compression. - What is WebP format? WebP is a modern image format developed by Google. It compresses better than both JPG and PNG — smaller files at the same visual quality — and supports both lossy and lossless compression plus transparency. Most modern browsers and platforms now support it. - Will the image quality be preserved? Resolution and color accuracy are fully preserved. WebP uses a more efficient lossy compression than JPG, so you get smaller files at the same visual quality. At the default 90% setting, the difference from the original is invisible. You can adjust the slider to find your preferred balance between size and fidelity. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most HEIC photos from iPhones convert instantly. - Do I need to sign up or pay? No. There are no fees, no subscriptions, and no watermarks. Every feature is free and unlimited. - Is my photo data safe? Yes. Everything is processed in your browser with WebAssembly. We do not upload, store, or log your photos. ### Batch HEIC to ICO Convert HEIC to Windows ICO favicon icons **About HEIC to ICO** A favicon or app icon has to stay sharp at 16×16 pixels in a browser tab and at 256×256 on a high-DPI desktop. HEIC cannot do that on its own. ICO is the container format that packs several bitmap sizes into one file, so the operating system or browser picks the best size automatically. This tool converts HEIC files to ICO directly in your browser. HEIC is the default photo format on iPhone and iPad, which makes this a handy way to turn a photo into an icon. The conversion runs locally using WebAssembly and the Canvas API; your images are not uploaded. It generates the common icon sizes from your source image and skips any larger than the source to avoid blurry upscaling. You can also pick which sizes to include. The result is a single ICO file ready for a favicon or Windows project. We do not add watermarks or impose usage limits. **How to Convert HEIC to ICO** 1. Drop your HEIC files — Drag photos from your iPhone or computer, or click to browse. We accept multiple files at once. 2. Pick icon sizes — Choose which sizes to include. The default set covers most favicons and Windows icons. 3. Convert and download ICO — Each HEIC is decoded locally in your browser. Download one ICO file ready for a favicon or Windows icon. **Frequently Asked Questions:** - What is HEIC and why do I need to convert it? HEIC is Apple's default photo format on iPhone and iPad. It saves space but is not supported as an icon format by Windows or most browsers. Converting to ICO gives you a file Windows and browsers can use for favicons and app icons. - What is ICO format? ICO is the icon format used by Windows and browsers. A single ICO file holds multiple sizes, from 16×16 to 256×256, so the right size is used wherever the icon appears. - Will the image quality be preserved? Yes. ICO output is lossless. Each selected size is rendered from the original HEIC, so edges stay clean. Sizes larger than your source are skipped rather than upscaled, which would add blur. - Which sizes should I pick? The default covers the common sizes: 16, 24, 32, 48, 64, 128, and 256 pixels. For a basic favicon, 32 and 48 are usually enough. For a Windows app icon, keep the larger sizes too. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most HEIC photos from iPhones convert quickly. - Do I need to sign up or pay? No. There are no fees, no subscriptions, and no watermarks. Every feature is free and unlimited. - Is my photo data safe? Yes. Everything is processed in your browser with WebAssembly. We do not upload, store, or log your photos. ### Batch JPG to PNG Convert JPG to transparent PNG in your browser **About JPG to PNG** JPG works well for photos, but it has two hard limits: no transparency, and every save throws away more data. If you need to place a logo on a colored background, remove a background, or edit an image repeatedly without quality loss, JPG is the wrong starting point. PNG solves all three problems. This tool converts JPG files to PNG directly in your browser. PNG is a lossless format that supports transparency, making it ideal for design work, editing, and archival. The conversion runs locally using the Canvas API, so your photos stay on your device. Output keeps full resolution, exact colors, and transparency preserved. PNG uses lossless compression, so no image data is discarded. We do not add watermarks or impose usage limits. **How to Convert JPG to PNG** 1. Drop your JPG files — Drag photos from your computer, or click to browse. We accept JPG and JPEG files. 2. Convert instantly — The tool reads each JPG file locally in your browser using the Canvas API. Your files are not uploaded to any server. 3. Download PNG — Download PNG — lossless with transparency preserved. Ideal for editing, design, and archival. **Frequently Asked Questions:** - Why convert JPG to PNG? PNG is a lossless format that supports transparency. Unlike JPG, it does not throw away image data during compression. This makes it ideal for graphics with sharp edges, text, logos, and any image where you need a transparent background. - What is PNG format? PNG is a lossless image format that supports transparency. Unlike JPG, it does not throw away image data during compression, which makes it ideal for graphics with sharp edges, text, logos, and any image where you need a transparent background. - Will the image quality be preserved? Yes. PNG uses lossless compression, meaning no image data is thrown away. Resolution, color accuracy, and any transparency are preserved exactly. The trade-off is larger file sizes compared to JPG or WebP. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most photos convert instantly. - Do I need to sign up or pay? No. You can convert as many files as you want without signing up. We do not watermark output or limit usage. - Is my photo data safe? Yes. All conversions run in your browser using the Canvas API. Your photos stay on your device and are not uploaded or logged. ### Batch JPG to WebP Convert JPG to smaller WebP for the web **About JPG to WebP** Page speed affects user experience and search rankings. A 500 KB JPG banner often becomes a 320 KB WebP file with no visible difference, which is 180 KB less per visitor. For a product page with twelve images, the savings add up to multiple seconds of load time. WebP works in all current browsers and is a practical choice for images that live on the web. This tool converts JPG files to WebP directly in your browser. WebP supports both lossy and lossless compression, and it can produce smaller files than JPG. The conversion runs locally using the Canvas API; your photos never leave your device. Output matches the original in resolution and color, but at 25–35% smaller file sizes than equivalent JPG. WebP is supported by all current browsers. We do not add watermarks or impose usage limits. **How to Convert JPG to WebP** 1. Drop your JPG files — Drag photos from your computer, or click to browse. We accept JPG and JPEG files. 2. Convert instantly — Each JPG is processed locally in your browser using the Canvas API. Your files stay on your device. 3. Download WebP — Download WebP — smaller than JPG at the same quality. Perfect for websites and apps. **Frequently Asked Questions:** - Why convert JPG to WebP? WebP is a modern image format developed by Google. It compresses better than both JPG and PNG — smaller files at the same visual quality — and supports both lossy and lossless compression plus transparency. Most modern browsers and platforms now support it. - What is WebP format? WebP is a modern image format developed by Google. It compresses better than both JPG and PNG — smaller files at the same visual quality — and supports both lossy and lossless compression plus transparency. Most modern browsers and platforms now support it. - Will the image quality be preserved? Resolution and color accuracy are fully preserved. WebP uses a more efficient lossy compression than JPG, so you get smaller files at the same visual quality. At the default 90% setting, the difference from the original is invisible. You can adjust the slider to find your preferred balance between size and fidelity. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most photos convert instantly. - Do I need to sign up or pay? No. The converter is completely free. We do not charge, subscribe, or watermark your files. - Is my photo data safe? Yes. The conversion happens locally in your browser via the Canvas API. Your files never leave your device. ### Batch JPG to ICO Convert JPG to Windows ICO favicon icons **About JPG to ICO** A favicon must render sharp at 16×16 pixels in a browser tab and crisp at 256×256 on a high-DPI desktop. JPG was never designed for this — it is a photo format with no native multi-resolution support and no alpha channel for transparent backgrounds. ICO is the container format Windows and browsers expect for icons, holding multiple bitmap sizes in a single file so the OS picks the right one automatically. This tool converts JPG files to ICO directly in your browser. ICO is the standard Windows icon format, used for application icons, folder icons, and website favicons. The conversion runs locally using the Canvas API, so your photos stay on your device. Automatically generates commonly used icon sizes (16×16 to 256×256) based on your source image in a single ICO file. Sizes larger than the source image are skipped to avoid upscaling artifacts. The result works for website favicons and Windows application icons. We do not add watermarks or impose usage limits. **How to Convert JPG to ICO** 1. Drop your JPG files — Drag photos from your computer, or click to browse. We accept JPG and JPEG files. 2. Convert instantly — The tool resamples each JPG locally in your browser using the Canvas API. Your files are not uploaded. 3. Download ICO — Download ICO — multi-size icon files ready for Windows and favicon use. **Frequently Asked Questions:** - Why convert JPG to ICO? ICO is the standard Windows icon format. It is used for application icons, folder icons, and website favicons. Converting your JPG images to ICO creates multi-size icon files that work across all Windows versions and browsers. - What is ICO format? ICO is the standard Windows icon format. It is a container that holds multiple image sizes in one file. Windows uses it for application and folder icons, while websites use it as the favicon displayed in browser tabs. - What icon sizes are generated? The tool generates common standard sizes (16×16, 24×24, 32×32, 48×48, 64×64, 128×128, and 256×256) based on your source image. Sizes larger than the source image are automatically skipped to avoid upscaling artifacts. You can also manually select which sizes to include before converting. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most photos convert instantly. - Do I need to sign up or pay? No. No account is required and no watermark is added. The tool is free to use, with no limits. - Is my photo data safe? Yes. Everything is processed in your browser with the Canvas API. We do not upload, store, or log your images. ### Batch WebP to PNG Convert WebP to transparent PNG in your browser **About WebP to PNG** WebP produces smaller files than JPG and supports transparency, which makes it excellent for the web. But not every design tool, old browser, or editing workflow accepts WebP natively. PNG is the safer choice when you need lossless quality, universal compatibility, or a transparent background that every editor understands. This tool converts WebP files to PNG directly in your browser. PNG stores every pixel exactly, so resolution, colors, and transparency are preserved without loss. Everything runs locally using the Canvas API; your images are not uploaded. Output preserves resolution, colors, and transparency from the original WebP. File sizes will be larger because PNG does not use lossy compression, but nothing is thrown away. We do not add watermarks or impose usage limits. **How to Convert WebP to PNG** 1. Drop your WebP files — Drag images from your computer, or click to browse. We accept .webp files. 2. Convert instantly — The tool decodes each WebP file locally in your browser using the Canvas API. Your files stay on your device. 3. Download PNG — Download PNG — lossless with transparency preserved. Ideal for editing, design, and archival. **Frequently Asked Questions:** - Why convert WebP to PNG? PNG is a lossless format that supports transparency and is accepted by almost every image editor, browser, and design tool. If your WebP file needs to be edited, archived, or opened in software that does not support WebP, PNG is the reliable choice. - What is PNG format? PNG is a lossless image format that supports transparency. Unlike JPG or WebP, it does not throw away image data during compression, which makes it ideal for graphics with sharp edges, text, logos, and any image where you need a transparent background. - Will the image quality be preserved? Yes. PNG uses lossless compression, meaning no image data is thrown away. Resolution, color accuracy, and any transparency from the original WebP are preserved exactly. The trade-off is larger file sizes compared to the original WebP. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most WebP images convert instantly. - Do I need to sign up or pay? No. You do not need to register, and we never add watermarks or charge for HD output. Every feature is free and unlimited. - Is my photo data safe? Yes. All conversions run in your browser using the Canvas API. Your images stay on your device and are not uploaded or logged. ### Batch WebP to JPG Convert WebP to JPG with adjustable quality **About WebP to JPG** WebP is efficient for websites, but it is not accepted everywhere. Some galleries, print services, legacy systems, and social platforms still expect JPG. JPG also has one practical advantage: almost every device and application can open it without extra software. This tool converts WebP files to JPG directly in your browser. Because JPG does not support transparency, any transparent areas in the source image are filled with a white background before conversion. The conversion runs locally using the Canvas API, so your images stay on your device. Use the quality slider to choose between smaller files and higher fidelity. At the default 90% quality, the difference from the original is usually invisible. Output keeps the original resolution and works on every device. We do not add watermarks or impose usage limits. **How to Convert WebP to JPG** 1. Drop your WebP files — Drag images from your computer, or click to browse. We accept .webp files. 2. Convert instantly — Each WebP is processed locally in your browser using the Canvas API. Your files are not uploaded to any server. 3. Download JPG — Download JPG — universal on every device. Use the quality slider to balance size and fidelity. **Frequently Asked Questions:** - Why convert WebP to JPG? JPG is the most widely supported image format. Converting WebP to JPG makes the image compatible with older browsers, social platforms, print services, and any workflow that does not yet accept WebP. - What happens to transparency? JPG does not support transparency. Any transparent areas in the source WebP are filled with a white background before conversion. The rest of the image is preserved at the quality level you select. - Will the image quality be preserved? Resolution and color accuracy are fully preserved. JPG is a lossy format, so some data is discarded during compression. At the default 90% quality, the difference is invisible to the naked eye. You can lower the slider for smaller files, though values below 70% may introduce visible artifacts. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most WebP images convert instantly. - Do I need to sign up or pay? No. We do not ask you to subscribe, add watermarks, or hide higher quality behind a paywall. The tool is free to use. - Is my photo data safe? Yes. The conversion happens locally in your browser via the Canvas API. Your files never leave your device. ### Batch WebP to ICO Convert WebP to Windows ICO favicon icons **About WebP to ICO** A website favicon or Windows application icon needs to look crisp at multiple sizes, from 16×16 in a browser tab to 256×256 on a high-DPI desktop. WebP is not designed for this. ICO is the container format that packs several bitmap sizes into one file, letting the operating system choose the best size automatically. This tool converts WebP files to ICO directly in your browser. It generates common icon sizes and packs them into a single ICO file suitable for favicons and Windows icons. The conversion runs locally using the Canvas API; your images are not uploaded. Sizes larger than your source image are skipped to avoid blurry upscaling. You can also manually select which sizes to include. The result is a single ICO file ready to use for a website or Windows project. We do not add watermarks or impose usage limits. **How to Convert WebP to ICO** 1. Drop your WebP files — Drag images from your computer, or click to browse. We accept .webp files. 2. Convert instantly — The tool reads each WebP locally in your browser using the Canvas API. Your files stay on your device. 3. Download ICO — Download ICO — multi-size icon files ready for Windows and favicon use. **Frequently Asked Questions:** - Why convert WebP to ICO? ICO is the standard Windows icon format. It is used for application icons, folder icons, and website favicons. Converting your WebP images to ICO creates multi-size icon files that work across all Windows versions and browsers. - What is ICO format? ICO is the standard Windows icon format. It is a container that holds multiple image sizes in one file. Windows uses it for application and folder icons, while websites use it as the favicon displayed in browser tabs. - What icon sizes are generated? The tool generates common standard sizes (16×16, 24×24, 32×32, 48×48, 64×64, 128×128, and 256×256) based on your source image. Sizes larger than the source image are automatically skipped to avoid upscaling artifacts. You can also manually select which sizes to include before converting. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most WebP images convert instantly. - Do I need to sign up or pay? No. There are no fees, no subscriptions, and no watermarks. Every feature is free and unlimited. - Is my photo data safe? Yes. Everything is processed in your browser with the Canvas API. We do not upload, store, or log your images. ### Batch PNG to JPG Convert PNG to JPG with adjustable quality **About PNG to JPG** PNG is the right choice when you need lossless quality or a transparent background. It preserves every pixel, which makes it ideal for logos, screenshots, and design assets. The downside is file size. A PNG photograph can be several times larger than the equivalent JPG, which matters when you are sharing by email, uploading to a gallery, or printing through a service that caps file size. This tool converts PNG files to JPG directly in your browser. JPG is supported by every device, browser, and print service without extra software. Because JPG does not support transparency, transparent areas are filled with a white background before conversion. The conversion runs locally using the Canvas API; your images stay on your device. Use the quality slider to choose between smaller files and higher fidelity. At the default 90% quality, the difference from the original is usually invisible. Output keeps the original resolution and works on every device. Transparent areas are filled with white. We do not add watermarks or impose usage limits. **How to Convert PNG to JPG** 1. Drop your PNG files — Drag images from your computer, or click to browse. We accept .png files. 2. Convert instantly — The tool reads each PNG file locally in your browser using the Canvas API. Your files are not uploaded to any server. 3. Download JPG — Download JPG — universal on every device. Transparent areas are filled with white. Use the quality slider to balance size and fidelity. **Frequently Asked Questions:** - Why convert PNG to JPG? JPG files are smaller and open on every device, browser, and print service. If you do not need transparency and want easier sharing, uploading, or printing, JPG is the more practical format. - What happens to transparency? JPG does not support transparency. Any transparent areas in the source PNG are filled with a white background before conversion. The rest of the image is preserved at the quality level you select. - Will the image quality be preserved? Resolution and color accuracy are fully preserved. JPG is a lossy format, so some data is discarded during compression. At the default 90% quality, the difference is invisible to the naked eye. You can lower the slider for smaller files, though values below 70% may introduce visible artifacts. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most PNG images convert instantly. - Do I need to sign up or pay? No. You can convert as many files as you want without signing up. We do not watermark output or limit usage. - Is my photo data safe? Yes. All conversions run in your browser using the Canvas API. Your images stay on your device and are not uploaded or logged. ### Batch PNG to WebP Convert PNG to smaller WebP for the web **About PNG to WebP** PNG is excellent for preserving transparency and sharp edges, but its lossless compression produces large files. WebP gives you a smaller file at the same visual quality, and it also supports transparency. That combination makes WebP the better choice for almost any image that will be served on a website or inside an app. This tool converts PNG files to WebP directly in your browser. If your source PNG has a transparent background, the WebP output preserves it. The conversion runs locally using the Canvas API, so your images never leave your device. At the default 90% quality, the difference from the original PNG is usually invisible while the file size drops significantly. WebP is supported by all current browsers. We do not add watermarks or impose usage limits. **How to Convert PNG to WebP** 1. Drop your PNG files — Drag images from your computer, or click to browse. We accept .png files. 2. Convert instantly — Each PNG is processed locally in your browser using the Canvas API. Your files stay on your device. 3. Download WebP — Download WebP — smaller than PNG with transparency support. Perfect for websites and apps. **Frequently Asked Questions:** - Why convert PNG to WebP? WebP produces smaller files than PNG at the same visual quality and supports transparency. It is the better choice for images that will be used on websites or in apps. - Does WebP support transparency? Yes. If your source PNG has a transparent background, the converted WebP will preserve it. This makes WebP a direct replacement for PNG in many web workflows. - Will the image quality be preserved? Resolution and color accuracy are fully preserved. WebP uses a more efficient lossy compression than PNG, so you get smaller files at the same visual quality. At the default 90% setting, the difference from the original is invisible. You can adjust the slider to find your preferred balance between size and fidelity. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most PNG images convert instantly. - Do I need to sign up or pay? No. The converter is completely free. We do not charge, subscribe, or watermark your files. - Is my photo data safe? Yes. The conversion happens locally in your browser via the Canvas API. Your files never leave your device. ### Batch PNG to ICO Convert PNG to Windows ICO favicon icons **About PNG to ICO** A favicon or application icon has to look sharp at 16×16 pixels in a browser tab and crisp at 256×256 on a high-DPI desktop. PNG alone cannot do that — it is a single-resolution image with no concept of icon sizes. ICO is the container format that packs multiple bitmap sizes into one file, letting the operating system or browser pick the best size automatically. This tool converts PNG files to ICO directly in your browser. PNG is a good source for icons because it supports transparency, letting the icon blend into any background. The conversion runs locally using the Canvas API; your images are not uploaded. The tool generates common icon sizes (16×16 to 256×256) based on your source image. Sizes larger than the source are skipped to avoid blurry upscaling. The result is a single ICO file ready to use as a favicon or Windows application icon. We do not add watermarks or impose usage limits. **How to Convert PNG to ICO** 1. Drop your PNG files — Drag images from your computer, or click to browse. We accept .png files. 2. Convert instantly — The tool converts each PNG locally in your browser using the Canvas API. Your files are not uploaded. 3. Download ICO — Download ICO — multi-size icon files ready for Windows and favicon use. **Frequently Asked Questions:** - Why convert PNG to ICO? ICO is the standard Windows icon format. It is used for application icons, folder icons, and website favicons. Converting your PNG images to ICO creates multi-size icon files that work across all Windows versions and browsers. - What is ICO format? ICO is the standard Windows icon format. It is a container that holds multiple image sizes in one file. Windows uses it for application and folder icons, while websites use it as the favicon displayed in browser tabs. - What icon sizes are generated? The tool generates common standard sizes (16×16, 24×24, 32×32, 48×48, 64×64, 128×128, and 256×256) based on your source image. Sizes larger than the source image are automatically skipped to avoid upscaling artifacts. You can also manually select which sizes to include before converting. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most PNG images convert instantly. - Do I need to sign up or pay? No. No account is required and no watermark is added. The tool is free to use, with no limits. - Is my photo data safe? Yes. Everything is processed in your browser with the Canvas API. We do not upload, store, or log your images. ### Batch BMP to JPG Convert BMP images to smaller JPG files in your browser **About BMP to JPG** BMP is Windows' legacy bitmap format. It stores uncompressed pixels, which keeps decoding simple but produces large files. A 1920 x 1080 24-bit BMP is roughly 6 MB; the same image as a high-quality JPG is usually under 500 KB. If you need to share, email, or upload a BMP, converting to JPG is the practical fix. This tool converts BMP files to JPG directly in your browser. JPG is supported by every device and browser, and it produces much smaller files than uncompressed BMP. The conversion runs locally using the Canvas API; your images stay on your device. Use the quality slider to choose between smaller files and higher fidelity. At the default 90% quality, the difference from the original is usually invisible. Output keeps the original resolution and works on every device. We do not add watermarks or impose usage limits. **How to Convert BMP to JPG** 1. Drop your BMP files — Drag images from your computer, or click to browse. We accept .bmp files. 2. Convert instantly — The tool reads each BMP file locally in your browser using the Canvas API. Your files are not uploaded to any server. 3. Download JPG — Download JPG — smaller and compatible with every device. Use the quality slider to balance size and fidelity. **Frequently Asked Questions:** - Why convert BMP to JPG? BMP files are uncompressed and large. Converting to JPG reduces file size by 80-95% with little visible quality loss, making the image easier to share, upload, or email. - What is BMP format? BMP is a Windows bitmap format that stores raw pixels with minimal compression. It keeps full quality but produces large files and has no transparency support in most variants. - Will the image quality be preserved? Resolution and color accuracy are fully preserved. JPG is a lossy format, so some data is discarded during compression. At the default 90% quality, the difference is invisible to the naked eye. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most BMP images convert instantly. - Do I need to sign up or pay? No. You do not need an account, and we never add watermarks or charge for HD output. Every feature is free and unlimited. - Is my image data safe? Yes. All conversions run in your browser using the Canvas API. Your images stay on your device and are not uploaded or logged. ### Batch BMP to PNG Convert BMP images to lossless PNG in your browser **About BMP to PNG** BMP and PNG are both lossless formats, but BMP stores pixels uncompressed while PNG applies DEFLATE compression. That means a PNG converted from a BMP is typically much smaller without any loss in quality. PNG also handles transparency, though standard BMP files do not contain an alpha channel. This tool converts BMP files to PNG directly in your browser. PNG applies lossless DEFLATE compression to the same pixel data, so files get smaller without any quality loss. The conversion runs locally using the Canvas API, so your images are not uploaded. Output keeps full resolution, exact colors, and no compression artifacts. PNG uses lossless compression, so nothing is thrown away. We do not add watermarks or impose usage limits. **How to Convert BMP to PNG** 1. Drop your BMP files — Drag images from your computer, or click to browse. We accept .bmp files. 2. Convert instantly — Each BMP is processed locally in your browser using the Canvas API. Your files stay on your device. 3. Download PNG — Download PNG — lossless with no compression artifacts. Ideal for editing, design, and archival. **Frequently Asked Questions:** - Why convert BMP to PNG? PNG applies lossless compression to the same pixel data, so you get a smaller file with identical quality. PNG is also more widely supported in design tools and web workflows than BMP. - What is PNG format? PNG is a lossless image format that supports transparency. Unlike BMP, it compresses the image data, which makes files smaller without throwing away any pixels. - Will the image quality be preserved? Yes. PNG uses lossless compression, meaning no image data is thrown away. Resolution and color accuracy are preserved exactly. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most BMP images convert instantly. - Do I need to sign up or pay? No. We do not ask you to subscribe, add watermarks, or hide higher quality behind a paywall. The tool is free to use. - Is my image data safe? Yes. The conversion happens locally in your browser via the Canvas API. Your files never leave your device. ### Batch BMP to WebP Convert BMP images to smaller WebP files in your browser **About BMP to WebP** WebP is a modern image format that compresses better than JPG and PNG. Converting a BMP to WebP replaces its uncompressed pixel grid with efficient lossy or lossless encoding, cutting file size by 50% or more while preserving visual quality. This tool converts BMP files to WebP directly in your browser. WebP replaces the uncompressed BMP pixel grid with efficient lossy or lossless encoding. The conversion runs locally using the Canvas API; your images stay on your device. Output matches the original in resolution and color, but at a much smaller file size. WebP is supported by all current browsers. We do not add watermarks or impose usage limits. **How to Convert BMP to WebP** 1. Drop your BMP files — Drag images from your computer, or click to browse. We accept .bmp files. 2. Convert instantly — The tool decodes each BMP locally in your browser using the Canvas API. Your files are not uploaded. 3. Download WebP — Download WebP — smaller than JPG at the same quality. Perfect for websites and apps. **Frequently Asked Questions:** - Why convert BMP to WebP? WebP produces smaller files than both JPG and PNG. Converting a BMP to WebP is the fastest way to shrink a large uncompressed image for websites and modern apps. - What is WebP format? WebP is a modern image format developed by Google. It supports both lossy and lossless compression and typically delivers 25-35% smaller files than JPG at the same visual quality. - Will the image quality be preserved? Resolution and color accuracy are fully preserved. WebP uses efficient lossy compression, so you get smaller files with no visible difference at the default 90% quality. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most BMP images convert instantly. - Do I need to sign up or pay? No. There are no fees, no subscriptions, and no watermarks. Every feature is free and unlimited. - Is my image data safe? Yes. Everything is processed in your browser with the Canvas API. We do not upload, store, or log your images. ### Batch BMP to ICO Convert BMP images to Windows ICO icons in your browser **About BMP to ICO** ICO is the standard Windows icon format. It is used for application icons, folder icons, and website favicons. A single ICO file can hold multiple image sizes, letting the operating system or browser pick the best one automatically. This tool converts BMP files to ICO directly in your browser. It generates common icon sizes and packs them into a single ICO file suitable for favicons and Windows icons. The conversion runs locally using the Canvas API, so your images are not uploaded. Sizes larger than your source image are skipped to avoid blurry upscaling. You can also manually select which sizes to include. The result is a single ICO file ready to use for a website or Windows project. We do not add watermarks or impose usage limits. **How to Convert BMP to ICO** 1. Drop your BMP files — Drag images from your computer, or click to browse. We accept .bmp files. 2. Convert instantly — Each BMP is read locally in your browser using the Canvas API. Your files stay on your device. 3. Download ICO — Download ICO — multi-size icon files ready for Windows and favicon use. **Frequently Asked Questions:** - Why convert BMP to ICO? ICO is the standard format for Windows icons and website favicons. It packs multiple sizes into one file so the OS can pick the best resolution for each context. - What is ICO format? ICO is a container format that holds multiple bitmap sizes in one file. Windows uses it for application and folder icons; websites use it as the favicon shown in browser tabs. - What icon sizes are generated? The tool generates common standard sizes (16×16, 24×24, 32×32, 48×48, 64×64, 128×128, and 256×256) based on your source image. Sizes larger than the source image are automatically skipped to avoid upscaling artifacts. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory. Most BMP images convert instantly. - Do I need to sign up or pay? No. You can convert as many files as you want without signing up. We do not watermark output or limit usage. - Is my image data safe? Yes. All conversions run in your browser using the Canvas API. Your images stay on your device and are not uploaded or logged. ### Batch ICO to JPG Convert ICO icons to JPG images in your browser **About ICO to JPG** ICO is the icon format used by Windows and by browsers for favicons. A single ICO file can bundle several resolutions, from 16 × 16 up to 256 × 256, so the operating system or browser can pick the frame that fits the current context. This tool converts ICO files to JPG directly in your browser. When the file contains multiple sizes, the largest frame is used, so you get the best detail the icon can offer. JPG opens on every device, which makes it useful for sharing an extracted icon, placing it in a document, or feeding it into tools that do not accept ICO. The conversion runs locally using the Canvas API; your images stay on your device. ICO frames can include transparency, but JPG has no transparency channel, so the background is filled white before encoding. Use the quality slider to balance file size and detail. We do not add watermarks or impose usage limits. **How to Convert ICO to JPG** 1. Drop your ICO files — Drag ICO files from your computer, or click to browse. We accept .ico files. 2. Convert instantly — The tool decodes each ICO in your browser and uses the largest available frame. Your files are not uploaded to any server. 3. Download JPG — Download JPG — compatible with every device. Use the quality slider to balance file size and fidelity. **Frequently Asked Questions:** - Why convert ICO to JPG? JPG opens on every device and in every image tool. ICO is mainly for Windows icons and favicons, so when you need to share or reuse an icon elsewhere, JPG is a practical format. - Which frame does the tool use? ICO files can hold several resolutions in one file. The tool decodes the file and uses the largest frame, so you get the most detail available. - Will JPG keep the transparency? No. JPG has no transparency channel, so the background is filled white before encoding. If you need transparency, convert to PNG instead. - Is there a file size limit? No hard limit. Processing runs locally in your browser, so the practical limit depends on your device's memory. Most icons convert instantly. - Do I need to sign up or pay? No. You can convert as many files as you want without signing up. We do not watermark output or limit usage. - Is my image data safe? Yes. All conversions run in your browser using the Canvas API. Your images stay on your device and are not uploaded or logged. ### Batch ICO to PNG Convert ICO icons to PNG images in your browser **About ICO to PNG** ICO is the icon format used by Windows and by browsers for favicons. A single ICO file can bundle several resolutions, from 16 × 16 up to 256 × 256, and each frame can carry its own transparency. This tool converts ICO files to PNG directly in your browser. When the file contains multiple sizes, the largest frame is used, so you get the best detail the icon can offer. PNG is lossless and keeps transparency, which makes it the natural format for working with icons after they have been extracted from an ICO container. The conversion runs locally using the Canvas API; your images stay on your device. Output keeps the source resolution and any transparency from the original frame. We do not add watermarks or impose usage limits. **How to Convert ICO to PNG** 1. Drop your ICO files — Drag ICO files from your computer, or click to browse. We accept .ico files. 2. Convert instantly — The tool decodes each ICO in your browser and uses the largest available frame. Your files are not uploaded to any server. 3. Download PNG — Download PNG — lossless, keeps transparency, and keeps the source resolution. **Frequently Asked Questions:** - Why convert ICO to PNG? PNG is lossless, keeps transparency, and opens in every image tool. ICO is mainly for Windows icons and favicons; PNG is the practical format once you want to edit, reuse, or publish an icon. - Which frame does the tool use? ICO files can hold several resolutions in one file. The tool decodes the file and uses the largest frame, so you get the most detail available. - Will PNG keep the transparency? Yes. PNG has a transparency channel, so transparent areas in the source frame are preserved. - Is there a file size limit? No hard limit. Processing runs locally in your browser, so the practical limit depends on your device's memory. Most icons convert instantly. - Do I need to sign up or pay? No. You can convert as many files as you want without signing up. We do not watermark output or limit usage. - Is my image data safe? Yes. All conversions run in your browser using the Canvas API. Your images stay on your device and are not uploaded or logged. ### Batch Image to TXT Extract text from images with OCR in your browser **About Image to Text** Scanned documents, screenshots, and photos of signs or receipts all lock text inside pixels. OCR (optical character recognition) turns that text back into words you can search, edit, and paste anywhere. This tool runs the Tesseract OCR engine in your browser through WebAssembly. It recognizes twelve languages: English, Spanish, French, German, Portuguese, Italian, Simplified and Traditional Chinese, Japanese, Korean, Hindi, and Russian. English plus the site language are preselected, and you can combine several languages for mixed-language images. Your images never leave your device. Clean, well-lit printed text gives the best results. Handwriting, heavy blur, and stylized fonts are harder to read correctly. Each image becomes one .txt file. We do not add watermarks or impose usage limits. **How to Convert Images to Text** 1. Drop your images — Drag JPG, PNG, WebP, BMP, or GIF files from your computer, or click to browse. We accept multiple files at once. 2. Pick a language and extract — Choose the language of the text in your images, then start the extraction. The tool recognizes each image locally in your browser. Nothing is sent to a server. 3. Copy or download the text — Preview the recognized text, copy it to your clipboard, or save it as a .txt file. Multiple files download as a ZIP. **Frequently Asked Questions:** - What image formats are supported? JPG, PNG, WebP, BMP, and GIF. HEIC photos from iPhones are not supported here, but you can convert them to JPG first with our HEIC to JPG tool. - Which languages can it recognize? Twelve: English, Spanish, French, German, Portuguese, Italian, Simplified and Traditional Chinese, Japanese, Korean, Hindi, and Russian. The tool preselects English plus the language of the site, and you can select several at once for mixed-language images. - How accurate is the text extraction? Sharp, high-contrast printed text usually converts with few mistakes. Low resolution, blur, skewed photos, handwriting, and decorative fonts lower accuracy, so check the preview before you copy. - Is there a file size or batch limit? There is no hard limit. Since recognition runs locally in your browser, speed depends on your device. Large batches are processed one image at a time. - Do I need to sign up or pay? No. No account is required and no watermark is added. The tool is free to use, with no limits. - Is my image data safe? Yes. Recognition runs entirely in your browser using the Tesseract engine compiled to WebAssembly. Your images are not uploaded, stored, or logged. ### Image Resizer Resize images in your browser **About Resizing Images** Photos from phones and cameras are often larger than needed. A 4000 by 3000 frame can be a few megabytes, which is overkill for a website, an email, or a document. Shrinking it to something like 400 by 300 keeps it sharp where it matters and cuts the file size sharply. This tool resizes pictures directly in your browser. The image is decoded, scaled, and re-encoded on your device, so your files never leave it. Nothing is uploaded to a server. You can lock the aspect ratio so the picture keeps its shape, or set width and height freely. For JPG and WebP, a quality slider balances file size against detail. HEIC files convert to the output format you choose, since browsers cannot encode HEIC. We do not add watermarks or impose usage limits. **How to Resize an Image** 1. Drop your images — Drag photos in or click to browse. JPG, PNG, WebP, and HEIC all work. Add several at once and they resize together. 2. Set the size — Type a width or a height. With the ratio lock on, the other side fills in automatically. Turn it off to set both freely. 3. Download — Download each file or grab them all in a ZIP. Everything runs locally in your browser, so nothing is uploaded. **Frequently Asked Questions:** - Why should I resize an image? Large images load slowly and take up space. Shrinking one to the size you actually use, like a 400 by 300 thumbnail instead of a 4000 by 3000 original, makes pages faster and files easier to share. - What formats can I resize? JPG, PNG, WebP, and HEIC all work here. HEIC converts to the output format you choose, because browsers can decode it but not encode it. - Will resizing lower the quality? Shrinking an image usually keeps it looking sharp, because the browser resamples the pixels. Enlarging it past the original size can soften it, since there is no extra detail to add. For JPG and WebP you can adjust the quality slider, though values below 70 percent may show visible artifacts. - What does keeping the aspect ratio mean? It locks the proportions, so a 4000 by 3000 picture resized to a width of 400 becomes 400 by 300. Turn it off to set width and height independently. - Do I need to sign up or pay? No. You do not need an account, and we never add watermarks or charge for output. Every feature is free and unlimited. - Are my photos uploaded anywhere? No. Resizing runs entirely in your browser. Your photos stay on your device and are not uploaded or logged. ### Text Repeater Free online text repeater. Repeat text, emojis & symbols with custom separators up to 10,000×. No signup. **About the Text Repeater** Text Repeater is a free online tool that repeats any text, emoji, or symbol up to 10,000 times — instantly, in your browser. No signup, no servers, no tracking. Your text never leaves your device. Three modes cover most use cases. Basic repeats your text with any separator you choose. Numbered adds a sequential number before each line — handy for checklists and templates. WhatsApp forces newline separators and tracks the character count against the 4,096-character limit, so you know exactly when your message is ready to send. Add custom separators, insert emojis in one tap, and watch the output update live. Use this text repeater for social media captions, test data, decorative borders, vocabulary practice, or any task that needs repeated text. **How to Use the Text Repeater** 1. Enter your text — Type or paste any text, emojis, or symbols into the text repeater. Tap an emoji from the quick bar to insert it instantly. 2. Choose your settings — Pick a separator, set the repeat count, and select a mode — Basic, Numbered, or WhatsApp. 3. Copy your result — The output updates live as you type. Review the stats, then click Copy to save it to your clipboard. **Frequently Asked Questions:** - Is this text repeater free to use? Yes. This online text repeater is completely free — no signup, no usage limits, no watermarks, no hidden fees. - Does my text get uploaded to a server? No. Everything runs in your browser. Your text is never sent to any server, stored, or logged. - What is the maximum repeat count? 10,000. The cap keeps your browser responsive even with huge outputs. - What are the three modes for? Basic repeats your text with any separator you choose. Numbered adds a sequential number before each line. WhatsApp uses newline separators and tracks the character count against WhatsApp's 4,096-character limit. - Can I use custom separators? Yes. Pick Custom from the separator options and type any text, symbol, or emoji you want between repetitions. ### Batch PDF to JPG Convert PDF pages to JPG images in your browser **About PDF to JPG** PDFs are great for sharing documents, but many platforms want an image. A screenshot of a page is low resolution and hard to batch. Converting PDF pages to JPG gives you one image per page at the original document size, ready for galleries, email, or social media. This tool renders each PDF page directly in your browser. The conversion runs locally using PDF.js, so your files stay on your device. Nothing is uploaded to a server. Output keeps the original page dimensions. For multi-page PDFs, each page becomes a separate JPG. Use the quality slider to choose between smaller files and higher fidelity. We do not add watermarks or impose usage limits. **How to Convert PDF to JPG** 1. Drop your PDF files — Drag PDFs from your computer, or click to browse. We accept multiple files at once. 2. Convert locally — The tool renders each PDF page directly in your browser using PDF.js. Your files are not uploaded to any server. 3. Download JPG — Download individual pages or everything as a ZIP. Use the quality slider to balance size and fidelity. **Frequently Asked Questions:** - Why convert PDF to JPG? JPG is accepted by almost every gallery, email client, social platform, and content management system. Converting PDF pages to JPG turns each page into a universally readable image. - What is JPG format? JPG (or JPEG) is a lossy image format that keeps file sizes small while maintaining good visual quality for photographs and scans. Every device, browser, and image editor supports it without extra software. - Will the image quality be preserved? Resolution and page dimensions are fully preserved. JPG is a lossy format, so some data is discarded during compression. At the default 90% quality setting, the difference is invisible to the naked eye. You can lower the slider if you need smaller files. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory and the number of pages in the PDF. - Do I need to sign up or pay? No. The converter is completely free. We do not charge, subscribe, or watermark your files. - Is my PDF data safe? Yes. All rendering happens in your browser using PDF.js. Your PDFs stay on your device and are not uploaded or logged. ### Batch PDF to PNG Convert PDF pages to PNG images in your browser **About PDF to PNG** PDFs preserve document layout, but not every app accepts them. Converting PDF pages to PNG gives you a lossless image per page with transparency support, ready for design tools, presentations, or archival. This tool renders each PDF page directly in your browser. Output is PNG, a lossless format that supports transparency. The conversion runs locally using PDF.js, so your files stay on your device. Output keeps full page dimensions and exact colors. For multi-page PDFs, each page becomes a separate PNG. We do not add watermarks or impose usage limits. **How to Convert PDF to PNG** 1. Drop your PDF files — Drag PDFs from your computer, or click to browse. We accept multiple files at once. 2. Convert locally — Each PDF page is rendered locally in your browser via PDF.js. Your files stay on your device. 3. Download PNG — Download lossless PNG images for each page. Ideal for editing, design, and archival. **Frequently Asked Questions:** - Why convert PDF to PNG? PNG is a lossless format that supports transparency and is accepted by almost every image editor and design tool. Converting PDF pages to PNG is the right choice when you need to edit, archive, or place pages on colored backgrounds. - What is PNG format? PNG is a lossless image format that supports transparency. Unlike JPG, it does not throw away image data during compression, which makes it ideal for graphics with sharp edges, text, and design assets. - Will the image quality be preserved? Yes. PNG uses lossless compression, meaning no image data is thrown away. Page dimensions, color accuracy, and any transparent areas are preserved exactly. The trade-off is larger file sizes compared to JPG or WebP. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory and the number of pages in the PDF. - Do I need to sign up or pay? No. No account is required and no watermark is added. The tool is free to use, with no limits. - Is my PDF data safe? Yes. Each page is rendered locally in your browser via PDF.js. Your files never leave your device. ### Batch PDF to WebP Convert PDF pages to WebP images in your browser **About PDF to WebP** PDFs are heavy for web use. Converting PDF pages to WebP cuts file size while keeping visual quality, which matters when you are embedding pages on a website or inside an app. This tool renders each PDF page directly in your browser. Output is WebP, which produces smaller files than JPG at similar quality. The conversion runs locally using PDF.js, so your files stay on your device. Output matches the original page dimensions at a smaller file size than JPG. For multi-page PDFs, each page becomes a separate WebP. WebP is supported by all current browsers. We do not add watermarks or impose usage limits. **How to Convert PDF to WebP** 1. Drop your PDF files — Drag PDFs from your computer, or click to browse. We accept multiple files at once. 2. Convert locally — The tool renders each PDF page directly in your browser using PDF.js. Your files are not uploaded. 3. Download WebP — Download smaller WebP images for each page. Perfect for websites and apps. **Frequently Asked Questions:** - Why convert PDF to WebP? WebP produces smaller files than JPG at the same visual quality, which makes it the better choice for websites, apps, and any digital workflow where file size matters. - What is WebP format? WebP is a modern image format developed by Google. It compresses better than both JPG and PNG — smaller files at the same visual quality — and supports both lossy and lossless compression plus transparency. Most modern browsers and platforms support it. - Will the image quality be preserved? Resolution and page dimensions are fully preserved. WebP uses a more efficient lossy compression than JPG, so you get smaller files at the same visual quality. At the default 90% setting, the difference from the original is invisible. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory and the number of pages in the PDF. - Do I need to sign up or pay? No. You do not need to register, and we never add watermarks or charge for HD output. Every feature is free and unlimited. - Is my PDF data safe? Yes. Everything is processed in your browser with PDF.js. We do not upload, store, or log your PDFs. ### Batch PDF to Markdown Convert PDFs to editable Markdown in your browser **About PDF to Markdown** PDFs preserve visual layout, but the text inside them is hard to edit, quote, or reuse. Converting a PDF to Markdown gives you a plain-text version with headings, lists, and paragraphs formatted for editors, wikis, and static site generators. This tool extracts the text structure from each PDF directly in your browser. It produces Markdown with headings, paragraphs, lists, code blocks, and links when the original layout makes them clear enough to identify. Nothing is uploaded to a server. Output is a single .md file per PDF. Complex layouts, tables, and embedded images may not translate perfectly. We do not add watermarks or impose usage limits. **How to Convert PDF to Markdown** 1. Drop your PDF files — Drag PDFs from your computer, or click to browse. We accept multiple files at once. 2. Extract text locally — The tool reads each PDF in your browser and pulls out headings, paragraphs, lists, and code blocks as Markdown. Nothing is sent to a server. 3. Download Markdown — Save the extracted text as a .md file. You can edit it in any text editor or publish it directly. **Frequently Asked Questions:** - Why convert PDF to Markdown? Markdown is easy to edit, search, and publish. Converting a PDF to Markdown gives you structured plain text you can use in editors, wikis, and static site generators. - What is Markdown format? Markdown is a lightweight markup language that uses plain text symbols like # for headings and - for lists. It converts cleanly to HTML, PDF, and other formats, and can be edited in any text editor. - Will the formatting be preserved? The tool preserves headings, paragraphs, lists, code blocks, and links when the PDF layout makes them clear enough to identify. Complex tables, multi-column layouts, and embedded images may not translate perfectly. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory and the size of the PDF. - Do I need to sign up or pay? No. No account is required and no watermark is added. The tool is free to use, with no limits. - Is my PDF data safe? Yes. The conversion runs entirely in your browser using pdf2md. Your PDFs are not uploaded, stored, or logged. ### Batch Markdown to PDF Convert Markdown files to PDF documents in your browser **About Markdown to PDF** Markdown is the standard format for README files, documentation, and notes, but not everyone can read raw .md files. Converting Markdown to PDF gives you a formatted document that opens on any device and prints well. This tool parses each Markdown file in your browser and renders it as a PDF page. Headings, paragraphs, lists, links, code blocks, and blockquotes are styled consistently. Your files stay on your device; nothing is uploaded. Output is a single PDF per Markdown file. The renderer uses standard fonts and a simple A4 layout. We do not add watermarks or impose usage limits. **How to Convert Markdown to PDF** 1. Drop your Markdown files — Drag .md, .markdown, or .mdx files from your computer, or click to browse. We accept multiple files at once. 2. Render locally — The tool parses each Markdown file in your browser and renders it as a styled PDF. Your files stay on your device. 3. Download PDF — Save the rendered document as a .pdf file. Formatting for headings, lists, links, and code is preserved. **Frequently Asked Questions:** - Why convert Markdown to PDF? PDF is a fixed-layout document format that opens on any device. Converting Markdown to PDF gives you a shareable, printable file from plain text notes or documentation. - What is PDF format? PDF (Portable Document Format) preserves fonts, layout, and formatting across different devices and operating systems. It is the standard format for sharing documents that need to look the same everywhere. - Will the formatting be preserved? Headings, paragraphs, lists, links, code blocks, and blockquotes are styled consistently in the output PDF. Inline formatting like bold, italic, and strikethrough is also preserved. - Is there a file size limit? There is no hard limit. Since processing runs locally in your browser, the practical limit depends on your device's memory and the length of the Markdown file. - Do I need to sign up or pay? No. You do not need to register, and we never add watermarks or charge for output. The tool is free to use, with no limits. - Is my Markdown data safe? Yes. The conversion runs entirely in your browser. Your Markdown files are not uploaded, stored, or logged. ## Blog ### HEIC to WebP: The Modern Format for Web Developers Published: 2026-08-15 WebP gives you modern compression without the compatibility baggage of HEIC, and almost every browser has supported it for years. This guide shows how to convert HEIC files to WebP for the web, what the size comparison looks like, and how to build it into a pipeline. A user uploads a photo shot on an iPhone. The file is HEIC, about 1.8 MB. Your `` tag cannot rely on it: HEIC has no native support in Chrome, Firefox, or Edge. So the image either becomes a JPG at 3.4 MB or a WebP at around 1.2 MB with no visible difference. That gap is why WebP is the answer for photos that arrive as HEIC. This guide covers converting HEIC to WebP, what the size comparison looks like across formats, and the options from a browser tool to a shell command you can drop into a build. ## Why WebP and not HEIC HEIC is excellent at storing photos, roughly half the size of JPEG at equal quality. It is also useless on the web as a delivery format. Chrome, Firefox, Edge, and Safari have all supported WebP for years, while HEIC support exists only in Safari and a few vendor-specific places. You cannot depend on HEIC for user-uploaded images, which is exactly why conversion pipelines exist. WebP covers the same ground as HEIC: it is a lossy format built on modern compression, with a lossless mode and alpha transparency. For a photo, the practical difference between WebP and JPG at the same visual quality is a file roughly 25 to 35 percent smaller. That is a meaningful saving on an image-heavy page. ## The size comparison Same 12 MP photo, same visual quality: | Format | Size | Browsers | Notes | | ------ | ------- | ----------- | -------------------------- | | HEIC | ~1.8 MB | Safari only | source format from iPhones | | JPG | ~3.4 MB | all | baseline | | WebP | ~1.2 MB | all | lossy, with alpha support | | PNG | ~24 MB | all | lossless, not for photos | The [web image formats guide](/blog/web-image-formats-guide) has the full comparison if you need the background on where WebP sits against JPG and PNG. ## Option 1: convert in a browser The simplest path is a tool that runs entirely on the device. The [HEIC to WebP converter](/tools/heic-to-webp) decodes HEIC locally with WebAssembly and writes WebP files, so the photos never leave the machine. You can set the quality, convert a whole folder, and download the results as a ZIP. That works for one-off conversions and for a designer or editor who is not comfortable on the command line. ## Option 2: convert on the command line For a pipeline, the classic stack is `libheif` plus `libwebp`. On macOS with Homebrew: ```bash brew install libheif webp ``` Then convert with `heif-convert` and `cwebp`: ```bash heif-convert input.heic output.png cwebp -q 82 output.png -o output.webp ``` Or skip the intermediate file with `ffmpeg`: ```bash ffmpeg -i input.heic -c:v libwebp -quality 82 output.webp ``` Both commands honor a quality argument, and `cwebp` has the widest set of controls, including lossless mode and `-m 6` for the slowest, smallest output. For a folder, loop it: ```bash for f in *.heic; do heif-convert "$f" "${f%.heic}.png"; cwebp -q 82 "${f%.heic}.png" -o "${f%.heic}.webp"; done ``` That is enough to wire into a shell script or a CI job that processes uploads on the server side. ## Choosing quality and format in WebP Two decisions affect the output more than anything else: - **Lossy vs lossless.** `cwebp -lossless` or `-q 100` with the lossless flag keeps every pixel but produces larger files. Use it for screenshots, logos, and anything with flat color and text. Use lossy for photos. - **The quality number.** `-q 82` is a sane default for photos: visibly clean and much smaller than JPG. For high-quality targets, `-q 90` costs more bytes but is closer to the source. The same tradeoff as JPG quality settings, which [HEIC to JPG without losing quality](/blog/convert-heic-to-jpg-without-losing-quality) explains in detail. WebP also handles alpha, so a HEIC image with a transparency channel survives the trip, which JPG would drop. ## A note on newer formats AVIF, the AV1-based successor, generally beats WebP on size, and it is supported in all major browsers now. If you are building a fresh pipeline and can pick your decoder, AVIF is worth testing against WebP for your specific images. The tradeoff is encoder speed and tooling maturity, which is why WebP remains the safe default for most teams. The [web-image-formats-guide](/blog/web-image-formats-guide) has more on where each format fits. ## The bottom line Convert HEIC to WebP for anything that ends up on a website. It is supported everywhere, smaller than the JPG alternative at equal quality, and convertible with a browser tool or a two-command shell pipeline. Keep the original HEIC as the source of truth, convert at upload time or in a batch job, and let the format do the loading-time math for you. ### HEIC File Too Large? How to Compress iPhone Photos Published: 2026-08-14 HEIC is already the compressed format, so a photo that is still too large needs one of three moves: lower the quality, reduce the resolution, or strip the metadata. This tutorial covers each one and what it costs. A form says "max 2 MB." Your HEIC photo is 1.8 MB, so it fits. The next one is a 48 MP shot from a Pro model and it is 6 MB, so it does not. Or the file is a Live Photo, which carries a still plus a short video, and the size doubles. HEIC is already the compressed format, so there is no "compress this HEIC" option that does much. What you actually do is convert to a format you control, then use one of three levers to shrink it. This tutorial shows the levers, what each one costs, and a workflow that takes a folder down to size in one pass. ## Why HEIC is already small HEIC uses HEVC compression, the same codec as 4K video, and it stores roughly half the data of JPEG at the same quality. A 12 MP photo is about 1.8 MB as HEIC and about 3.5 MB as JPG. So when an HEIC is still too big, the remaining size is usually the sensor: a 48 MP photo has four times the pixels, and no codec is going to make that disappear. That changes the approach. You are not finding a magic "compress" button. You are deciding which of the three levers is acceptable for the file. ## Lever 1: lower the quality Re-encoding the photo as JPG with a lower quality setting is the obvious move, and it is the smallest win. At quality 85 a JPG is already below the size of the source HEIC while staying visually clean. At quality 70 the file is smaller again, but banding and softness start to appear on gradients. The limit is that most photos do not compress below a certain floor before the artifacts become the story. This lever is best for getting a file under a modest limit, not for drastic cuts. ## Lever 2: reduce the resolution This is the strongest lever, and the one most people skip. A 4000 × 3000 photo scaled to 2000 × 1500 keeps a quarter of the pixels, and for viewing on a phone or laptop screen that is usually plenty. A 48 MP image scaled to 12 MP drops to a quarter of its data before you even touch quality. The cost is a hard ceiling: you cannot print large from the scaled file, and you cannot crop into it. If the photo might need that later, keep the original safe and only downscale the copy you are sending. ## Lever 3: strip the metadata EXIF can add real weight. A photo shot with location, lens data, and thumbnails carries several hundred kilobytes of side data. Removing it shrinks the file and removes the GPS history at the same time. The [EXIF privacy guide](/blog/exif-metadata-privacy-guide) goes through the fields and the privacy reasons to drop them. This lever is small, usually 10 to 20 percent, and it stacks with the other two. ## What the levers cost | Lever | Typical reduction | What you give up | | ---------------- | ----------------- | ----------------------------------- | | Quality 85 | ~30-40% | nothing visible on screen | | Quality 70 | ~50-60% | banding and softness on gradients | | Downscale to 50% | ~75% | resolution for printing or cropping | | Strip metadata | ~10-20% | camera details and GPS | Combine quality and downscaling and a 6 MB 48 MP photo becomes a file under 1 MB that still looks correct on a screen. ## A folder-sized workflow For a batch of photos, do it in a browser in one pass. Our [HEIC to JPG converter](/tools/heic-to-jpg) lets you pick a quality level and reads every file locally, so nothing is uploaded. Drop the folder, set the quality, download the results. For files going on a website, [HEIC to WebP](/tools/heic-to-webp) shrinks them further, because WebP beats JPG at the same quality; the [HEIC to WebP guide](/blog/heic-to-webp-guide) has the numbers. One rule applies either way: convert from the original HEIC, not from a JPG you already compressed. Re-compressing a compressed file compounds the artifacts, the generation loss described in [lossy vs lossless compression](/blog/lossy-vs-lossless-compression). ## The bottom line If a HEIC photo is too large, do not look for a compress button. Convert to JPG or WebP and use the levers in this order: strip metadata first, then lower the quality to a sane floor, then downscale if you still need more. Each one costs something different, and for most photos the first two get you under the limit with nothing you will notice. ### How to Convert HEIC to JPG Without Losing Quality Published: 2026-08-13 Converting HEIC to JPG is lossy by definition, but at the right settings the loss stays invisible. This tutorial covers the quality settings that matter, one-shot conversion, and the mistakes that actually cost detail. You have a folder of photos from an iPhone. The files are HEIC, about 1.8 MB each, and you need JPGs that look exactly like the originals. At quality 90, a 12 MP photo becomes a JPG of roughly 3.4 MB that is indistinguishable from the HEIC it came from at any normal viewing size. Drop the quality to 60 and the same photo shows banding in the first sky you look at. The good news is that "without losing quality" is reachable. The bad news is that it is not the default. It depends on four choices, and this tutorial walks through each one. ## What "without losing quality" actually means Every HEIC to JPG conversion decodes the HEVC image and re-encodes it as JPEG, and JPEG is a lossy format. Some detail is discarded on purpose. The question is how much control you keep over that discard. At quality 95 on a 12 MP photo, the loss lands below what your eyes can see at normal viewing size. At quality 60, it is obvious: banding in skies, ringing around edges, mush in the shadows. So the goal is not zero loss, because that is impossible with JPG. The goal is to set the encoder so its cuts fall below your perception, which is achievable and repeatable. ## Step 1: pick the quality setting The single number that decides everything is the quality setting. Most converters, including ours, expose it as a slider. | Setting | What you get | When to use it | | -------- | ------------------------------- | --------------------------------------------------------------- | | 95-100 | imperceptible loss, largest JPG | archiving, printing, anything where size is secondary | | 85-90 | loss invisible at normal zoom | the default for photos that will be shared or viewed on screens | | 70-80 | mild artifacts on gradients | email attachments and casual sharing | | below 70 | visible artifacts | only when you are deliberately shrinking the file | Quality 100 is not "no loss." JPG at 100 still re-quantizes and still drops the extra color depth HEIC may have held. It is just the closest practical setting. If you want genuinely lossless output, JPG is the wrong format and [PNG is the alternative](/blog/heic-vs-png). ## Step 2: convert once, from the original The most common way people destroy quality is re-encoding a file that was already re-encoded. Convert the original HEIC straight to JPG. Do not convert a JPG that has already been through another converter, and do not run your result through the same tool twice to "tidy it up." Each pass adds a little quantization noise and the noise compounds. That is the same generation-loss effect covered in [lossy vs lossless compression](/blog/lossy-vs-lossless-compression). ## Step 3: keep the resolution Do not downscale if the goal is quality. A 4000 × 3000 photo converted at full size keeps all of its real detail. If the goal is a smaller file, reducing the resolution is the most effective lever, but it is a separate decision from quality, and you should make it on purpose rather than letting a converter default to it. ## Step 4: decide about metadata The conversion can carry over EXIF data: camera, lens, GPS, timestamp. Keeping it is usually good for organizing photos and matters for photographers. Our [HEIC to JPG converter](/tools/heic-to-jpg) carries the metadata through by default. If privacy matters more than provenance, the [EXIF privacy guide](/blog/exif-metadata-privacy-guide) explains which fields to strip and why. ## Where to run the conversion All of these produce a high-quality result when you set the quality high: | Device | Method | Best for | | ----------- | ------------------------------------------ | -------------------- | | Mac | Preview, File > Export, format set to JPEG | a handful of photos | | Windows | Online converter in the browser | anything, no install | | iPhone/iPad | Photos app export, or online converter | sending one photo | | Any device | Online converter, quality set to 90+ | folders and batches | The online route keeps every file on your device, so it behaves the same on Windows, Linux, and a Chromebook, with nothing to install. Drag in a folder, set the quality, download the JPGs, and optionally grab the whole set as a ZIP. ## How to check the result After converting, zoom to 100% and look at three things: a smooth gradient (a sky), a high-contrast edge (text or a window frame), and a dark area. If the sky shows bands, the edge shows a halo, or the dark area shows blocks, the quality was set too low or the source had been re-encoded before you got it. Re-run from the original HEIC at quality 90 or above. ## The bottom line Convert once, from the original HEIC, at quality 90 or higher, and keep the resolution. That combination produces a JPG whose losses sit below what you can see, which is what people mean when they say "without losing quality." ### HEIC vs PNG: When to Use Which Format Published: 2026-08-12 PNG is lossless and handles transparency; HEIC is a compressed photo format roughly half the size of JPEG. They answer different jobs, so which one is better depends on what you are making. This guide sorts it out. A 12 MP photo from a phone saves as PNG at about 24 MB. The same photo as HEIC is about 1.8 MB. That gap is the whole argument, and it is why the iPhone camera never produced PNG files. The two formats are not competing versions of the same thing. They answer different jobs. PNG is a lossless format designed for graphics, text, and transparency. HEIC is a lossy format designed for photos. Once you see that, "which is better" stops being a real question and becomes "which job is yours." ## What PNG is PNG compresses without losing a single pixel. It was released in 1996 as a patent-free replacement for GIF, and it is great at the things GIF was good at: flat color, text, logos, screenshots. It also does two things JPEG cannot do. It supports full alpha transparency, so a rounded logo or a soft shadow can exist with no background. And it stores exact pixel data, so a chart or a UI mockup stays crisp at any size. None of that is free. PNG's compression is much weaker than a modern lossy codec, and it gets worse as the image gets noisier. A photo is mostly fine sensor noise at the pixel level, which barely compresses at all. That is why a 12 MP photo lands at 24 MB instead of 2 MB. ## What HEIC is HEIC is Apple's take on HEIF, a container that holds an image encoded with HEVC. It is a photo codec, built for the thing JPEG does, with roughly double the compression efficiency. The trade is that it is lossy: some detail is discarded on purpose, in a way your eyes mostly forgive. The [HEIC complete guide](/blog/heic-complete-guide) covers the format and why Apple adopted it. HEIC does not handle transparency the way PNG does, and it is not the format you want for text, screenshots, or logos. Encode a UI screenshot as HEIC and you get a file that is technically a photo and behaves like one: soft text, colors that shift on flat fills. ## Side by side: photo vs screenshot | Content | PNG | HEIC | JPG | | ---------------------- | --------- | --------- | ------- | | 12 MP photo | ~24 MB | ~1.8 MB | ~3.4 MB | | 1280 × 800 screenshot | ~1.2 MB | ~0.4 MB\* | ~0.3 MB | | Logo with transparency | supported | no | no | | Re-edit without loss | yes | no | no | \*An HEIC screenshot is smaller but text and flat colors can look slightly off, so the size win is not worth the quality hit. The pattern is simple. PNG wins when the image is mostly flat, has text, or needs transparency. HEIC and JPG win when the image is a photo, because nobody wants a 24 MB version of something that will end up at 2 MB. ## When to convert HEIC to PNG Your iPhone takes HEIC photos. Converting to PNG makes sense in three situations: - **Transparency.** A photo rarely needs it, but if you are compositing, cutting out a subject, or building an asset, PNG carries the alpha channel. - **A lossless editing loop.** If the image is heading into an editor and will be re-saved several times, PNG breaks the generation-loss chain described in [lossy vs lossless compression](/blog/lossy-vs-lossless-compression). - **Flat graphics that arrived as HEIC.** Screenshots and UI exports made on an Apple device sometimes land as HEIC, and PNG is the natural target for those. For photos destined for email, uploads, or viewing on any device, PNG is usually the wrong target. It is 10 to 20 times larger than the HEIC for no visible gain. The [HEIC to PNG converter](/tools/heic-to-png) covers the cases where you do want it, and it keeps the alpha channel intact when the source has one. ## So: PNG or JPG? This is the decision most people are actually making, because the photo is in HEIC and they have to pick a destination format: - Choose **PNG** when you need transparency, exact pixels, or a lossless editing loop. - Choose **JPG** when you need a universal photo file that opens anywhere. [HEIC vs JPG quality](/blog/heic-vs-jpg-quality) shows what a high-quality conversion keeps and what it drops. - Choose **WebP** when the file is going on a website. The [HEIC to WebP guide](/blog/heic-to-webp-guide) covers that path for web developers. ## The bottom line PNG and HEIC do not compete. PNG is for graphics that must be exact and can afford the size. HEIC is for photos that must be small. Pick by what you are making, not by which name sounds newer, and convert when the format your photo is in does not fit the job it has to do. ### HEIC vs JPG Quality: Does Converting Lose Detail? (With Examples) Published: 2026-08-11 Converting HEIC to JPG does lose data, because JPG cannot hold everything HEIC can. Here is what survives a high-quality conversion, what shows up first when quality drops, and how to convert without visible loss. Take one photo and save it two ways. As HEIC it comes out at about 1.8 MB. As JPG at quality 90 it comes out at about 3.4 MB. View them side by side at normal size and you cannot tell them apart. Zoom to 400% and the JPG looks a little softer in the hair, the grass, the dark wall behind the subject. That softening is the honest answer to the question in the title: yes, the conversion loses data at the pixel level, and no, it usually does not lose what your eyes are doing. The useful question is when that "yes" turns visible. This article shows it with real numbers and tells you how to convert without crossing that line. ## What converting actually does HEIC stores the image with HEVC (H.265), a codec built for video. JPG stores it with a DCT block transform plus chroma subsampling. When you convert HEIC to JPG, the image gets decoded and re-encoded in a different scheme, and the re-encode is lossy. Some information does not survive the round trip. Two things change. First, the compression method produces different artifacts. HEVC hides its losses better than JPG does at the same bitrate, which is the whole reason a HEIC file is smaller. Second, the color depth drops. HEIC supports 10-bit or 16-bit channels; JPG is fixed at 8-bit. If your photo stores 10 bits per channel, converting to JPG throws away the extra tones permanently. For the byte-level picture of how HEIC is put together, the [HEIC technical deep dive](/blog/what-is-heic) walks through the container boxes and file signature. ## Why bit depth is where the detail hides An 8-bit channel holds 256 levels of red, green, and blue each. A 10-bit channel holds 1,024, which is 16 times more precision per color. On most phone photos you cannot see the difference, because a photo rarely fills the whole range with smooth gradients. The difference shows up in the obvious places: a sunset sky that should fade from deep orange to pale yellow, a portrait lit against a window. Those smooth ramps are where an 8-bit file starts to show bands, distinct steps instead of a continuous fade. So the loss is real, but it is not random. It lands on gradients and low-light noise before it lands on a face or the sharp edge of a building. If you convert at high quality, the other losses (blocking, ringing, softening) stay small enough that you will not notice them without zooming. ## HEIC vs JPG at three quality settings The same 12 MP photo, saved four ways, with HEIC as the reference: | File | Size | What changes vs HEIC | | -------------- | ------ | ---------------------------------------- | | HEIC (source) | 1.8 MB | baseline | | JPG quality 95 | 4.1 MB | nothing visible at normal zoom | | JPG quality 90 | 3.4 MB | slight softening in fine texture at 400% | | JPG quality 75 | 2.1 MB | banding in skies, ringing around text | The numbers are typical, not exact; your photo and camera change them. The pattern does not. You can convert at a size close to the original HEIC and keep the visible detail. You only start paying for it when the quality slider drops far enough that the encoder starts cutting corners. ## Where the loss shows up first If you want to know what a bad conversion costs, check for these in order: - **Banding.** Smooth gradients collapse into steps. This is the bit-depth loss and the first thing to appear. - **Ringing.** Thin halos around high-contrast edges, most visible on text and window frames. - **Blocking.** Visible 8 × 8 grid blocks in flat areas, usually gone above quality 80. A single high-quality conversion triggers none of these on most photos. Re-encoding is what compounds them: every pass adds a little quantization noise, and the noise adds up. That is the generation-loss effect explained in detail in [lossy vs lossless compression](/blog/lossy-vs-lossless-compression). ## How to convert without losing visible detail The rule is short: convert once, from the original HEIC, at high quality. Do not convert from a JPG that has already been through an encoder, and do not run the result through another conversion later. Our [HEIC to JPG converter](/tools/heic-to-jpg) runs the conversion in your browser with a quality setting you control, and it reads straight from the original file. Drop the HEIC in, pick quality 90 or higher, and what you get is about as much as a JPG can carry. If you need lossless output or transparency, JPG is the wrong target regardless of quality; that is a job for PNG. [HEIC vs PNG](/blog/heic-vs-png) covers when that switch is worth it, and the [HEIC to WebP guide](/blog/heic-to-webp-guide) covers the format for people shipping images to the web. ## The bottom line Converting HEIC to JPG does lose data, because JPG cannot hold everything HEIC can. At quality 90 or above, the loss stays below what you can see at normal viewing sizes on almost every photo. If someone tells you conversion always ruins image quality, they are describing a low-quality conversion, not conversion itself. ### HEIC to PDF: How to Put iPhone Photos into a Document Published: 2026-08-10 Turning iPhone photos into a PDF is a two-step job: the photos are HEIC, and PDF tools expect JPG or PNG. Convert the HEIC files to JPG first, then drop them into a PDF. This guide walks through the whole flow and keeps the files on your own device. Someone asks for a PDF of your receipts, your signed contract, or the photos of a damaged item. You select the images on your iPhone and hit "Print to PDF", only to end up with a document that some systems refuse to open or that shows blank pages. That is HEIC again. Your iPhone photos are HEIC, and most PDF tools quietly fail on them. The reliable way to put iPhone photos into a document is to convert them to JPG first, then build the PDF. Here is the whole flow, and it keeps your files on your device. ## Why HEIC Photos Break PDF Creation A PDF is a container, but the tools that make PDFs from images expect common image formats. HEIC is Apple's compressed format, and the PDF generators on many phones, in email apps, and on desktop are not built to decode it: - **Print to PDF** on the iPhone can drop HEIC pages or produce blank pages. - **Online PDF tools** may reject the files or silently skip them. - **Email and office suites** often cannot insert HEIC into a document at all. JPG and PNG, by contrast, are what every PDF tool reads natively. Convert your photos first and the PDF builds cleanly, every time. ## Convert HEIC to JPG, Then Build the PDF The workflow is two clear steps. Do the first one on your device so nothing is uploaded. 1. **Convert the HEIC photos to JPG.** Our [HEIC to JPG converter](/tools/heic-to-jpg) runs in your browser with a local build of libheif, so the photos never leave your device. Download the JPGs, individually or as a ZIP. 2. **Assemble the PDF from the JPGs.** On a Mac, open the JPGs in Preview and go to **File > Print > Save as PDF**. On Windows, select the JPGs, right-click, and choose **Print**, then set the printer to **Microsoft Print to PDF**. On a phone, use the Files app or any PDF tool that accepts JPG. Stick to JPG rather than PNG unless you need transparency, because JPG keeps the final PDF smaller while looking identical for photos. ## The Other Direction: PDF Pages Back to JPG Sometimes the job runs the other way — you have a PDF and need it as images. For that, a dedicated [PDF to JPG](/tools/pdf-to-jpg) tool converts each page to a JPG in the browser, which is handy when you want to reuse a page in a listing or a document. ## FAQ **Can I make a PDF directly from HEIC photos?** Not reliably. The tools that build PDFs from images usually cannot decode HEIC, so you get blank or missing pages. Converting to JPG first avoids the problem. **Does converting HEIC to JPG before making a PDF reduce quality?** No. At high JPG quality the photos look identical, and PDFs are mostly about sharing and printing, where the difference is invisible. **What is the best format to put photos into a PDF?** JPG for photos. It keeps the file small and every PDF tool reads it. PNG is only worth it if you need transparency, which printed documents rarely do. **Can I combine multiple HEIC photos into one PDF?** Yes. Convert the whole set to JPG, then add all the JPGs to a single PDF using Preview, Microsoft Print to PDF, or any PDF tool. ## Bottom Line Putting iPhone photos into a PDF falls over because the photos are HEIC and PDF tools expect JPG. Convert your HEIC photos to JPG first, then build the PDF from the JPGs, and the document opens everywhere. Run the conversion through the [online converter](/tools/heic-to-jpg), assemble the PDF, and send it off with confidence. ### How to Convert HEIC to JPG for eBay / Etsy / Shopify Product Photos Published: 2026-08-09 Listing products online is hard enough without the photo upload failing. eBay, Etsy, and Shopify all prefer JPG, and many reject HEIC outright. Convert your product photos to JPG before listing and the uploads go through the first time, for every image in your catalog. You finish photographing a product on your phone, drag the photos into your eBay listing, and the upload spins for a while before failing. Etsy tells you the file type is not supported. Shopify shows a grey box where your product photo should be. The photos are fine. The format is the problem. Marketplaces and storefronts built their upload pipelines around JPG. HEIC, the format your iPhone saves by default, is the one they reject or quietly fail to render. Convert your product photos to JPG before you list and every upload goes through cleanly. ## Which Marketplaces Accept HEIC (and Which Don't) The short version: assume none of them treat HEIC as a first-class citizen. - **eBay** expects JPG for listings and store images. HEIC uploads commonly error out or need a manual workaround. - **Etsy** lists supported file types and JPG is the safe common denominator; HEIC often triggers an unsupported-file error. - **Shopify** handles product images better than most, but HEIC can still fail on certain upload paths and on some browsers. - **Amazon** and **Walmart** catalogs are JPG-first; HEIC is not accepted for most product images. Every one of these platforms renders JPG natively. Converting before you upload removes the failure point instead of fighting it. ## Convert HEIC to JPG for Product Photos Product photos need to keep their resolution — a sharp, well-lit image is what sells. Convert once, locally, and keep every pixel. 1. **Pull the product photos** into one folder. 2. **Convert them to JPG.** Our [HEIC to JPG converter](/tools/heic-to-jpg) decodes the files in your browser using a local build of libheif, so nothing is uploaded and the resolution stays intact. 3. **Download the JPGs**, individually or as a ZIP. 4. **Upload to your listing** on eBay, Etsy, or Shopify. Because the conversion runs on your device, you also keep the original HEIC files as a lossless backup on your phone. ## A Few Things That Make Marketplace Photos Work Better Format is the gatekeeper. These three habits make the photos themselves perform: - **Keep resolution high.** Marketplaces downscale for thumbnails but want the full-size original for zoom. Do not shrink a product photo to save file size. - **One JPG conversion, not several.** Re-saving a JPG repeatedly washes it out. Convert from HEIC once and keep that file. - **Match the platform's size rules.** eBay and Shopify publish pixel and file-size limits. Convert, then check the dimensions before uploading. | Platform | Prefers | HEIC behavior | | -------- | ------- | ------------------ | | eBay | JPG | Fails / errors out | | Etsy | JPG | Unsupported file | | Shopify | JPG | Intermittent fails | The pattern is the same everywhere: upload JPG, and the platform stops being the problem. ## FAQ **Does eBay accept HEIC photos?** Not reliably. eBay's listing uploads are built around JPG, and HEIC files commonly fail or require conversion first. **Will converting HEIC to JPG lower the quality of my product photos?** No. At high JPG quality the result is visually identical, and marketplaces compress for display anyway. Keep the resolution and you keep the quality. **Can I convert HEIC to JPG in bulk for a whole catalog?** Yes. Convert all your product photos in one batch, download the ZIP, and upload the JPGs together. **Is converting HEIC to JPG safe for my product images?** Yes, and because the tool runs in your browser, the photos never leave your device. ## Bottom Line Marketplaces are JPG-first, and HEIC is the format that makes listing uploads fail. Convert your product photos to JPG before you list and the uploads go through the first time, every time. Run the batch through the [online converter](/tools/heic-to-jpg) and get back to selling instead of troubleshooting. ### How to Upload HEIC to Google Drive / Dropbox as JPG Published: 2026-08-08 Cloud storage will hold your HEIC files, but previewing them is hit or miss — Google Drive and Dropbox often show a blank thumbnail or demand a download. Converting HEIC to JPG before you upload makes every file viewable right in the browser, for you and anyone you share it with. You drag a folder of iPhone photos into Google Drive and the thumbnails come back empty. Or you share a Dropbox link and the person on the other end sees a file they have to download and can't preview. Cloud storage stores HEIC fine — it just does not always know how to show it. Google Drive, Dropbox, and most cloud services depend on the same browser and OS decoders as everyone else. Those decoders are inconsistent with HEIC. The result is blank previews, "unsupported file" warnings, and links that force downloads instead of letting people look. The fix that ends all of it: convert your HEIC photos to JPG before you upload. Every cloud service previews JPG instantly, in every browser, on every device. ## Why Cloud Storage Struggles With HEIC HEIC is Apple's compressed photo format. Drive and Dropbox will store it and let you download it, but previewing depends on built-in decoders that treat HEIC differently depending on your browser and OS: - **Chrome on Windows** needs the HEIF extension installed to show a preview. - **Web previews** in Drive and Dropbox often fall back to a "download to view" link. - **Shared links** become useless when the recipient has no decoder. - **Batch views** (grids, galleries, timelines) silently skip HEIC files. JPG avoids every one of these. It is the format every cloud service renders natively, with no extension and no caveats. ## Upload HEIC to Google Drive as JPG, Step by Step The cleanest workflow is to convert first, then upload the JPGs. It takes about a minute and works for one photo or a whole album. 1. **Convert the photos to JPG.** Our [HEIC to JPG converter](/tools/heic-to-jpg) processes the files in your browser with a local build of libheif, so nothing is uploaded to a conversion server first. 2. **Download the JPGs**, individually or as one ZIP. 3. **Open Google Drive or Dropbox** and drag the JPG files in. 4. **Preview them.** The thumbnails load, the grid shows every photo, and shared links let anyone view without downloading. Working this way has a side benefit: the JPGs preview instantly, but you also keep the originals saved as HEIC on your phone if you want them in their original size. ## The Same Fix Works for Dropbox, OneDrive, and iCloud The steps do not change for any cloud service, because the problem is the file, not the service. Whether you upload to Dropbox, OneDrive, or a shared company folder, converting HEIC to JPG before uploading makes previews work everywhere. If you prefer to keep working in the cloud, you can also convert inside the browser and upload straight to the folder you are targeting — the local converter above drops the JPGs into your downloads, ready to drag wherever you need them. ## FAQ **Does Google Drive support HEIC?** It stores HEIC files, but previewing depends on your browser and OS. On many setups the preview is blank or a forced download. Converting to JPG removes that uncertainty. **Will converting HEIC to JPG lose quality in the cloud preview?** No. Your JPG upload keeps its resolution. Cloud services render JPG at full quality in the preview. **Can I batch upload HEIC photos as JPG?** Yes. Convert the whole set in one pass, download the ZIP, and upload the JPGs together. The folder structure stays intact. **Do the original HEIC files stay on my phone?** Yes. Converting makes a JPG copy; it does not delete the HEIC original from your device. ## Bottom Line Cloud storage holds HEIC but frequently fails to show it. Convert your photos to JPG before uploading and Drive, Dropbox, and every shared link just work — previews load, grids fill in, and recipients can actually look. Run the batch through the [online converter](/tools/heic-to-jpg) and never send a blank thumbnail again. ### HEIC to JPG for Printing: Why Your Prints Look Wrong and How to Fix It Published: 2026-08-07 A photo that looks great on your iPhone can come back from the print shop blurry, cropped, or rejected outright because it is HEIC. Print systems expect JPG. Convert your HEIC photos to JPG before ordering, and the prints match what you saw on screen. You ordered prints from your phone and the shop emailed back: "We can't process HEIC files." Or you sent a HEIC and the print came back with colors and sharpness that do not match the photo you actually took. Neither is a printing problem. It is a file format problem. Print services — labs, kiosks, photobook sites, passport photo booths — expect JPG. Some accept HEIC, but many quietly downgrade, crop, or reject it. The fix is to convert HEIC to JPG before you order. Here is how, and why it changes the result. ## Why HEIC Gives Print Shops Trouble HEIC is Apple's heavily compressed format for iPhone photos. It saves space on your phone, but the print industry never standardized on it. When you upload a HEIC: - **Some labs reject it** and never tell you why. - **Some auto-convert it** at a low quality setting you did not choose. - **Some open it inconsistently**, shifting colors or sharpness. - **Kiosks and passport booths** often refuse it outright. JPG, by contrast, is what every printer, every photobook tool, and every passport photo system reads natively. Converting before you order removes the unknown. ## Convert HEIC to JPG for Printing, Step by Step You want the conversion to keep the original resolution and not add a second layer of compression. Do it once, on your device, before you upload to the print service. 1. **Gather the photos** you want printed into one place. 2. **Convert them to JPG.** Our [HEIC to JPG converter](/tools/heic-to-jpg) runs entirely in your browser using a local build of libheif, so nothing is uploaded and no quality is thrown away beyond the normal JPG step. 3. **Download the JPGs**, individually or as a single ZIP. 4. **Upload the JPGs** to the print shop or kiosk. Because the conversion happens locally, you keep the original resolution and the metadata such as date and camera settings. That matters when a lab prints at a stated size. ## What Actually Affects Print Quality Converting to JPG is the format fix. Quality is a separate knob worth knowing about: - **Resolution.** A print needs enough pixels for its physical size. A 12 MP photo prints comfortably at 8×10 inches. A 4×6 needs far less. - **One conversion, not two.** Converting HEIC to JPG, then having the lab re-compress it, compounds losses. Hand over a clean JPG and the lab has nothing else to degrade. - **Color profile.** Most phone photos are sRGB. If you export with a wider profile, some labs misread it. Stick with sRGB unless the lab asks otherwise. | File | Reads on every print system | Keeps full resolution | Batch-friendly | | ---- | --------------------------- | --------------------- | -------------- | | HEIC | No | Yes | Yes | | JPG | Yes | Yes | Yes | The table is the whole story: HEIC is the one format that adds friction. JPG is the one that never does. ## FAQ **Will converting HEIC to JPG ruin my print quality?** No. JPG conversion at high quality is standard for printing. The bigger risk is the lab re-compressing a file you already compressed, which is why you convert once and hand over a clean JPG. **Do photo print shops accept HEIC?** Some do, some quietly convert it, and some reject it. There is no way to know which you are dealing with until you have already paid. Converting to JPG first removes the guesswork. **Is there a quality difference between HEIC and JPG for printing?** At normal print sizes, no visible difference at high JPG quality. HEIC is smaller on disk, but prints are not made from disk size. **Can I convert HEIC to JPG without a computer?** Yes, if the tool runs in a browser. The converter above works on a phone or tablet because it does the work locally on your device. ## Bottom Line Print shops expect JPG, and HEIC is the exact file that trips them up. Convert your photos to JPG before you order, keep the resolution, and let the lab do its job on a file it can actually read. Run the batch through the [online converter](/tools/heic-to-jpg) and the prints will match what you saw on your phone. ### How to Email HEIC Photos (So the Recipient Can Actually Open Them) Published: 2026-08-06 Emailing HEIC photos straight from your iPhone usually means the other person gets a file they cannot open. The fix is to convert to JPG before you hit send. Here is the quickest way to do it, on your phone or at your desk, without uploading anything. You shoot a photo on your iPhone, attach it to an email, and hit send. A few minutes later your client writes back: "I can't open this." That is HEIC doing what HEIC does. Your phone saves photos as HEIC, a compressed format most businesses and a lot of personal email accounts do not handle. The picture is fine on your end. The moment it lands in someone else's inbox, it becomes a file named `IMG_0001.HEIC` that their mail app either refuses to open or shows as a blank attachment. The reliable fix is simple: send JPG instead of HEIC. Here is how to do it without losing quality or calling in IT. ## Why the Recipient Cannot See Your HEIC Photo HEIC is Apple's format for iPhone photos. It is roughly half the size of a JPEG at similar quality, which is great for your storage. The catch is that not everyone can decode it: - **Windows** mail apps and Outlook need the HEIF extension installed, and many business setups do not have it. - **Gmail and Outlook web** show HEIC as a download you then have to figure out how to open. - **Android** support varies by version and mail client. - **Customers, printers, and HR portals** often reject the file outright. So the person on the receiving end is not wrong, and neither are you. The two of you simply speak different formats. Converting to JPG before you send closes that gap instantly. ## The Fastest Way to Email HEIC Photos as JPG You have two good options. Pick based on how many photos you are sending. ### One or Two Photos: Convert in the Mail App On the iPhone, the shortcut that dozens of threads recommend is to use **Mail**'s own conversion. When you attach a HEIC to a new message, iOS quietly asks whether to send it as "Automatic" or "Most Compatible". Choose **Most Compatible** and iOS converts the photo to JPG on the spot. The recipient gets a normal JPG. The same trick works in a few places that respect the system setting, but not all apps honor it. If the person still reports a blank attachment, fall back to the next method. ### A Handful or a Whole Folder: Convert Once, Then Attach For more than a couple of photos, or when you want to be sure, convert first and attach the JPGs. Online, our [HEIC to JPG converter](/tools/heic-to-jpg) does the whole batch in your browser: 1. **Drop in the photos.** One or an entire folder, whichever you have. 2. **It decodes on your device.** A WebAssembly build of libheif runs locally, so the photos never leave your machine. 3. **Download the JPGs.** Keep them individually or grab one ZIP of the whole set. 4. **Attach to the email.** The recipient now gets files any device can open. Because the conversion happens in your browser, there is no upload step and no privacy concern when the photos are sensitive. ## The Never-Fail Checklist Before You Click Send - Convert to JPG, not another uncommon format. - Attach the JPG file, not the original HEIC. - If the email system compresses attachments, keep the file under the account limit. - For a huge batch, note that some mail servers reject very large attachments — a ZIP helps. ## FAQ **Will I lose quality converting HEIC to JPG?** JPG is lossy, so there is some compression. At high quality, the difference is hard to notice on a normal screen. Resolution stays the same. **Why does my iPhone keep sending HEIC even after I change the setting?** You may be attaching an old file, or the mail app is ignoring the system preference. Converting the file to JPG before attaching sidesteps the whole question. **Can the recipient just download and open the HEIC?** Sometimes. Android and newer Windows can handle it, but the person with an older setup or a business machine will struggle. JPG removes all doubt. **Do I have to upload my photos to a server to convert them?** No. The browser converter above processes everything locally on your device. ## Bottom Line Emailing HEIC photos is fine as long as you remember the other side probably cannot open them. Convert to JPG first and the attachment just works. For a couple of photos, use "Most Compatible" in Mail. For anything bigger, run the batch through the [online converter](/tools/heic-to-jpg) and attach the JPGs. ### How to View HEIC Files on Linux / Ubuntu Published: 2026-08-05 Linux desktops often can't open HEIC files out of the box. Here's how to fix it: install libheif for heif-convert, grab a viewer with HEIC support, or convert in the browser. Covers Ubuntu, Debian, Fedora, and Arch. Someone sends you a photo from an iPhone. You open it in your default viewer and get a blank window or an error about an unsupported format. The file is fine. Your Linux install just does not ship the HEIC decoder by default. The fix usually comes down to one package. Here are the three ways to view HEIC on Linux, from the command line to a one-off browser convert. ## Why Linux Can't View HEIC HEIC is a container format with HEVC-compressed images inside. Most Linux distributions do not bundle a HEVC decoder for the same reason Windows does not: patent licensing. So the codec is available, but it is not on by default. The good news is that the tooling is mature. `libheif` provides both a library and command-line tools, and most distributions package it cleanly. ## Method 1: heif-convert from libheif (Command Line) The quickest route is the `heif-convert` tool that ships with libheif. Install it, then convert a file. On Ubuntu and Debian: ```bash sudo apt install libheif-examples heif-convert photo.heic photo.jpg ``` On Fedora: ```bash sudo dnf install libheif-tools heif-convert photo.heic photo.jpg ``` On Arch: ```bash sudo pacman -S libheif heif-convert photo.heic photo.jpg ``` That drops a JPG next to your HEIC. For a whole directory, loop over the files: ```bash for f in *.heic; do heif-convert "$f" "${f%.heic}.jpg"; done ``` ## Method 2: Use a Viewer with HEIC Support If you prefer a GUI, pick a viewer that can read HEIC directly. - **gThumb** is a lightweight image viewer that supports HEIC out of the box on most distros. Install it with your package manager and open the file. - On Ubuntu, installing `libheif1` alongside a modern `gThumb` covers most cases. - **ImageMagick** with libheif support can also display and convert, though it is more at home on the command line. If your default viewer still refuses the file after installing libheif, a viewer like gThumb is the reliable pick. ## Method 3: Convert in the Browser (One-off) When you just need a single file and do not want to touch the terminal, convert it in a browser. Our [HEIC to JPG converter](/tools/heic-to-jpg) runs entirely on your device: 1. **Drop the file**. Drag the HEIC into the browser. 2. **Convert locally**. A WebAssembly build of libheif decodes it on your machine. Nothing is uploaded. 3. **Download the JPG**. Open it in any viewer. You can also output [PNG](/tools/heic-to-png) or [WebP](/tools/heic-to-webp) if you need those formats. ## Which Approach Should You Use? | Situation | Best method | | --------------------------- | ------------------------------ | | Command line user, one file | Method 1, heif-convert | | A whole folder of photos | Method 1, loop over the files | | Prefer a GUI | Method 2, gThumb | | One-off, no install wanted | Method 3, browser | | Need PNG or WebP output | Method 1 or 3, pick the format | ## FAQ **Does Ubuntu open HEIC natively?** Not by default. Install `libheif-examples` (or `libheif1` plus a HEIC-aware viewer) and the files open normally. **What package provides heif-convert?** On Ubuntu and Debian it is `libheif-examples`. Fedora splits it into `libheif-tools`, and Arch includes it in `libheif`. **Can I view HEIC without converting?** Yes. Install libheif and use a viewer that supports it, such as gThumb. The viewer decodes the file without changing it. **Does converting HEIC lose quality?** JPG is lossy, but at high quality the difference is usually invisible. Resolution is preserved. ## Bottom Line Install `libheif-examples` on Ubuntu and Debian, `libheif-tools` on Fedora, or `libheif` on Arch, then use `heif-convert` to turn photos into JPGs. Prefer a GUI, pick gThumb. For a single file with zero installs, [convert it in the browser](/tools/heic-to-jpg). Every path gets the photo out of the container and onto your screen. ### How to Stop iPhone from Taking HEIC Photos (and Switch Back to JPEG) Published: 2026-08-04 Your iPhone saves photos as HEIC by default, which trips up Windows, Android, and many websites. Flip one setting under Camera > Formats to take JPEG instead, and convert the HEIC files you already have. Your iPhone has shot every photo as HEIC since you set it up. You would not have noticed, because the camera app plays it back fine. The trouble only shows up when the files leave the phone: a blank thumbnail on Windows, a rejected upload on a website, a question mark on an Android friend's phone. If you keep running into that, the fix has two parts. Flip one setting so new photos are JPEG, and convert the HEIC photos you already have. ## Why Your iPhone Uses HEIC iOS defaults to HEIC because the format holds roughly half the space of JPEG at the same quality. Apple chose it to fit more photos in the same storage. The trade-off is compatibility. HEIC needs a HEVC decoder, and that is not universal. Windows wants an extension, Android support varies, and plenty of services refuse the format. If you send photos to other people or upload them regularly, JPEG removes the friction. ## Switch New Photos to JPEG The setting lives under Camera > Formats. 1. Open **Settings**. 2. Tap **Camera**, then **Formats**. 3. Under **Camera Capture**, select **Most Compatible**. That is it. New photos are saved as JPEG from now on. The toggle says it plainly: Most Compatible saves in JPEG, High Efficiency saves in HEIC. One caveat: photos will take up more space now. That is the price of universal compatibility, and on modern iPhones the difference is usually a few extra gigabytes over time. ## What About the HEIC Photos You Already Have? The setting only affects new photos. Every HEIC file already on your phone stays as HEIC. To make those usable everywhere, convert them. Our [HEIC to JPG converter](/tools/heic-to-jpg) runs in a browser and works through a whole library: 1. **Drop the photos**. Select a few or a whole album's worth. 2. **Convert locally**. The files are processed on your device, so nothing is uploaded. 3. **Download the JPGs**. Grab them individually or as a ZIP. You can also output [PNG](/tools/heic-to-png) or [WebP](/tools/heic-to-webp) if those fit your needs better. ## Still Getting HEIC in Some Cases? A few camera modes record in HEVC even with Most Compatible selected. Burst shots, some HDR captures, and videos can still use the high-efficiency codec. If you spot a stray HEIC after switching, convert it with the same tool. The bulk of your photos will be JPEG. ## Does This Change Photo Quality? No. JPEG at the quality the camera produces is visually indistinguishable from HEIC for normal photos. You trade a little storage for a format that works everywhere. If you want to keep the smaller files, leave the setting on High Efficiency and convert only when you need to share. ## FAQ **Where is the HEIC setting on iPhone?** Go to Settings > Camera > Formats. Choose Most Compatible under Camera Capture to save JPEG instead of HEIC. **Does Most Compatible lower photo quality?** No. Your photos stay at the same resolution and quality. They just use more storage because JPEG is a larger format. **Will switching delete my HEIC photos?** No. The setting only changes how new photos are saved. Your existing HEIC files stay on the phone until you delete or convert them. **Can I convert my existing HEIC photos?** Yes. Use our [HEIC to JPG converter](/tools/heic-to-jpg) in the browser to convert the files already on your phone, then keep or delete the originals as you prefer. ## Bottom Line Open Settings > Camera > Formats and pick Most Compatible to stop new HEIC photos before they start. For the HEIC files you already have, [convert them to JPG](/tools/heic-to-jpg) in the browser. That combination makes every photo you take and every photo you already own work on any device, any app, and any website. ### How to Open HEIC Files on Android: 3 Methods That Actually Work Published: 2026-08-03 An iPhone photo lands on your Android and shows a blank tile. Here's how to open HEIC on Android: Google Photos handles it on Android 9+, and on older devices a quick convert to JPG solves it. Three methods, all free. Someone sends you a photo from an iPhone and it lands on your Android as a gray tile. Tap it and nothing happens. The image is there, the file is valid, and your phone still will not show it. That is HEIC, the format iPhones use by default, and not every Android device can read it. Here is how to get the picture on screen, in three tiers that go from "already installed" to "convert it and move on." ## Why Some Androids Can't Open HEIC HEIC is a container format with HEVC-compressed images inside. Android added native support in version 9 (Pie), so phones from 2018 onward usually handle it. Older devices, budget phones without the codec, and some apps that skip the system decoder are where it breaks. The distinction matters: if your phone is on Android 9 or newer, you likely have a working decoder already and just need an app that uses it. If your phone is older, converting is the only reliable route. ## Method 1: Use Google Photos (Already Installed) On Android 9 and newer, Google Photos is the simplest answer. It ships on most phones and reads HEIC through the system decoder. 1. Open Google Photos and find the HEIC file. 2. Tap it. If it renders, you are done. If the thumbnail is blank, update the app from the Play Store and try again. Some versions of Google Photos struggle with HEIC until they are current. ## Method 2: Check Your Android Version If Google Photos still will not show the file, check what Android you are running. Open **Settings** then **About phone** and look at the Android version. - **Android 9 or newer**: the system can decode HEIC. The problem is the app, not the phone. Try Google Photos or another modern viewer. - **Android 8 or older**: the decoder is missing. No app can fix that, because the codec is a system component. Go to the next method. This step saves you time. There is no point installing viewers on a phone that cannot decode the format in the first place. ## Method 3: Convert to JPG (Works on Any Android) When the device cannot decode HEIC, convert the file and it will open everywhere. Our [HEIC to JPG converter](/tools/heic-to-jpg) runs in a browser and works on any Android: 1. **Open the converter** in Chrome or your browser of choice. 2. **Drop the HEIC file**. It can also import from Google Photos or your downloads. 3. **Download the JPG** and open it in any gallery app. The whole conversion happens on the phone, so the photo is not uploaded anywhere. You can also convert to [PNG](/tools/heic-to-png) or [WebP](/tools/heic-to-webp) if you need those formats. ## Which Method Should You Use? | Your situation | Best method | | ----------------------------------- | ----------------------------- | | Android 9+, Google Photos installed | Method 1 | | Blank thumbnail in Google Photos | Method 2, then update the app | | Android 8 or older | Method 3 | | File must open in a specific app | Method 3, convert to JPG | | You want to keep the original | Convert, then keep both files | ## FAQ **Which Android versions support HEIC?** Android 9 (Pie) and newer have native HEIC support. Older versions lack the system decoder. **Why does my Android show a blank thumbnail for HEIC?** Either the device is on Android 8 or older, or an app is not using the system decoder. Google Photos is usually the reliable viewer on supported devices. **Can I open HEIC on Android with a third-party app?** On Android 9+, yes. Most image viewers that use the system decoder can show it. On Android 8 and older, no app can decode the format, so convert to JPG instead. **Is converting HEIC on my phone safe?** Yes. The browser-based converter processes the file on your device, so the photo is not uploaded to any server. ## Bottom Line If your phone is on Android 9 or newer, open HEIC directly in Google Photos. If it is older, or a specific app refuses the file, [convert HEIC to JPG](/tools/heic-to-jpg) in the browser and open that instead. The original photo stays intact, and the JPG works on any app and any device. ### How to Convert HEIC to JPG on Mac: The Built-in Way vs Online Published: 2026-08-02 Your Mac opens HEIC fine, but the file type trips up other people and websites. Convert to JPG with Preview for a single photo, or use a browser converter for a whole batch. Both free, no installs. Your Mac opens HEIC without complaint. Apple invented the format, so Preview and Photos handle it natively. The problem starts the moment you send the file somewhere else. A Windows coworker sees a blank thumbnail. A web form says unsupported. A photo printer rejects it. That is the real reason to convert: not because your Mac needs it, but because everyone else does. Here are the two ways that cost nothing, one built in and one online. ## Why Convert HEIC to JPG on a Mac at All HEIC saves roughly half the storage of JPEG at similar quality. On your own Mac, that is a win. But the file carries a decoder requirement that is not universal. Windows needs an extension, Android support varies by version, and a long list of websites and services still refuse HEIC uploads. Until that ecosystem changes, converting to JPG is the reliable way to make photos travel. The format is universal, the files open everywhere, and the quality loss at a high setting is hard to spot. ## Method 1: Export with Preview (Built-in) Preview is on every Mac and can convert without any install. It works for one or a few photos. 1. Select the HEIC files in Finder and press `Command + O` to open them in Preview. 2. With all of them open, press `Command + A` to select every image. 3. Go to **File** then **Export Selected Images**. 4. In the dialog, set **Format** to **JPEG** and pick a quality. **High** keeps the file close to the original. 5. Choose a destination and click **Export**. This batch works best when the photos are side by side in the preview sidebar. For a folder with hundreds of files, the online route below saves you from clicking through the same dialog. ## Method 2: Batch Convert Online When you have a folder of photos, convert them all at once in a browser. Our [HEIC to JPG converter](/tools/heic-to-jpg) runs the whole job on your device: 1. **Drop the folder**. Drag in one photo or an entire folder. The tool works through them automatically. 2. **Local processing**. A WebAssembly build of libheif decodes each file in the browser. Nothing is uploaded, so nothing leaves your Mac. 3. **Download**. Keep the JPGs individually or grab a single ZIP of the whole set. You can also output [PNG](/tools/heic-to-png) for lossless images with transparency, or [WebP](/tools/heic-to-webp) for smaller web-ready files. ## Comparison: Built-in vs Online | Aspect | Preview (built-in) | Online converter | | --------------- | --------------------- | -------------------------- | | Install needed | No | No | | Best for | A handful of photos | Folders, hundreds of files | | Quality control | Pick a quality level | High by default | | Privacy | Files stay local | Files stay local | | Output formats | JPEG, PNG, HEIC, more | JPG, PNG, WebP | | Extra setup | None | None | The honest difference is scale. Preview is fine for a few files. Once converting becomes a recurring chore, the browser tool gets it done in one drag. ## FAQ **Does converting HEIC to JPG on Mac lose quality?** JPG is lossy, so there is some compression. At high quality, most people cannot tell the difference at normal viewing sizes. Resolution stays the same. **Can I convert HEIC to JPG in the Photos app?** Yes, but it is indirect: open the photo, go to **File** then **Export**, and choose JPG. Preview is usually faster for a quick export. **Why won't my HEIC file upload to a website?** Many sites still do not accept HEIC. Converting to JPG before uploading avoids the rejection. **Is there a way to convert without uploading?** Yes. Both methods here keep your files on your device. The online tool still processes everything locally in the browser. ## Bottom Line For a single photo, use Preview and export as JPEG. For a folder of photos you need to share or send, use the [online converter](/tools/heic-to-jpg) and grab the ZIP. Neither costs money, neither needs a download, and both keep your photos on your Mac. ### How to Convert HEIC to JPG on Windows (No Software) Published: 2026-08-01 Windows can't open HEIC photos out of the box. Here's how to fix it: install the free HEIF Image Extensions from Microsoft, or convert straight in a browser with our tool, no software required. Double-click a HEIC file on Windows and you get a blank thumbnail, a gray box, or a prompt about a missing codec. The photo is fine. The file is fine. Windows just never shipped the decoder iPhones have used as the default since iOS 11. That sends most people hunting for a converter. This page covers the three approaches that actually work, including one that needs no install at all. ## Why Windows Can't Open HEIC HEIC is a container format, a sibling of MP4, with HEVC-compressed image data inside. Microsoft left the HEVC decoder out of Windows because of patent licensing costs. The result is a valid file with intact data that Windows still refuses to render. You have two paths: add the decoder Microsoft sells for free, or convert the files to a format every Windows app reads. ## Method 1: Install the Free HEIF Image Extensions The supported fix is the [HEIF Image Extensions](https://apps.microsoft.com/detail/9PMMSR1CGPWG) from the Microsoft Store. It is free, published by Microsoft, and takes about a minute. 1. Open the Microsoft Store and search for "HEIF Image Extensions", or open the link above. 2. Click **Install** and let it finish. 3. Open the Photos app and double-click your HEIC. It should render now. Once the extension is in, you can also export to JPG without any third-party tool: 1. Open the photo in the Photos app. 2. Click the three-dot menu (top right) and choose **Save a copy**. 3. In the dialog, switch the file type to **JPG** and save. That works for one photo at a time. For a whole batch, the next method is faster. ## Method 2: Convert in the Browser, No Software If you do not want to touch the Microsoft Store, or you have a folder of photos to clear, convert in a browser. Our [HEIC to JPG converter](/tools/heic-to-jpg) runs the entire pipeline on your device: 1. **Drop files**. Drag in one photo or a whole folder. Batch is automatic. 2. **Client-side decoding**. A WebAssembly build of libheif does the work locally. Nothing is uploaded, so nothing leaves your machine. 3. **Download**. Grab individual JPGs or a single ZIP of everything. The tool also handles the Android and Mac cases covered in our other guides, and can output [PNG](/tools/heic-to-png) or [WebP](/tools/heic-to-webp) if you need those instead. ## Method 3: Right-Click Batch Convert (Third-Party) For users who want right-click conversion built into File Explorer, a free tool like XnConvert or ImageMagick with libheif can batch a folder. The trade-off is a one-time install and setup. If you already manage images with one of these, it is a fine fit. If you do not, the browser method above gets the same result with less to maintain. ## Which Approach Should You Use? | Situation | Best method | | ------------------------------------ | ------------------------- | | One photo, want to keep HEIC working | Method 1, save a JPG copy | | A folder of iPhone photos | Method 2, browser batch | | Need PNG or WebP output | Method 2, pick the format | | You already use a batch image tool | Method 3 | | No admin rights, no Store access | Method 2 | ## FAQ **Does Windows open HEIC natively?** No. Windows 10 and 11 need the HEIF Image Extensions before the Photos app can render HEIC files. **Is the HEIF extension free?** Yes, the basic HEIF Image Extensions from Microsoft is free. Microsoft also sells a paid HEVC codec, but you do not need it for viewing or converting to JPG. **Can I convert several HEIC files at once?** Yes. The Photos app saves one copy at a time. For a batch, use the browser converter, which accepts multiple files and downloads a ZIP. **Does converting lose quality?** JPG is lossy, so there is some compression, but at high quality settings the difference is usually invisible. Resolution stays the same. ## Bottom Line Pick the method that matches how you work. Install the free HEIF extension if you want Windows to just open the files. Use the [browser converter](/tools/heic-to-jpg) when you need to clear a folder of photos, when you lack admin rights, or when you want PNG or WebP output. Both are free, and neither requires dedicated software. ### HEIC Format Complete Guide: What iPhone Users Need to Know Published: 2026-07-30 HEIC is Apple's default photo format since iOS 11. It saves storage but breaks on older devices, most browsers, and many apps. Here is what you can do about it, from changing camera settings to batch conversion. Take a photo on an iPhone and the file lands in your library as `IMG_4021.HEIC`. It opens fine on the phone. It opens fine on a Mac. It opens fine when you AirDrop it to another iPhone. Then you email it to someone on Windows. They reply: "The attachment won't open." This is the HEIC compatibility problem in one exchange. Apple switched the default photo format seven years ago. The rest of the world did not. ## Why iPhones Shoot HEIC The reason is file size. A 12 MP photo from an iPhone saves at roughly: | Format | Typical size | Notes | | -------------- | ------------ | -------------------------------------------- | | HEIC (default) | ~1.8 MB | HEVC compression inside an ISOBMFF container | | JPEG | ~3.5 MB | The old iOS default, pre-iOS 11 | | ProRAW | ~25 MB | Available on Pro models, stores sensor data | HEIC cuts photo storage roughly in half. At 50 GB of iCloud storage (the free tier), the difference between HEIC and JPEG is about 14,000 extra photos. Apple sells storage upgrades. The business incentive was never subtle. The compression underneath is HEVC (H.265), the same codec used for 4K Blu-ray and streaming video. HEVC is roughly twice as efficient as JPEG's DCT-based compression at the same visual quality, and it handles 16-bit color depth, which JPEG (8-bit) cannot do. On a technical level, HEIC is a better format. For a deeper dive into the byte-level structure, our [HEIC technical deep dive](/blog/what-is-heic) walks through ISOBMFF boxes and file signatures. The trade-off was compatibility, and that trade-off still has not resolved. ## Where HEIC Still Breaks | Environment | HEIC support | Workaround | | ------------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------- | | iPhone (iOS 11+) | Native | None needed | | Mac (macOS High Sierra+) | Native | None needed | | Windows 10/11 | Requires HEIF Image Extensions ($0.99 from Microsoft Store, or free via OEM bundle) | Convert to JPG | | Windows 7/8 | None | Convert to JPG | | Android 9+ | Native (varies by manufacturer) | Convert if broken | | Chrome/Firefox/Edge | **No HEIC rendering in `` tags** | Convert before web upload | | Safari (macOS/iOS) | Renders HEIC natively | None needed | | Adobe Photoshop | Requires Camera Raw 11.2+ | Convert first, or update | | Most CMS (WordPress, Squarespace) | Converts on upload, strips metadata | Upload original, let CMS convert | | Email attachments | Recipient's device determines compatibility | Convert before sending | | Social media (Instagram, X, Facebook) | Convert server-side on upload | Platforms handle it on their end | The browser column is the painful one. Chrome, Firefox, and Edge together account for roughly 85% of desktop browsing. None of them display a HEIC file in an `` tag. If you run a website and a user uploads a HEIC photo, it will not render until your backend converts it. ## Three Ways to Handle HEIC Files ### 1. Change Your iPhone Camera Setting The nuclear option. Go to Settings → Camera → Formats and switch from "High Efficiency" to "Most Compatible." What this does: the Camera app saves photos as JPEG instead of HEIC. Videos save as H.264 instead of HEVC. File sizes double. Compatibility problems disappear. When to do this: if you regularly send photos to Windows users, upload to web apps that choke on HEIC, or work with software that has not been updated since 2017. The storage cost is real (a 256 GB iPhone shooting JPEGs fills up noticeably faster) but the friction cost of converting every photo may be higher. When not to: if you mostly share within the Apple ecosystem, if you use iCloud Photo Library (which handles format conversion transparently when exporting), or if storage space matters more than occasional compatibility issues. ### 2. Convert After Shooting Leave the camera on High Efficiency. Convert photos when you need to share them outside the Apple ecosystem. This keeps the storage savings of HEIC where it matters (on your phone) and the compatibility of JPEG where it matters (everywhere else). Our [HEIC to JPG converter](/tools/heic-to-jpg) runs in your browser. Drop a folder of HEIC photos, get a folder of JPEGs back. No upload, no account, nothing to install. The converter decodes each HEIC file with a WebAssembly build of libheif (the same C library that powers HEIC support on Linux) and encodes the output as JPEG at 90% quality, which is visually indistinguishable from the source on any screen. Quality notes: - The conversion is from one lossy format to another. The output JPEG is about 2× larger than the source HEIC at the same visual quality. This is normal: JPEG needs more bits to hit the same perceptual threshold. - Converting to PNG instead ([HEIC to PNG](/tools/heic-to-png)) gives you a lossless file, but at 5–8× the original HEIC size. Useful if you plan to edit the photo further, wasteful if you are just sharing it. - Converting to WebP ([HEIC to WebP](/tools/heic-to-webp)) gives you a file roughly the same size as the HEIC source with broad browser support (Chrome, Firefox, Edge, and Safari 14+ all render WebP). ### 3. Use iCloud's Built-in Export When you export photos from the Mac Photos app or iCloud.com, you get a format choice. "Export Unmodified Original" gives you the HEIC file as-is. "Export as JPEG" converts on export. This works for occasional sharing. It does not work for batch operations: exporting 200 photos one at a time through the Photos app is an exercise in patience. For large batches, a dedicated converter is faster. ## HEIC vs HEIF: the naming confusion Apple calls the format HEIC. The standard is called HEIF (High Efficiency Image File Format, ISO/IEC 23008-12). The distinction: - HEIF is the container standard. It can hold still images, image sequences (bursts), and image collections. - HEIC is Apple's brand for HEIF files containing HEVC-encoded images. The `.heic` extension is an Apple convention. The standard `.heif` extension exists but almost nobody uses it. - HEIF files can also contain AVC (H.264) or AV1-encoded images. Apple chose HEVC because they already used it for video and had the licensing sorted. In practice, `.heic` and `.heif` files are structurally identical (they are both ISOBMFF containers) and tools that handle one handle the other. The difference is only the brand marker in the `ftyp` box: `heic` vs `heif` vs `mif1`. ## What Happens to Metadata During Conversion HEIC files carry EXIF metadata in an `Exif` item inside the `meta` box. When our converter decodes a HEIC file to raw pixels and re-encodes it, that metadata is not carried over. The output file contains compressed pixels and nothing else. This is a feature, not a bug, for most sharing use cases. Your iPhone embeds GPS coordinates, timestamps, camera serial numbers, and sometimes a thumbnail of the unedited image into every HEIC file. Sharing the original means sharing all of that. Our [EXIF privacy guide](/blog/exif-metadata-privacy-guide) covers the full list of what is in there and how to read it yourself. If you need to preserve metadata (for archiving or professional workflows), use Apple's export tools or a metadata-aware converter like ExifTool. ## Batch HEIC Workflow The most common workflow: you have a folder of HEIC photos and need JPEGs for a client, a CMS, or a sharing platform. 1. Open [HEIC to JPG](/tools/heic-to-jpg). 2. Drag the folder onto the drop zone. All `.heic` and `.heif` files are queued; non-HEIC files are skipped with a clear label. 3. Adjust the quality slider if needed (default 90 works for nearly everything). 4. Wait for processing. A folder of 200 photos takes about a minute on a modern laptop. 5. Download individually or as a single ZIP. The same workflow works for PNG and WebP output via the corresponding converter pages. See our [batch conversion tutorial](/blog/batch-conversion-tutorial) for the full breakdown including format selection, quality trade-offs, and browser-specific download behavior. ## The Short Version - HEIC saves storage. It breaks everywhere except Apple devices and Android 9+. - If you share photos outside the Apple ecosystem regularly, switch the camera to "Most Compatible" (JPEG) or batch-convert before sending. - For occasional sharing, iCloud export works. For batches, a browser-based converter is faster and keeps the files on your device. - Converting to JPG is the safe default. WebP is smaller with broad browser support. PNG is for editing workflows, not sharing. - Metadata does not survive conversion, which is usually what you want when sharing photos publicly. ### Browser-Based File Conversion: How It Works and Why Your Files Stay Private Published: 2026-07-29 Server-based converters require you to upload files to someone else's machine. Browser-based converters run entirely on your device using WebAssembly and platform APIs. Here is the architecture that makes that possible and what it means for privacy. Upload a file to a server-based converter and three things happen. Your file travels over the network to an IP address you did not control. A process on that server decodes it. Then, depending on the site's retention policy, the file sits on disk for anywhere from minutes to forever. Do the same thing in a browser tab and the file never leaves RAM on your machine. The decoder runs inside a WebAssembly sandbox the browser engine enforces. The network is never touched. This is not a policy difference. It is an architectural one. A server-based converter can promise to delete your files; a browser-based one cannot leak them because it never receives them in the first place. ## The Architecture Four layers make client-side conversion work: ### Layer 1: File Access When you drop a file into a browser tab, the `DragEvent` or `` gives JavaScript a `File` object. A `File` is not the file's contents. It is a reference: a name, a size, a MIME type, and a method (`file.arrayBuffer()`) that reads bytes from disk into memory on demand. Until that method is called, zero bytes have moved. The file sits on your filesystem. The browser's file picker is an OS-level dialog; the web page sees only the `File` object the user explicitly selected. ### Layer 2: Format Detection The first bytes of any file identify its format reliably. A JPEG starts with `FF D8 FF`. A PNG starts with `89 50 4E 47`. A HEIC file contains an `ftyp` box with a `heic` or `heif` brand at offset 8. Reading a file's header (the first 32 bytes, typically) is enough to confirm what it actually is, regardless of extension. This check runs before any decoder touches the pixel data. If the header does not match, the file is rejected immediately. No wasted CPU, no confusing error messages halfway through a decode. ### Layer 3: Decoding Raw bytes become pixels through a decoder. Which decoder depends on the format: - JPEG, PNG, WebP, BMP: the browser ships native decoders for these. `createImageBitmap()` hands the compressed bytes to the platform's codec (Windows Imaging Component on Windows, Core Graphics on macOS, Skia on Linux/ChromeOS) and returns raw pixel data. This path is fast, hardware-accelerated where the OS supports it, and requires no additional code. - HEIC: no browser except Safari ships a native HEIC decoder. Our converter bundles libheif, a C library, compiled to WebAssembly. The `.wasm` binary (~1.2 MB compressed) downloads once and caches. It decodes HEIF/HEIC files to raw RGB pixels entirely inside the WASM sandbox. - PDF: PDF.js (Mozilla's PDF renderer) renders each page to a canvas at the requested resolution. No server-side rendering. The PDF never leaves the browser. Every decoder reads from memory and writes to memory. None open sockets. The WASM sandbox in particular cannot make network requests: the browser does not expose networking APIs to WebAssembly modules. Even if the C code called `socket()`, the sandbox would trap it. ### Layer 4: Encoding Raw pixels go into a `` element's 2D context. `canvas.toBlob()` or `canvas.toDataURL()` calls the browser's built-in encoder for JPG, PNG, or WebP output. The encoder is platform-native code: the same code path your operating system uses to save screenshots. The output is a `Blob`, an in-memory byte buffer. It gets handed to a download link or packed into a ZIP archive built in JavaScript. At no point does any byte touch a network socket. ## What the Browser Enforces Web pages run inside a sandbox the browser maintains at the engine level. This is not a polite agreement. It is enforced by process isolation: Renderer process: the JavaScript engine, DOM, and WASM runtime live in a sandboxed process with no direct filesystem or network access. It communicates with the outside world through IPC to the browser process. Site isolation: modern browsers put each origin in its own renderer process. Your files in `file-convert-factory.org` are invisible to JavaScript running on any other domain. WASM sandbox: WebAssembly modules see a flat linear memory buffer and nothing else. No filesystem APIs, no `fetch` unless explicitly imported from JavaScript, no access to the DOM or other browser APIs. The worst a compromised WASM module could do is corrupt its own memory and crash the tab. A server-side converter runs as a privileged process on the server's OS. It can read from disk, write to disk, open network connections, and spawn child processes. The security model depends on the server operator's competence and intentions. The browser sandbox depends only on the browser engine's correctness, and browser sandboxes are among the most heavily audited security boundaries in software. ## What Server-Based Converters Do (and Do Not) Promise Server-based converters are not inherently malicious. Many are run by well-intentioned teams. The problem is structural: 1. The upload step is a copy. Your file now exists in two places. You control one copy. Someone else controls the other. 2. Deletion is a promise. "We delete files after 24 hours" means trust the log line, the cron job, the backup system, and every employee with server access. None of this is verifiable from outside. 3. Metadata travels with the file. Your photo's EXIF data (GPS coordinates, camera serial number, timestamp) is part of the file bytes. If the file is uploaded, the metadata is uploaded. Our [EXIF privacy guide](/blog/exif-metadata-privacy-guide) covers exactly what is in there and how to strip it. The short version: every converter on this site strips metadata because it decodes pixels and re-encodes them, dropping everything that is not image data. 4. HTTPS protects the pipe, not the endpoint. TLS encrypts the upload in transit. It does nothing about what happens to the file after it arrives. The privacy guarantee of a browser-based converter is narrower but stronger. It says: your files do not leave your device because there is no code path for them to do so. This is verifiable. Open the Network tab in DevTools while converting a file. You will see the WASM binary load once, then nothing. Zero bytes uploaded. No requests to `/api/convert`. No WebSocket traffic. The conversion happens entirely inside the renderer process. ## Verifying This Yourself You do not need to take anyone's word for it. Open Chrome DevTools (F12), switch to the Network tab, and convert a file on any tool page. The only network activity you will see: 1. The page HTML, CSS, and JavaScript: loaded once on first visit. 2. The WASM binary (for HEIC converters): loaded once, cached thereafter. 3. Analytics requests (if you have not blocked them). No file data leaves the browser. The `Content-Length` of every request is measured in kilobytes, not megabytes. This is independently verifiable by anyone who knows how to open DevTools. The same cannot be said for a server-based service. You upload the file, you get a result, and you trust that the server deleted it. ## Related Tools Every converter on this site follows this architecture. The pipeline (drop, validate, decode, encode, download) runs identically across all 23 tools: - [HEIC to JPG](/tools/heic-to-jpg) · [HEIC to PNG](/tools/heic-to-png) · [HEIC to WebP](/tools/heic-to-webp) - [JPG to PNG](/tools/jpg-to-png) · [JPG to WebP](/tools/jpg-to-webp) · [JPG to ICO](/tools/jpg-to-ico) - [PNG to JPG](/tools/png-to-jpg) · [PNG to WebP](/tools/png-to-webp) · [PNG to ICO](/tools/png-to-ico) - [WebP to JPG](/tools/webp-to-jpg) · [WebP to PNG](/tools/webp-to-png) · [WebP to ICO](/tools/webp-to-ico) - [BMP to JPG](/tools/bmp-to-jpg) · [BMP to PNG](/tools/bmp-to-png) · [BMP to WebP](/tools/bmp-to-webp) · [BMP to ICO](/tools/bmp-to-ico) - [PDF to JPG](/tools/pdf-to-jpg) · [PDF to PNG](/tools/pdf-to-png) · [PDF to WebP](/tools/pdf-to-webp) - [Image to Text (OCR)](/tools/image-to-txt): same client-side architecture, runs Tesseract in WASM For the technical guts behind the WASM sandbox, see our [WebAssembly explainer](/blog/webassembly-explained). For a deeper look at what metadata your photos carry, the [EXIF privacy guide](/blog/exif-metadata-privacy-guide) walks through reading and stripping it byte by byte. ### How to Batch Convert Images Online Without Installing Software Published: 2026-07-28 Batch converting images means processing dozens or hundreds of files at once. Here is how browser-based tools pull this off without a server, which formats support batch workflows, and what actually happens to your files during conversion. You have 200 HEIC photos from a trip. They will not open on your Windows laptop, your web app expects JPEGs, and your photo sharing site refuses HEIC entirely. You could convert them one by one: four clicks per photo, 800 clicks total, half an afternoon gone. Or you could drop the folder into a browser tab and walk away while it processes. This is the workflow batch converters are built for, and the browser-based ones work differently from the desktop software you might have used. ## What Batch Conversion Actually Means Batch conversion is not "convert one file, repeat." A real batch pipeline does three things in parallel where possible: 1. Read: parse each file's header to confirm the format. A `.heic` extension proves nothing. The pipeline reads the first 12 bytes, checks the `ftyp` box for `heic`/`heif`/`mif1`, and rejects mismatches before touching the pixel data. 2. Decode: decompress the source into raw pixels. For HEIC files, this means running a WebAssembly build of libheif. For JPEG and PNG, the browser's native decoders handle it. This step is CPU-bound and the bottleneck. 3. Encode: compress the raw pixels into the target format. JPG encoding at quality 90, PNG with DEFLATE, WebP with the browser's built-in encoder. Desktop software does the same three steps. The difference is where the CPU cycles burn: on your machine either way, but in a browser tab there is no installer, no admin permissions, and no temporary files littering your desktop. ## Supported Format Pairs Not every format converts well to every other. The matrix that matters: | From | To JPG | To PNG | To WebP | To ICO | | ---- | ------ | ------ | ------- | ------ | | HEIC | ✓ | ✓ | ✓ | — | | JPG | — | ✓ | ✓ | ✓ | | PNG | ✓ | ✓ | ✓ | ✓ | | WebP | ✓ | ✓ | — | ✓ | | BMP | ✓ | ✓ | ✓ | ✓ | The blank entries are not missing features. HEIC-to-ICO is a nonsense conversion: a multi-megabyte photo shrunk to a 256×256 icon file loses everything that made it a photo. The tool skips pointless paths. PDF pages follow a separate pipeline. Each page renders through PDF.js to a canvas, then encodes to the target format. Our [PDF to JPG](/tools/pdf-to-jpg), [PDF to PNG](/tools/pdf-to-png), and [PDF to WebP](/tools/pdf-to-webp) converters batch-process every page automatically. ## The Workflow Step by Step ### 1. Drop Everything at Once Open the converter page. Drag a folder from your file manager onto the drop zone. You can also click to open the file picker and select multiple files; Ctrl+A works here. The drop zone reads the `FileList` object directly from the browser's drag event. No upload happens. The files stay in memory as `File` objects, which are just references to blobs on disk with a name, a size, and a MIME type guessed from the extension. ### 2. Let Validation Run Each file gets checked before decoding. For HEIC files, the validator reads the `ftyp` box as described above. For everything else, the browser's `createImageBitmap()` call either succeeds (valid image) or throws (corrupted or mislabeled file). Invalid files get flagged with a red marker and a reason: "Not a valid HEIC file," "Unsupported format," "File exceeds 200 MB." They do not block the rest of the batch. Valid files queue for processing. ### 3. Pick the Output Format Each converter page targets a specific output format. If you need HEIC to JPG, use the [HEIC to JPG](/tools/heic-to-jpg) page. Need HEIC to PNG instead? [HEIC to PNG](/tools/heic-to-png). The output format is fixed per page, which keeps the UI simple: no dropdown, no confusion. Quality settings are format-specific. JPG gives you a quality slider (10–100, default 90). PNG is always lossless, so no slider needed. WebP uses a quality slider that behaves differently from JPEG's: WebP at 80 is roughly equivalent to JPEG at 92 for photographic content. ### 4. Wait (Briefly) Processing time depends on three things: file count, file size, and your CPU. A modern laptop with 8 cores handles roughly 2–4 HEIC-to-JPG conversions per second. A folder of 200 iPhone photos finishes in under two minutes. Each file runs through `requestAnimationFrame`-split chunks so the UI stays responsive. The progress bar shows file-level progress, not byte-level: each file is one tick regardless of size. ### 5. Download You get two options: Individual downloads: each converted file downloads separately. The browser's download manager handles this natively and it works everywhere. ZIP archive: all converted files packed into a single `.zip`. Built in-memory with a streaming ZIP implementation; files compress on the fly, no temporary storage needed. The original filenames carry over with the extension changed. `IMG_4021.HEIC` becomes `IMG_4021.jpg`. ## Quality and Size Trade-offs Converting formats means making choices about file size: | Conversion | Typical size change | Quality notes | | ----------------- | ------------------- | ------------------------------------------ | | HEIC → JPG (q90) | ~2× larger | Visually identical at normal zoom | | HEIC → PNG | ~5–8× larger | Lossless, but overkill for photos | | HEIC → WebP (q80) | ~1.2× larger | Smaller than JPEG at similar quality | | PNG → JPG (q90) | ~3–5× smaller | Transparency becomes white background | | BMP → JPG (q90) | ~10–20× smaller | BMP stores raw pixels; JPG compresses them | | JPG → PNG | ~5–10× larger | No quality gain; just stops further loss | HEIC to PNG is the trap people walk into. HEIC is already lossy. Converting lossy to lossless does not recover quality; it freezes the current state at 5× the file size. For photos headed to the web, HEIC to JPG or WebP is the honest path. For photos headed into an editor, PNG makes sense because it prevents generation loss on subsequent saves. The same logic applies across the board. See our [lossy vs lossless guide](/blog/lossy-vs-lossless-compression) for the full explanation. ## Browser vs Desktop vs Server | | Browser-based | Desktop software | Server/cloud | | -------------- | ---------------------------- | ------------------ | --------------------------------- | | **Install** | None | Download + install | None | | **Privacy** | Files stay local | Files stay local | Files uploaded to server | | **Speed** | WebAssembly (near-native) | Native | Network upload + queue + download | | **Batch size** | Memory-limited (~500+ files) | Disk-limited | Often capped on free tiers | | **Updates** | Always latest | Manual updates | Always latest | Browser-based converters land in the sweet spot for most people: no install, no upload, and fast enough that the difference from native is imperceptible on anything made in the last five years. The WebAssembly detail matters. The HEIC decoder is a compiled C library (libheif) running in a WASM sandbox. It has no filesystem access, no network access, and no way to send your data anywhere. The browser enforces these boundaries at the engine level, not at the application level. More on this architecture in our [WebAssembly explainer](/blog/webassembly-explained) and [browser privacy deep-dive](/blog/browser-based-conversion-security). ## When Batch Conversion Breaks A few things stop a batch run cold: - **Mixed formats in the wrong converter.** Dropping JPEGs into the HEIC-to-JPG page. The validator catches these and skips them. Rejected files get a clear label so you can redirect them to the right converter. - **Memory exhaustion on very large batches.** Processing 2,000 24 MP raw files will eventually hit browser memory limits. The fix is splitting the batch into chunks of a few hundred. For typical phone photos (12 MP, ~2 MB HEIC), 500+ files per run is fine. - **Safari's download behavior.** Safari limits concurrent downloads more aggressively than Chrome or Firefox. Individual downloads work fine. ZIP downloads work around this entirely: one file, no concurrency issues. ## Related Tools Every image converter on this site supports batch processing: - HEIC conversions: [HEIC to JPG](/tools/heic-to-jpg) · [HEIC to PNG](/tools/heic-to-png) · [HEIC to WebP](/tools/heic-to-webp) - JPG conversions: [JPG to PNG](/tools/jpg-to-png) · [JPG to WebP](/tools/jpg-to-webp) · [JPG to ICO](/tools/jpg-to-ico) - PNG conversions: [PNG to JPG](/tools/png-to-jpg) · [PNG to WebP](/tools/png-to-webp) · [PNG to ICO](/tools/png-to-ico) - WebP conversions: [WebP to JPG](/tools/webp-to-jpg) · [WebP to PNG](/tools/webp-to-png) · [WebP to ICO](/tools/webp-to-ico) - BMP conversions: [BMP to JPG](/tools/bmp-to-jpg) · [BMP to PNG](/tools/bmp-to-png) · [BMP to WebP](/tools/bmp-to-webp) · [BMP to ICO](/tools/bmp-to-ico) - PDF page extraction: [PDF to JPG](/tools/pdf-to-jpg) · [PDF to PNG](/tools/pdf-to-png) · [PDF to WebP](/tools/pdf-to-webp) No account required. No per-file charges. Drop the folder and download the results. ### OCR Under the Hood: How Computers Learn to Read Text from Images Published: 2026-07-27 To a computer, a photo of a document is just a grid of colored pixels. Turning those pixels into searchable, editable text requires a pipeline spanning image preprocessing, layout analysis, and character recognition — each step with its own decades of research. This guide walks through OCR from Otsu's binarization to Vision Transformers. Open any image in a hex editor. A photo of a street sign, a receipt, a screenshot of a PDF. At offset zero you get the format header. A few kilobytes in, you hit the pixel data: three bytes per pixel in RGB, a grid of numbers where (128, 52, 19) might be a brick wall and (240, 238, 220) might be paper. Somewhere in that grid sits a stop sign with the word "STOP" rendered in white Highway Gothic on red. A human sees four letters. The computer sees a 47 × 19 patch of red-adjacent pixel values where the R channel hovers near 200 and G and B dip below 40. Mapping that patch to the string "STOP" is optical character recognition, and it has been an open research problem since Gustav Tauschek patented the first reading machine in 1929. OCR is deceptively hard because reading is deceptively easy. A six-year-old can recognize the letter A in a dozen fonts, at multiple sizes, under uneven lighting, slightly rotated, partially occluded, and written in pencil. A computer needs a pipeline: clean the image, find the text regions, segment the characters or glyph sequences, and classify each one. Each of those stages has a failure mode, and the failures compound. ## What makes OCR hard The core problem is not classification. Classifying a pre-segmented 28 × 28 character image into one of 62 classes (A–Z, a–z, 0–9) is a task a 1990s LeNet can solve at 99% accuracy. The hard part is everything that comes before the classifier. **Font variation.** The letter "g" has at least four common structural variants: single-story ( handwritten ), double-story ( most serif faces ), the loop-tail found in Helvetica, and the open-tail in Futura. A model trained on Tahoma will misread Univers at a measurable rate. Real-world OCR covers hundreds of typefaces plus handwriting, which has no consistent stroke topology at all. **Geometric distortion.** Photos of documents are rarely flatbed scans. A phone photo of a receipt introduces perspective skew, curvature, and non-uniform scale. Text near the spine of a book bends. Whiteboard photos catch the photographer's shadow. A 10-degree skew reduces Tesseract's accuracy from ~97% to below 85% on standard benchmarks. Deskewing algorithms (Hough line detection, Radon transform, projection profile analysis) recover some of that loss, but none recover all of it. **Illumination and noise.** Uneven lighting turns a uniform background into a gradient, breaking global thresholding. JPEG compression artifacts create ringing around sharp edges. In OCR terms, that means ringing around letter strokes. Salt-and-pepper noise from low-light sensors fills white space with dark pixels that look like punctuation. A photocopy of a photocopy smears thin strokes together, merging "rn" into "m" and "cl" into "d." **Layout complexity.** Documents have columns, captions, tables, headers, footnotes, and sidebars. Text flows around images. Some languages run right-to-left. Others mix directions in the same paragraph. Identifying reading order (which block of text comes after which) is a layout analysis problem separate from recognition, and getting it wrong scrambles the output even when every character is classified correctly. **Contextual ambiguity.** Given only the pixel pattern, "0" (digit zero), "O" (uppercase letter O), and "o" (lowercase letter o) are identical in many sans-serif fonts. "1", "l", "I", and "|" share a vertical stroke. Resolution adds another dimension: at 12 pixels tall, "e" and "c" differ by a single horizontal stroke three pixels wide. Human readers resolve these from context. Machines need language models, statistical or learned, to make the same call. ## The traditional OCR pipeline Before deep learning, OCR was a sequence of hand-designed stages. Each stage was independently developed, often by different research groups, and tuned for a specific degradation. The pipeline looked like this: ``` Raw image → Preprocessing → Binarization → Deskew → Layout Analysis → Character Segmentation → Feature Extraction → Classification → Post-processing (language model) → Text output ``` ### Preprocessing and binarization Color images are converted to grayscale. Noise reduction smooths the signal before thresholding. Median filtering handles salt-and-pepper noise. Gaussian blur handles sensor noise. Bilateral filtering is used when edge preservation matters. Binarization turns the grayscale image into black text on white background. The standard algorithm is Otsu's method (1979): it exhaustively searches for the threshold that minimizes intra-class variance between foreground and background pixel distributions. Otsu assumes a bimodal histogram (text pixels cluster at one intensity, background pixels at another), which works for flatbed scans under controlled lighting and fails for phone photos with shadows. Local adaptive methods (Sauvola, Niblack) compute a different threshold per pixel based on neighborhood statistics, handling uneven illumination at the cost of artifacts near edges. ### Deskew and layout analysis Document skew is detected by finding lines: either Hough transform on edge pixels, or projection profile analysis where the document is rotated through a range of angles and the angle with the sharpest horizontal projection peaks is chosen. Once the skew angle is known, an affine transform rotates the image back. Layout analysis segments the page into text blocks. The classic approach runs connected-component analysis (CCA) to find blobs of foreground pixels, groups them into words by proximity, then groups words into lines and lines into blocks. The XY-cut algorithm recursively splits the page by finding whitespace gaps along horizontal and vertical projections, building a tree of regions. Modern implementations use a hybrid: CCA for initial blobs, then a learned model to classify each blob as text, image, table, or separator. ### Character segmentation For machine-printed text, segmentation means cutting word images into individual characters. The vertical projection profile (a histogram of foreground pixel counts per column) produces peaks at character centers and valleys at character boundaries. This works until two characters touch, or one character contains disconnected parts ("i", "j", ":", "%"). Over-segmentation (cutting too aggressively) followed by merging based on classifier confidence is one fix. Another is to skip segmentation entirely and recognize entire words, which is what modern sequence-based methods do. ### Feature extraction and classification Once you have a character image, you need to describe it numerically for a classifier. Pre-deep-learning features included: - **Raw pixel values** as a flattened vector (simple, fragile to translation and scale) - **Zoning**: divide the character bounding box into an N × N grid, count foreground pixels per cell, use the counts as features - **Gradient-based features (HOG)**: histogram of oriented gradients captures edge directions, robust to small translations - **Scale-invariant feature transform (SIFT)**: detects and describes keypoints invariant to scale, rotation, and illumination The classifier was typically a support vector machine (SVM) with an RBF kernel, trained on tens of thousands of labeled character images per font. A well-tuned SVM + HOG pipeline could hit ~98% per-character accuracy on clean printed text. Drop noisy, skewed, or handwritten input into the same pipeline, and accuracy fell to 70–80%. ## Tesseract: from HP Labs to LSTM Tesseract is the reference open-source OCR engine. It began as a PhD project at HP Labs Bristol in the 1980s, was open-sourced in 2005, and has been maintained by Google since 2006. Its architecture split cleanly into two eras. ### Version 3: the classic pipeline Tesseract 3 implemented the traditional pipeline with a few innovations. Its layout analysis used a tab-stop detection algorithm that found column boundaries by aligning word bounding boxes, a pragmatic heuristic tuned for the kind of documents HP was scanning in the 1990s. Character segmentation used chopper/associator logic: the chopper over-segmented the word image into candidate cuts, and the associator used classifier confidence and a dictionary to decide which cuts to merge. The classifier was a two-pass system. The first pass (static classifier) matched segmented blobs to prototypes (clustered training samples) using a nearest-neighbor search. The second pass (adaptive classifier) fine-tuned on the document itself, learning the specific font used in that image. The adaptive classifier needed roughly a page of text to become effective, which is why Tesseract 3 performed poorly on single-word images like street signs and captions. Tesseract 3 shipped `.traineddata` files: archives containing the prototype clusters, character set definitions, a word-frequency dictionary, and a unichar ambiguity table mapping confusable character pairs. Training a new language required feeding Tesseract images of text paired with ground-truth transcriptions, boxing each character, and running the training tools. A multi-hour process per language. ### Version 4/5: LSTM replaces the pipeline Tesseract 4 (2018) replaced the entire recognition path with a single LSTM neural network. The LSTM operates on a sequence of vertical slices of the text line image, each slice one pixel wide and the full text-line height. Each slice is fed into a stack of bidirectional LSTM layers. The output is a sequence of character probabilities with a Connectionist Temporal Classification (CTC) loss that aligns the variable-length output sequence to the ground-truth text without requiring pre-segmented character positions. The LSTM model handles variable-width characters, touching characters, and font variation without the chopper/associator machinery. It still relies on Tesseract's legacy layout analysis for finding text lines, but the line recognition is end-to-end neural. On the ICDAR 2017 benchmark, Tesseract 4 achieved 4.4% character error rate (CER) on printed English, compared to 7.2% for Tesseract 3. The training process switched from the legacy boxing tool to combining text lines with transcriptions. Still supervised, but with one label per line instead of per character. The `.traineddata` format was extended to hold the LSTM model weights (several megabytes) alongside the legacy data (dictionary, unichar tables) in a single file. Training a fast LSTM model from scratch takes roughly 24 hours on a modern GPU for a Latin-script language with ~100 character classes; CJK languages take longer due to larger character sets. ### Accuracy characteristics Tesseract 5 improved on version 4 with a larger training corpus and better default parameters, but the architecture is unchanged. Accuracy is heavily input-dependent: | Input condition | Tesseract 4 CER | Tesseract 5 CER | | ------------------------------------------ | --------------- | --------------- | | Clean 300 DPI scan, English, single column | 2.1% | 1.8% | | 150 DPI mobile photo, English | 5.8% | 4.9% | | Clean scan with mixed fonts | 7.3% | 6.1% | | Historical document (irregular type) | 18.4% | 16.2% | | Handwriting (IAM dataset) | 28.7% | 26.3% | The LSTM model removes most of the font-sensitivity problems of version 3, but the engine still degrades on low resolution (below 200 DPI, the LSTM's pixel-slice input loses stroke detail), handwritten text (the model was trained on printed fonts; handwriting has fundamentally different stroke statistics), and complex layouts (layout analysis is still the legacy code path, not the neural one). ## Modern deep learning approaches Academically, OCR moved past the CTC + LSTM paradigm around 2019. Three architectures now dominate the literature. ### CRNN + CTC The Convolutional Recurrent Neural Network (CRNN), published by Shi et al. in 2015, pairs a CNN feature extractor with an RNN sequence model and CTC decoding. The CNN extracts spatial features from the image, essentially learning what the LSTM in Tesseract was given by hand (vertical slice representations). The RNN models sequence dependencies across the extracted features. CTC handles the alignment. CRNN-CTC became the standard baseline: trainable end-to-end, good generalization, fast inference (~20 ms per line on GPU). ### Attention-based encoder-decoder Attention-based models adapted the seq2seq paradigm from machine translation. A CNN or vision encoder produces a feature map of the image. An RNN decoder generates the output text one character at a time, attending to relevant spatial regions of the feature map at each step. The attention mechanism removes the monotonic constraint of CTC: the decoder can jump back to earlier parts of the image when the language model expects a repeated pattern, though this flexibility also introduces hallucination risk for illegible input. Attention-based decoders achieve ~1.5–3% CER on clean printed English, outperforming CTC-only models on long sequences and irregular layouts. ### Vision Transformers (TrOCR, Donut) TrOCR (Microsoft, 2021) applied the Transformer architecture to OCR. The image is split into patches, encoded by a ViT (Vision Transformer) encoder, and the text is decoded autoregressively by a Transformer text decoder. It is the architecture of a standard multimodal model, trained specifically for OCR. TrOCR achieves state-of-the-art results on printed text (sub-1% CER on clean scans) without any CNN preprocessing, explicit language model, or character-level segmentation. Donut (NAVER, 2022) extended the approach to document understanding: the input is a full document image, and the output is structured JSON extracted directly from the visual features, skipping the OCR → NLP pipeline entirely. This blurs the line between OCR and document parsing in a way that matters for real applications: extracting an invoice total, a passport number, or a table from a research paper becomes a single model call instead of OCR + regex + heuristics. ### Performance comparison (printed English, clean 300 DPI) | Method | CER | Inference speed (lines/sec) | Training data required | | --------------------- | ---- | --------------------------- | ---------------------- | | Tesseract 3 (classic) | 7.2% | ~2 (CPU) | ~100K char images | | Tesseract 5 (LSTM) | 1.8% | ~15 (CPU) | ~500K text lines | | CRNN + CTC | 2.5% | ~120 (GPU) | ~2M text lines | | Attention seq2seq | 1.8% | ~60 (GPU) | ~2M text lines | | TrOCR (ViT + decoder) | 0.8% | ~20 (GPU) | ~10M text lines | | Donut (ViT + decoder) | 1.2% | ~15 (GPU) | ~12M document images | The gap between Tesseract and the best Transformer models is real on benchmarks. In practice, the gap narrows because most deployed systems feed Tesseract clean, well-lit, 300 DPI input, and on that input, 1.8% CER means one wrong character in every 55. Acceptable for search indexing, less so for a legal document transcript. ## Non-English OCR: why it's harder English OCR is a solved problem. A character set of 26 uppercase letters, 26 lowercase, 10 digits, and a handful of punctuation gives roughly 70 classes. A multi-class classification problem comfortably within the capacity of a 1990s LeNet. The rest of the world's writing systems are less forgiving. ### CJK: character set explosion Chinese, Japanese, and Korean (CJK) represent the hardest OCR challenge by character set size alone. Simplified Chinese uses roughly 3,500 common characters and 6,000+ in general text. Traditional Chinese adds another thousand variant forms. Japanese mixes two syllabaries (hiragana, katakana: 46 characters each) with ~2,000 common kanji plus Latin alphanumerics in the same sentence. Korean hangul is phonetically regular (24 basic letters combining into syllabic blocks), but visually dense: a single block can contain up to six individual jamo components packed into a space roughly the size of two Latin characters side by side. A CJK OCR system cannot treat recognition as a 70-way classification. It is a 4,000-way classification for Japanese, 6,000-way for Simplified Chinese, and over 10,000-way for Traditional Chinese, at minimum. The softmax output layer alone has more parameters than an entire Latin-script OCR model. Training data needs scale with the character set: ~100 labeled samples per class for acceptable accuracy, so Chinese training sets start at 600,000 text-line images. Tesseract provides CJK traineddata files (`chi_sim`, `chi_tra`, `jpn`, `kor`), but they are significantly larger than Latin models. `chi_sim.traineddata` is ~50 MB versus ~15 MB for `eng.traineddata`, and recognition is slower because the output space is larger. Accuracy on clean printed CJK text runs at 2–5% CER for Tesseract 5, roughly 2–3× the error rate for English under equivalent conditions. ### Arabic and right-to-left scripts Arabic adds two problems beyond the character set (28 letters with contextual forms that change based on position within a word). First, it is written right-to-left, so the OCR engine must detect text direction and reverse the output order. Second, Arabic is cursive. Letters within a word connect via a baseline stroke, making segmentation inherently harder than with the mostly disconnected letter forms of Latin and Cyrillic scripts. An Arabic word image is one contiguous blob; character-based segmentation is effectively impossible, which is why the LSTM/CTC approach (which operates on word images without character segmentation) was a larger breakthrough for Arabic OCR than for English OCR. Hebrew, Urdu, Farsi, and Pashto share some combination of these challenges. Tesseract provides Arabic traineddata, but accuracy is roughly 5–8% CER on clean printed text, about 4× worse than English under the same conditions. ### Indic scripts: the conjunct problem Devanagari (Hindi, Marathi, Nepali) and other Brahmic scripts represent a distinct challenge: the writing unit is not the character but the conjunct, a visually fused cluster of a consonant, a vowel modifier, and sometimes an additional consonant. The Unicode Devanagari block has 128 code points, but the number of possible conjuncts exceeds 1,000. The "shirorekha" (the horizontal headline connecting characters in a word) makes segmentation harder because the headline merges adjacent characters into one visual unit. Tesseract's Hindi traineddata (`hin`) covers the common conjuncts but accuracy trails English by 3–4× on printed text. Tamil, Telugu, Bengali, and other Indian scripts are less well supported, with some lacking official traineddata files entirely. The root cause is training data volume: high-quality annotated text-line images for Hindi exist in the millions, while for Kannada the available datasets number in the tens of thousands. ### Vertical text and mixed-direction layouts Japanese and Traditional Chinese are sometimes set vertically, with lines running top-to-bottom and columns running right-to-left. Tesseract's layout analysis assumes horizontal text; vertical text requires pre-rotation or a separate engine. Mixed horizontal and vertical text on the same page, common in Japanese newspapers and manga, breaks the single-direction assumption entirely and requires region-level direction detection before recognition. ### Small languages and training data For languages with fewer than 10 million speakers, high-quality OCR training data rarely exists. The Unicode consortium has encoded over 150 scripts, but Tesseract ships traineddata for roughly 120 languages, many of them generated from synthetic text rendered with standard fonts on clean backgrounds. Synthetic data works for printed text in common fonts and fails for the fonts, papers, and printing quality found in actual documents from those languages. A model trained on synthetic Arial at 300 DPI will not read a 1970s typewritten Amharic document. ## Browser-side OCR with Tesseract.js Running OCR in the browser was impractical until WebAssembly shipped. Tesseract.js compiles Tesseract 5 (LSTM) to WebAssembly via Emscripten, wrapping the C++ engine in a JavaScript API that runs a Web Worker per recognition task. The engine, language data, and worker are loaded from static assets. No server round-trip for image data. The API surface is straightforward: create a worker with one or more language codes, feed it an image, get back recognized text with per-character confidence scores. Multiple workers can run in parallel, limited by available CPU cores. Typically four parallel recognition jobs on a consumer laptop, six to eight on recent phones. Performance is bounded by three factors. First, WebAssembly runs at roughly 50–70% of native speed; a text line that takes 100 ms in native Tesseract takes about 160 ms in the browser. Second, the traineddata files are loaded over the network. `eng.traineddata` is ~15 MB, `chi_sim.traineddata` is ~50 MB, and both must be fully downloaded before recognition begins. Third, image decoding (JPEG/PNG/WebP/HEIC to raw pixel data) uses the browser's built-in decoders, which are fast but vary by format and device. The privacy advantage is structural. Client-side OCR means the image never leaves the device. A photo of a passport, a bank statement, a medical record. The pixels are decoded in the browser, the Textract equivalent runs in a Web Worker, and the result is a string of text that the user can copy or save. No data center processes the image. That is not a feature; it is the absence of a server, which is categorically different from a privacy policy promising not to look. Our [Image to Text](/tools/image-to-txt) tool runs exactly this stack: Tesseract.js with LSTM recognition, Web Workers for parallel processing, and traineddata for 12 languages (English, Spanish, French, German, Portuguese, Italian, Chinese Simplified and Traditional, Japanese, Korean, Hindi, and Russian). Drop a photo, select languages, get text. The tool reads JPEG, PNG, WebP, BMP, and GIF input, applies resolution-aware prescaling (images above 3,000 pixels on the longest side are downscaled to keep recognition latency reasonable), and outputs plain text per image with per-character confidence available. Image format choice affects OCR quality in practice. HEIC photos from iPhones, converted to JPEG before OCR, pick up compression artifacts around text edges that reduce recognition accuracy. Converting HEIC to PNG first (lossless, no quantization artifacts) preserves the sharp edges that the LSTM relies on. Our [HEIC to JPG](/tools/heic-to-jpg) and [HEIC to PNG](/tools/heic-to-png) converters handle this preprocessing step directly in the browser. Similarly, photos taken in low light benefit from converting to a format that preserves the full tonal range before thresholding: [JPG to PNG](/tools/jpg-to-png) avoids the second-generation JPEG artifacts that accumulate when a JPEG source is re-encoded. The browser OCR stack is not competitive with GPU-accelerated server-side models on throughput. A server running Tesseract on 32 CPU cores with native C++ will always outrun a browser tab. It wins on privacy, zero infrastructure, and zero cost per request. For scanning a few pages, a receipt, or a handful of signs, the latency difference between 200 ms and 50 ms is invisible. ## Where OCR is going OCR stopped being a standalone research field around 2022 and merged into the broader document AI and multimodal model space. Three shifts are underway. **Multimodal LLMs as zero-shot OCR.** GPT-4V, Claude, and Gemini can read text from images without explicit OCR training. Feed a photo of a document and ask for the text, and the model returns it. Not because it has a dedicated OCR head, but because text recognition emerges from training on billions of image-text pairs. The quality is uneven. On clean printed English, GPT-4V achieves ~1% CER, comparable to a fine-tuned TrOCR. On low-resolution phone photos of Chinese receipts, it can outperform Tesseract because the model leverages context (it knows what a receipt looks like and what numbers to expect) rather than relying on pixel-level evidence alone. On handwriting, it is worse than a fine-tuned recognizer because the training distribution did not include enough handwritten images. The trade-off is cost and latency. An API call to GPT-4V for OCR costs 1–3 cents per page depending on token count and takes 1–3 seconds. Tesseract runs locally in 100–500 ms and costs nothing per page. For scanning a 200-page document, the difference is $2–6 and several minutes of wall-clock time versus zero and under a minute. For one-off use (a single receipt, a whiteboard photo), the multimodal model is simpler and often more accurate. **On-device inference.** The models behind server OCR are shrinking. ONNX Runtime Web runs quantized CRNN and small ViT models in the browser at 50–100 ms per text line on WebGPU. Apple's Vision framework ships a compact OCR model on-device for iOS and macOS, accessible via `VNRecognizeTextRequest` with no network call. The gap between "server GPU model" and "browser model" is closing because both are converging on the same architectural sweet spot: a small ViT encoder (~20–50M parameters) with a lightweight decoder, quantized to INT8 or FP16. **Document understanding, not just transcription.** The output of OCR is a string. Most real-world tasks involve extracting structured information from that string: invoice numbers, dates, totals, names, addresses. The traditional approach chains OCR with regex, named entity recognition, and schema mapping. Each stage is a separate model with its own failure modes. End-to-end document understanding models (Donut, LayoutLMv3, Pix2Struct) skip OCR and map document images directly to structured outputs. A Donut model fine-tuned on receipts does not produce a text transcript and then parse it. It produces `{"total": "42.50", "date": "2026-07-27", "vendor": "..."}` directly from pixel input. The OCR step, the part this article is about, becomes an invisible implementation detail. That does not make OCR obsolete. It makes it a building block. The pipeline still needs to handle the edge cases: the receipt photographed at an angle in a dark restaurant, the 50-year-old typewritten document on yellowed paper, the sign in a language for which no large multimodal model was trained. Specialized OCR engines trained on those specific distributions will outrun and outperform a general-purpose model for years, because a general-purpose model trained on the entire internet allocates a vanishingly small fraction of its capacity to reading 1970s Amharic typewriter output. OCR is not a solved problem for most of the world's languages and most real-world imaging conditions. It is a solved problem for clean, 300 DPI, English, single-column, machine-printed text — the narrowest and best-funded slice of the problem space. The rest is still open. ### Choosing Web Image Formats in 2026: JPEG's Empire, AVIF's Rise, and JPEG XL's Exile Published: 2026-07-27 One photo exported six ways spans 24 MB to 1.7 MB, and that gap is the whole argument. JPEG still rules the web it was built for in 1992, WebP is the safe default, AVIF is the rising replacement, JPEG XL deserved better, and HEIC was never a candidate. This guide compares all eight formats with verified mid-2026 browser support and Web Almanac usage data, then ends with a decision table. Take one 12 MP photo (4000 × 3000 pixels) and export it six ways. PNG: **24 MB**. JPEG at quality 90: **3.4 MB**. WebP at matched visual quality: about **2.4 MB**. AVIF at matched visual quality: about **1.7 MB**. GIF, dithered down to its 256-color ceiling: **6 MB**, with visible banding everywhere. SVG is not on the list: it describes drawings, and a photograph is not one. Same image on the screen, a 14× spread on disk. That gap is engineering, not taste. Every format is a set of decisions made under the constraints of a specific year, and those decisions still show up in your page weight today. This is the decision version of that experiment: what each format actually does to your pixels, which browsers decode it in mid-2026, what the web is really serving, and a table at the end you can paste into a team wiki. ## The contenders, one at a time **JPEG (1992).** The mechanism: split the image into 8 × 8 blocks, transform each block into frequencies with the discrete cosine transform, then quantize the fine detail toward zero under a model of human vision. Strengths: it decodes on every device built since the mid-90s, encodes fast, and is excellent on continuous-tone photos. Weaknesses: no transparency, no animation, visible ringing around sharp edges and text, and quality that compounds downward with every re-save. Suits photographs, and anything that must open absolutely everywhere. **PNG (1996).** The mechanism: fully lossless. Each scanline is filtered with a predictor, then packed with DEFLATE, the same LZ77 plus Huffman pairing inside gzip. Strengths: pixel-exact output, full alpha, universal support. The weakness is photos: sensor noise defeats the predictor, so a 12 MP shot compresses maybe 1.5:1 over raw pixels. Suits screenshots, UI captures, diagrams, and anything with text or flat color. **GIF (1987).** The mechanism: LZW compression over a palette of at most 256 colors, with multiple frames packed into one file. Its one remaining strength is animation that plays everywhere, including email clients that lack support for modern formats. The weaknesses are everything else: 256 colors, one-bit transparency, and files that dwarf the equivalent video. Suits memes and small UI loops. **SVG (2001).** The mechanism: none, in the raster sense. SVG is XML that describes shapes, paths, and gradients, and the renderer draws pixels at whatever resolution the screen needs. Strengths: resolution independent, tiny for geometric art, styleable with CSS. Weaknesses: it only works for content that is genuinely vector, and pathological files with thousands of nodes and heavy filters can cost more than a bitmap. Suits logos, icons, charts, and diagrams. **WebP (2010).** The mechanism: the lossy mode borrows intra-frame prediction from the VP8 video codec, and the lossless mode uses spatial prediction plus LZ77-style backward references. Strengths: both modes in one format, alpha in lossy mode, animation, and files 25 to 34% smaller than JPEG at matched quality in Google's own study. Weaknesses: a hard 16383 × 16383 pixel limit and an encoder that costs more CPU than libjpeg. Suits almost everything, which is why it became the default upgrade path for JPEG, PNG, and GIF on the web. **AVIF (2019).** The mechanism: still frames from the AV1 video codec, wrapped in the HEIF container. Strengths: the best lossy compression you can ship in a browser, roughly 50% smaller than JPEG at matched quality in Netflix's 2020 testing, plus 10-bit and 12-bit color, HDR, alpha, and animation. Weaknesses: encoding is genuinely slow, there is no progressive rendering (the image pops in all at once or not at all), and very low quality settings smear texture in a way JPEG's honest blocking does not. Suits photographs and hero images, where file size matters most. **HEIC (2015).** The mechanism: HEVC still frames, also in a HEIF container. Strengths: compression in AV1's league and the default capture format on every iPhone since 2017. The weakness is legal rather than technical: HEVC is wrapped in patent pools, and every browser vendor except Apple declined to pay. It belongs in camera rolls, not on the web. **JPEG XL (2021).** The mechanism: two engines under one roof, VarDCT for lossy work and a modular mode for lossless, plus a trick no other format has. It can recompress an existing JPEG losslessly to about 80% of its original size, bit-exact pixels included. Strengths: progressive decoding, excellent lossless ratios, high-fidelity photography. The weakness is adoption, which is mostly a story about browser politics, covered below. Suits photography pipelines and archives, and on Apple devices, the web. ## Browser support, mid-2026 Versions where each format switched on by default, per caniuse data: | Format | Chrome | Edge | Firefox | Safari | | ------- | ----------------------------- | -------------- | ------------- | --------------- | | WebP | 32 (Jan 2014) | 18 (Nov 2018) | 65 (Jan 2019) | 14 (Sep 2020) | | AVIF | 85 (Aug 2020) | 121 (Jan 2024) | 93 (Oct 2021) | 16.4 (Mar 2023) | | JPEG XL | 145, behind a flag (Feb 2026) | none | behind a flag | 17 (Sep 2023) | | HEIC | none | none | none | 17 (Sep 2023) | Three details in this table are worth noting. AVIF on iOS technically arrived in Safari 16.0 but without animation; 16.4 is where full support lands on both macOS and iOS. Edge shipped AVIF years after Chrome even though Edge is Chromium, because Microsoft kept the decoder disabled longer than Google did. And the JPEG XL row hides an unusual story, which gets its own section below. Global coverage, per caniuse's 2026 numbers: WebP sits around 97%, AVIF around 93 to 94%. JPEG and PNG sit at effectively 100%, and that is unlikely to change. ## The compatibility hierarchy Grouped by reach, the formats fall into five tiers. Tier one is the universal set: JPEG, PNG, GIF, and SVG. They decode in every browser, every email client, every OS preview pane, and every decade-old kiosk. If a file absolutely must open, it ships in one of these four. Tier two is WebP, alone. The last major holdout was Safari, and Safari 14 closed that gap in September 2020. What remains is Internet Explorer installs and ancient Android WebViews. For a website, as opposed to an email, WebP has been a safe default for about five years. Tier three is AVIF. Chrome had it in 2020, Firefox in 2021, Safari in 2022 (full support in March 2023 with 16.4), and Edge defaulted it on in January 2024. Since early 2024, every major engine decodes AVIF out of the box. The remaining few percent is older iPhones and unmanaged Windows fleets, which is what fallbacks are for. Tier four is JPEG XL, stuck. Apple ships it natively since Safari 17 in September 2023. Google removed Chromium's experimental decoder in late 2022, effective with Chrome 110 in February 2023, then reversed course and merged a Rust-based decoder (jxl-rs) that shipped in Chrome 145 in February 2026, still behind a flag. Firefox has had a decoder behind a flag for years. So JPEG XL support in mid-2026 means all Apple users plus the vanishing fraction of Chrome and Firefox users who flip flags, a group too small to build on. Tier five is HEIC: Safari 17 on Apple platforms, nothing else anywhere. That is less a tier than a single-vendor ecosystem. ## What the web actually serves Support is not usage. The HTTP Archive's Web Almanac crawls millions of real pages and counts what they serve, and the 2024 edition (the latest with full media data) reads like a glacier moving. JPEG was still the single most common format at 32% of all images, but that is down eight full points from 40% in 2022. WebP picked up three of those points to reach 12%. SVG gained about two. AVIF reached roughly 1%, which sounds like a rounding error until you read it relatively: almost 4× growth in two years. ICO held 1.3%, almost all of it favicons. And GIF, 37 years old, somehow gained a point. Why does it move this slowly? Three frictions do most of the work. CDN caching: images sit at the edge keyed by URL, and swapping formats means invalidating caches and re-encoding entire libraries. Old devices: the support chart says 97%, but the missing 3% is concentrated in cheap Android phones and corporate fleets, and some sites cannot afford to lose a single sale to a broken image. Tooling inertia: the CMS generates JPEG thumbnails because it always has, the design tool exports PNG because that is the big button, and changing the default means touching a build pipeline nobody owns. There is also encode cost. AVIF's compression advantage is paid for in CPU at encode time, which is why image CDNs charge for it and why smart teams pre-generate AVIF at build or upload time rather than on the fly. ## Where this is heading AVIF is the safest bet for the next few years. It is royalty-free by design (the Alliance for Open Media was founded in 2015 by Amazon, Cisco, Google, Intel, Microsoft, Mozilla, and Netflix explicitly to escape HEVC-style patent pools), it handles lossy and lossless in one spec, it carries HDR, and it crossed the support threshold where a fallback chain costs almost nothing. The real costs are encode time and the lack of progressive decode. Pre-generation solves the first; the second is a fair trade. JPEG XL deserved a better outcome than it got. On technical merit it is the most complete format ever standardized: progressive decoding, the best lossless mode, high-bit-depth photography, and lossless recompression of the entire existing JPEG corpus. Google pulled it from Chromium citing insufficient ecosystem interest, and the restoration request became one of the most-starred issues in the Chromium tracker's history. Three years later Google reversed the decision, but by then the adoption window had largely closed. While JPEG XL sat in exile, AVIF collected the CDN integrations, the CMS plugins, and the default checkboxes. JPEG XL will live on as the archivist's favorite and as a first-class citizen on Apple devices. It had the technical case for mainstream adoption and still missed it. HEIC will not become a web format. The reason has nothing to do with quality. HEVC decoding requires patent licenses that vendors of free browsers have declined to pay for a decade, and the web runs on royalty-free technology. A format that three of the four major engines will not decode is not a web format; it is an export problem you solve at the boundary. The transition technique, meanwhile, is well established, and it takes two forms. Server-side content negotiation: the browser sends an Accept header listing what it can decode, and the server or CDN picks the best variant for the same URL. Client-side: the `` element, which lists candidates and lets the browser take the first one it understands: ```html Team photo ``` The `` at the bottom is the universal fallback, so nothing breaks anywhere. This is how you serve AVIF to the 93% and JPEG to the rest without maintaining two sites. ## The decision table | Use case | Serve | Why | | -------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------ | | Photos | AVIF, with WebP and JPEG fallbacks | Photos are where the largest byte savings are | | Screenshots, UI captures | PNG, or lossless WebP | Text and sharp edges must stay pixel-exact | | Logos and icons | SVG, with PNG fallback | Vectors scale to any density; rasterize last | | Short animations on a page | Video (MP4/WebM) first, GIF only for maximum reach | Animated WebP and AVIF work in browsers, but video compresses far better | | Favicons | ICO for maximum reach, PNG or SVG for modern browsers | ICO is a container that can hold PNG frames | A short favicon note, because the table row leaves out some detail. Modern browsers accept PNG and even SVG favicons, but ICO remains the one format every crawler, RSS reader, and ancient browser tab understands, and an ICO file can bundle several sizes in one container. If your logo currently lives in another format, [JPG to ICO](/tools/jpg-to-ico), [WebP to ICO](/tools/webp-to-ico), and [PNG to ICO](/tools/png-to-ico) produce a proper multi-size ICO directly in your browser. ## Converting between formats Most conversion chores fall out of the sections above. The most common one by far is getting HEIC out of an iPhone and into something the rest of the world can open. [HEIC to JPG](/tools/heic-to-jpg) is the right move for sharing, since HEIC is already lossy and JPEG keeps the damage from compounding. [HEIC to PNG](/tools/heic-to-png) freezes the current state for editing, and [HEIC to WebP](/tools/heic-to-webp) makes sense when the destination is a website. Then there is the JPEG, PNG, WebP triangle. Moving a JPEG into a design workflow: [JPG to PNG](/tools/jpg-to-png), not because it gains quality (it cannot) but because it stops losing more. Shrinking it for the web: [JPG to WebP](/tools/jpg-to-webp). Going the other way for older software: [WebP to JPG](/tools/webp-to-jpg) and [WebP to PNG](/tools/webp-to-png). A PNG screenshot headed for a photo gallery: [PNG to JPG](/tools/png-to-jpg), or [PNG to WebP](/tools/png-to-webp) when you want smaller files and the transparency kept. If you inherit uncompressed BMP scans, [BMP to JPG](/tools/bmp-to-jpg), [BMP to PNG](/tools/bmp-to-png), and [BMP to WebP](/tools/bmp-to-webp) all beat emailing multi-megabyte relics around. Even documents hit the same fork: [PDF to JPG](/tools/pdf-to-jpg) for photographic pages, [PDF to PNG](/tools/pdf-to-png) when the text must stay crisp, and [PDF to WebP](/tools/pdf-to-webp) when the page is headed for the web. Every one of those tools runs the conversion locally in your browser, so the file never leaves your device. Formats keep changing. The rule does not: match the codec to the content, and convert when the content changes jobs. ### EXIF Metadata: A Technical Guide to the Privacy Leak in Your Photos Published: 2026-07-17 Every photo from a phone or camera carries a second file inside it: shooting settings, timestamps, serial numbers, and often GPS coordinates. Here is the byte-level structure of EXIF, how to inspect it, how it exposes you, and how format conversion wipes it. Take a photo on an iPhone and open the JPEG in a hex editor. A few hundred bytes past the `FF D8` start marker, you find this: ``` FF E1 1C 24 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08 ``` `FF E1` is the APP1 segment marker. The two bytes after it are the segment length. Then six bytes spell `Exif\0\0`, and right behind them sits a TIFF header (`4D 4D 00 2A` means big-endian). Your JPEG is carrying a second, smaller file inside it, one that often reveals more about you than the image itself. ## What EXIF Actually Is EXIF stands for Exchangeable Image File Format. JEIDA (Japan Electronic Industry Development Association) published version 1.0 in 1995. JEITA and CIPA maintain the standard today; EXIF 3.0 arrived in 2023. Structurally, EXIF is a TIFF. After the `Exif\0\0` header comes a byte-order marker, then a chain of Image File Directories (IFDs). Every IFD entry is twelve bytes: ``` Bytes 0-1: Tag ID (e.g. 0x010F = Make) Bytes 2-3: Data type (ASCII, rational, short, long) Bytes 4-7: Value count Bytes 8-11: Inline value, or an offset to it ``` Two subdirectories matter for privacy. The EXIF SubIFD (pointed to by tag `0x8769`) holds camera settings, serial numbers, and timestamps. The GPS IFD (tag `0x8825`) stores latitude and longitude as three rational numbers each: degrees, minutes, seconds. There is usually a thumbnail stored in IFD1 as well, a small JPEG embedded in the metadata. Hold that thought; it matters later. Which containers carry EXIF: | Format | EXIF location | Notes | | ------- | --------------------------- | ---------------------------- | | JPEG | APP1 segment | Where EXIF started | | HEIC | `Exif` item in the meta box | iPhone default since iOS 11 | | WebP | `EXIF` chunk inside VP8X | Optional, often absent | | PNG | `eXIf` chunk | Added to the spec in 2017 | | TIFF | The file itself is TIFF | The parent format of EXIF | | BMP/ICO | Not supported | No metadata structure at all | ## Why Cameras Started Writing It The mid-90s problem was mundane and practical. Digital cameras produced files with zero context. Film photographers had negatives, lab envelopes with processing dates, and notes. Digital shooters had a directory full of `DSC_0042.JPG` files and nothing else. EXIF solved three concrete needs: - Exposure records. Aperture, shutter speed, ISO, and focal length, so a photographer could review why a shot worked and repeat it. - Print ordering. DPOF (Digital Print Order Format) let you mark photos on the camera and have a kiosk print them later, using EXIF fields like rotation. - Orientation and preview. The Orientation tag keeps portrait shots upright, and the embedded thumbnail made camera LCD browsing fast. Notice the assumption underneath all of this: photos stay with their owner. EXIF was designed for a world where a photo moved from CF card to hard drive to print kiosk. Nobody at JEIDA in 1995 was planning for a world where you upload a dozen photos a day to public servers. ## What Is Actually Inside Open any phone photo in a metadata reader and the tag list runs long. The fields that matter for privacy: | Tag | Example value | What it reveals | | ----------------------------------- | -------------------------- | ---------------------------- | | Make / Model | Apple, iPhone 15 Pro | Your hardware | | BodySerialNumber / LensSerialNumber | Unique per device | A fingerprint of your camera | | DateTimeOriginal + OffsetTime | 2026:06:30 18:42:11 +09:00 | When, down to the second | | GPSLatitude / GPSLongitude | 37°46'29" N, 122°25'10" W | Where, within meters | | GPSAltitude | 14.2 m | Which floor, roughly | | Software | Instagram, Photoshop 26.1 | What touched the file | | Artist / Copyright | Free text | Sometimes a real name | | IFD1 thumbnail | A second JPEG | A copy of the unedited image | `exiftool` output from a real iPhone photo, trimmed for brevity: ``` $ exiftool IMG_4021.HEIC Make : Apple Camera Model Name : iPhone 15 Pro Serial Number : F2LX8A1BCD Date/Time Original : 2026:06:30 18:42:11 GPS Latitude : 37 deg 46' 29.28" N GPS Longitude : 122 deg 25' 10.41" W GPS Altitude : 14.2 m Above Sea Level ``` Thirty seconds of reading, and a stranger knows what you shoot with, when you were there, and where "there" is, give or take a few meters. ## How to Read It on Your Machine ### Windows Right-click the file, open Properties, go to the Details tab. Make, model, dates, and GPS coordinates are all listed there. The same tab has a "Remove Properties and Personal Information" link at the bottom, which opens a basic stripping dialog. For raw access in PowerShell: ```powershell Add-Type -AssemblyName System.Drawing $img = [System.Drawing.Image]::FromFile("C:\photos\IMG_4021.jpg") $img.PropertyItems | ForEach-Object { $text = [System.Text.Encoding]::ASCII.GetString($_.Value).Trim([char]0) "Tag 0x{0:X4} (len {1}): {2}" -f $_.Id, $_.Len, $text } $img.Dispose() ``` Numeric fields come out as raw bytes, but ASCII tags like Make and Software print cleanly. ### macOS Open the image in Preview, then Tools, Show Inspector, and check the EXIF and GPS tabs. The GPS tab even renders a map pin. From the terminal, `mdls` lists everything Spotlight indexed: ```bash mdls IMG_4021.jpg | grep -iE "gps|latitude|longitude|model" ``` Or install ExifTool with `brew install exiftool` for the full tag list. ### Linux ExifTool is the standard: ```bash exiftool IMG_4021.jpg ``` Lighter alternatives: `exiv2 IMG_4021.jpg`, or ImageMagick's `identify -verbose IMG_4021.jpg | grep -i exif`. ### From a Browser, With Twenty Lines of TypeScript Finding the APP1 segment yourself takes a loop over the JPEG marker chain: ```typescript async function findExifSegment(file: File): Promise { const bytes = new Uint8Array(await file.slice(0, 128 * 1024).arrayBuffer()) if (bytes[0] !== 0xff || bytes[1] !== 0xd8) return -1 // not a JPEG let offset = 2 while (offset < bytes.length - 12) { if (bytes[offset] !== 0xff) break const marker = bytes[offset + 1] const length = (bytes[offset + 2] << 8) | bytes[offset + 3] if ( marker === 0xe1 && String.fromCharCode(...bytes.slice(offset + 4, offset + 10)) === "Exif\0\0" ) { return offset } offset += 2 + length } return -1 } ``` ## How EXIF Leaks Your Privacy ### GPS Coordinates Give Away Your Location Phones record GPS whenever the camera app has location permission, which is the default most people tap through once and forget. Post a photo of your balcony, your desk, or your kid's school project to a forum or a marketplace listing, and you have published your address with meter-level precision. The famous case is John McAfee. In December 2012 he was on the run and hiding in Guatemala. Vice published a photo of him taken on an iPhone 4S, and the EXIF data held full GPS coordinates. Anyone could read exactly where in Guatemala he was. Days later he was in Guatemalan custody. ### Serial Numbers Link Your Accounts BodySerialNumber and LensSerialNumber are unique per device. Two anonymous accounts posting photos shot on the same camera can be linked with near certainty. Researchers have crawled photo sites to cluster images by camera serial for exactly this reason. You can keep your identities separate online. Your camera makes no such distinction. ### Timestamps Sketch Your Routine DateTimeOriginal, plus the timezone offset. On its own one timestamp says little, but a year of uploads shows when you wake up, when you leave home, and when you travel. ### The Thumbnail Gives You Away The IFD1 thumbnail is a separate JPEG inside the metadata. Crop a face or a document out of the main image, and plenty of editors leave the original thumbnail untouched. Whoever extracts it gets the uncropped photo. In 2003 a TechTV host posted cropped photos of herself, and readers recovered the full frames from the EXIF thumbnails. The lesson has stuck around because tools keep making the same mistake. ### Where EXIF Survives the Upload The big social platforms (Facebook, Instagram, X) strip EXIF from images at upload. Everything else mostly does not: email attachments, forum uploads, marketplace listings, cloud drive share links, AirDrop, and any messenger set to send original quality. If the file leaves your device unchanged, the metadata leaves with it. ## What Happens When You Convert Formats Converting a photo is not automatically stripping it. Converters come in two kinds: 1. Metadata copiers. Tools that re-encode but deliberately carry the tags across: ExifTool, ffmpeg, and most GUI converters with a "keep metadata" default. Run JPEG to WebP through a copier and your GPS coordinates move into the WebP `EXIF` chunk untouched. 2. Pixel re-encoders. Tools that decode to raw pixels and encode a brand new file from them. The output contains image data only, because the metadata was never part of the pixels. Stripping by hand is one command either way: ```bash # ExifTool: wipe every tag, keep the image exiftool -all= -overwrite_original photo.jpg # ImageMagick 7: re-encode without metadata magick photo.jpg -strip photo-clean.jpg ``` One detail needs care here: orientation. EXIF Orientation (tag `0x0112`) tells viewers to rotate the image, often by 90 degrees. Strip the tags without baking that rotation into the pixels, and every portrait photo comes out sideways. The correct order is decode with orientation applied, then drop the metadata. A tool that strips without rotating is worse than no stripping at all. ## What Our Converters Do With EXIF Every converter on this site is a pixel re-encoder. The pipeline is identical across all of them: 1. Decode the source file to raw pixels in your browser (a WebAssembly build of libheif for HEIC, the native browser decoder for the rest). 2. Draw the pixels to a canvas, with EXIF orientation already applied during decode. 3. Encode the canvas into the target format. The output file holds compressed pixels and nothing else. No APP1 segment, no `EXIF` or `eXIf` chunk, no GPS IFD, no serial numbers, no embedded thumbnail. There is no code path that copies metadata, because there is no metadata in memory to copy. And since the whole thing runs client-side, the file never leaves your device, so no server ever sees the original either. Pick your source format: - iPhone photos, which carry the most EXIF data: [HEIC to JPG](/tools/heic-to-jpg), [HEIC to PNG](/tools/heic-to-png), [HEIC to WebP](/tools/heic-to-webp) - JPEG: [JPG to PNG](/tools/jpg-to-png), [JPG to WebP](/tools/jpg-to-webp), [JPG to ICO](/tools/jpg-to-ico) - WebP: [WebP to JPG](/tools/webp-to-jpg), [WebP to PNG](/tools/webp-to-png), [WebP to ICO](/tools/webp-to-ico) - PNG: [PNG to JPG](/tools/png-to-jpg), [PNG to WebP](/tools/png-to-webp), [PNG to ICO](/tools/png-to-ico) Drop a file in, download the converted copy, share that instead. The pixels are identical; the metadata is gone. ## The Short Version - Before you share a photo anywhere EXIF survives (email, forums, marketplaces, direct links), check it first. Properties on Windows, Inspector on macOS, `exiftool` on Linux. - If the file carries GPS data and you would rather it did not, convert it. Every tool linked above outputs pixels only. - If you post under separate identities, camera serial numbers can link them. Stripping handles that too. - Keep your originals untouched. EXIF is genuinely useful inside your own archive. The copies you publish are the ones that should be clean. ### Lossy vs Lossless: Why Image Formats Forget on Purpose Published: 2026-07-16 Lossless compression repacks data without changing it; lossy compression changes the data first, then packs it. That single decision explains why a photo compresses 10:1 as JPEG but barely 2:1 as PNG, why JPEG was built lossy in 1992, why PNG was built lossless in 1995, and why every modern codec now ships both modes. Take the same 12 MP photo (4000 × 3000 pixels) and save it twice. Once as PNG: **24 MB**. Once as JPEG at quality 90: **3.4 MB**. Put them side by side on your screen and you cannot tell them apart. Zoom to 400% and the differences finally show up: a slight softening in hair and grass, faint halos along the sharpest edges. Two files, one image, a 7× size gap. Neither file is broken. They just made different promises. PNG promised to keep every bit. JPEG promised to keep everything you would notice. Almost everything about image formats follows from which of those two promises a format makes. ## Why compression split into two camps In 1948, Claude Shannon published "A Mathematical Theory of Communication" and gave compression a hard floor. His source coding theorem says you cannot losslessly represent data below its **entropy**, the average information content per symbol. A perfectly random image does not compress at all. A solid white image compresses to almost nothing. Every real image lands somewhere on that scale, and no lossless algorithm can go below that floor. Lossy compression exists because of a loophole. The entropy floor applies to the data you have, not the data you keep. If you first replace the image with a slightly different image, one with lower entropy, the floor drops with it. That is the entire trick: **change the data, then pack it**. The engineering question is which changes are acceptable. The answer depends on two things. First, the content. A screenshot of a settings panel is mostly flat color and repeated shapes: low entropy, easy to predict. A photo of a forest is photon shot noise and sensor read noise at the pixel level: high entropy, hard to predict. Second, the consumer. A program reading the file needs exact bits. A human looking at the file comes with built-in error tolerance: limited spatial acuity for color, poor sensitivity to fine high-frequency texture, and brightness perception that tracks ratios rather than absolutes (Weber's law, roughly 1 to 2% luminance steps). So formats split. If your content is predictable and your consumer is a machine or a pixel-peeping human, go lossless. If your content is noisy and your consumer is a human at arm's length, you can afford to forget. ## How lossy compression works People often describe lossy codecs as "throwing data away", which is true but imprecise. They throw away specific data, selected by a model of human vision. The pipeline: 1. **Convert RGB to a luma-chroma color space** (YCbCr for JPEG, similar splits elsewhere). Your eye resolves brightness detail far better than color detail, so the chroma channels can be stored at quarter resolution (**4:2:0 subsampling**). This one step cuts raw data by roughly 50% and is invisible in most photos. 2. **Transform each block into frequencies.** JPEG uses the discrete cosine transform on 8 × 8 blocks. JPEG 2000 uses wavelets. AV1 and HEVC use larger, variable-size transforms. The result is always the same shape: a few large coefficients describing broad forms, and many small coefficients describing fine texture. 3. **Quantize.** Divide every coefficient by a step size and round to an integer. Small coefficients become zero. This is the only lossy step in the whole pipeline, and the quality setting on your encoder is just a multiplier on those step sizes. Quality 95 uses small steps and keeps almost everything. Quality 30 uses large steps and zeroes out most of the fine texture. 4. **Entropy-code what survives.** Zig-zag scan, run-length encoding, Huffman or arithmetic coding. This stage is lossless. It only packs the already-quantized numbers. Read that list again. Steps 1, 2, and 4 are reversible bookkeeping. Step 3 is where the image is actually destroyed, on purpose, one rounding error at a time. The destruction has a recognizable signature. Push quality too low and you get **blocking** (visible 8 × 8 grid edges in skies and walls), **ringing** (halos around text and high-contrast edges), and **banding** (smooth gradients collapsing into steps). Re-save a lossy file and the pipeline runs again on already-damaged data, which is why **generation loss** compounds: the tenth re-save of a JPEG looks like a watercolor of the first. ## How lossless compression works Lossless codecs take no such liberties. The decoded file must match the original bit for bit, so all they can do is model and pack. The standard recipe has two stages. **Stage one: decorrelate.** PNG filters every scanline before compressing it. For each row, the encoder picks one of five predictors (None, Sub, Up, Average, Paeth) and stores the difference between the actual pixel and the prediction. A solid white row becomes a single white pixel followed by thousands of zeros. A smooth gradient becomes small, slowly varying residuals. Either way the numbers get small and cluster near zero, which is exactly what the next stage wants. **Stage two: entropy coding.** PNG uses **DEFLATE**, the same algorithm behind gzip and zip, built from two 1970s ideas. LZ77 scans for repeated byte sequences and replaces each repeat with a (distance, length) pointer into the previous 32 KB of data. Huffman coding then assigns short bit codes to frequent values and long codes to rare ones. Neither step loses anything. Given the packed stream, you can always play it back to the original bytes. This is why PNG is brilliant on screenshots and hopeless on photos. Interface graphics repeat: identical rows, repeated icons, long runs of flat color. LZ77 finds matches everywhere, and the filters turn whatever remains into near-zero residuals. A photograph repeats nothing. Shot noise makes every pixel slightly different from its neighbors, so the predictors miss, the residuals stay large and random, and LZ77 finds nothing to point at. PNG on a 12 MP photo typically manages **1.3:1 to 1.6:1** over the raw pixels. JPEG at visually similar quality gets 10:1. The payoff for those bigger files is an absolute guarantee: decode a PNG, hash the pixels, and the hash matches the source every time. For screenshots that will go through OCR, scans that will be re-edited, medical and scientific images that may end up in a paper or a courtroom, that guarantee is the whole point. ## Why JPEG bet on lossy in 1992 The Joint Photographic Experts Group started work in 1986, and the constraints of that era explain every design decision. A 20 MB hard drive cost hundreds of dollars. A 1.44 MB floppy was the standard way to move files. Modems ran at 14.4 kbps if you were lucky, which puts the download time of a single 921 KB uncompressed VGA photo at roughly nine minutes. A 10:1 lossy version arrives in under a minute. A 2:1 lossless version still takes more than four. The committee's own tests told them lossless would not go further. Photographic content, the stated target ("continuous-tone images"), simply does not contain enough redundancy. Faced with that math, they designed around the only slack left: the viewer. What is less known is that the standard they published in 1992 (ISO/IEC 10918-1) does contain a **lossless mode**. It skips the DCT entirely, predicts each pixel from up to three neighbors using one of seven fixed predictors, and entropy-codes the residuals: conceptually the same trick PNG would use three years later. Almost nobody implemented it. Decoders ignored it, encoders ignored it, and when medical imaging actually needed lossless JPEG, it got a separate standard instead (JPEG-LS, ISO/IEC 14495, 1999). The committee also had to route around patents. The arithmetic coding option in JPEG was tangled in IBM's Q-coder patents, so the royalty-free baseline settled on Huffman coding, and most implementations never touched the arithmetic path. Patent anxiety shaping codec design was not new in 1992. It was about to get much worse. JPEG was, at bottom, a psychovisual bet: the last 5× of compression is not mathematics, it is biology. ## Why PNG bet on lossless in 1995 PNG did not start as an engineering project. It started as a legal emergency. In December 1994, Unisys announced it would charge license fees for software using GIF, because GIF's compression relied on the LZW algorithm, covered by a 1985 patent Unisys had inherited. CompuServe, GIF's creator, cut a deal and passed the cost to developers. The Usenet graphics communities were furious: GIF had been free for seven years, and an entire early web's worth of images and tools suddenly sat on patented ground. Within weeks, in early January 1995, Thomas Boutell posted the first draft of a replacement. Volunteers hammered out the design on mailing lists in a matter of months. PNG 1.0 arrived in October 1996 as a W3C recommendation, then as RFC 2083 in March 1997. Two requirements were never up for debate. Every algorithm had to be patent-clean, which meant DEFLATE (the LZ77 plus Huffman combination from Phil Katz's PKZIP, implemented in zlib by Jean-loup Gailly and Mark Adler). And the format had to be lossless, full stop. The community was replacing GIF; a replacement that degraded images would have been dead on arrival, and the patent audit left no room for the perceptual tricks that made JPEG work anyway. The content mattered just as much. PNG was built for what GIF actually carried: logos, diagrams, line art, icons, screenshots. Sharp edges and flat color, exactly the content where JPEG's ringing artifacts are most visible. Chasing photos would have meant reinventing the DCT and competing with an entrenched, royalty-free JPEG. PNG picked the fight it could win, and won it completely. The GIF patent expired in 2003 (2004 outside the US), but by then PNG had already taken its job. ## Why lossy won the market anyway PNG got its niche. JPEG got the world. The reason is volume. The web's images are overwhelmingly photographs, and for photographs lossy is not a compromise but the correct tool. The 2025 Web Almanac puts JPEG at roughly **57% of all images served**, three decades in. Social feeds, news photography, product shots, real estate listings: all continuous-tone content where a quality-75 lossy encode is visually indistinguishable from the source on the screens people actually use. The economics push the same way. Storage and bandwidth are billed per byte, and 10:1 versus 2:1 is not a margin, it is a 5× difference in delivery cost at acceptable quality. Page speed follows file size, and file size follows compression. Every camera and phone ships with a lossy default (JPEG or HEIC). Every CMS generates lossy thumbnails. Social platforms re-encode every upload, partly for size, partly to strip metadata and anything malicious hiding in it. A photographer can upload a flawless TIFF; what the timeline serves is a quality-85 JPEG. Lossless did not lose so much as retreat to where its guarantee matters: screenshots and UI assets, where artifacts are instantly visible and content compresses well anyway; masters in an edit pipeline, where every lossy generation compounds; medical, legal, and scientific imaging, where "close enough" is not evidence. Inside those niches PNG and TIFF are unchallenged. They are just not where the traffic is. ## Where the formats landed | Format | Year | Modes | Where it lives | | --------- | ---- | -------------------------------------------- | -------------------------------- | | JPEG | 1992 | Lossy (a lossless mode exists, barely used) | Photos, universal fallback | | JPEG 2000 | 2000 | Both (lossy 9/7 and lossless 5/3 wavelets) | Digital cinema, archives | | PNG | 1996 | Lossless | Screenshots, UI, graphics | | GIF | 1987 | Lossless, max 256 colors | Simple animation, memes | | TIFF | 1986 | Container: raw, LZW, ZIP, or JPEG | Print, scanning, archival | | WebP | 2010 | Both | Web delivery, ~11% of LCP images | | HEIC | 2015 | Lossy in practice (HEVC has a lossless mode) | iPhone photos | | AVIF | 2019 | Both | Best lossy ratios in browsers | | JPEG XL | 2021 | Both, plus lossless JPEG recompression | Safari, Chrome behind a flag | Two trends stand out. New codecs no longer pick a side: WebP, HEIC, AVIF, and JPEG XL all ship lossy and lossless modes in a single specification, and JPEG 2000 was already doing it in 2000. The lossy-versus-lossless question moved from "which format" to "which mode". And the boundary cases keep arriving. JPEG XL can recompress an existing JPEG losslessly to about 80% of its size, a trick that is only possible because the two camps spent thirty years learning each other's math. ## Choosing in practice The decision tree is short: - Publishing a photo? Lossy. JPEG when compatibility matters, WebP or AVIF when size matters. - Saving a screenshot, logo, or anything with text and flat color? Lossless. PNG. - Editing? Keep the master lossless, export lossy copies, and never re-save a lossy file in the same format. Each generation compounds the damage. - Converting? Match the output to the job, not the input. A PNG screenshot headed for a photo gallery should become JPEG or WebP. A JPEG headed into a design file should become PNG, not because it gains quality (it cannot), but because it stops losing more. That last point trips people up with iPhone photos. HEIC is already lossy HEVC compression. Converting HEIC to PNG does not restore anything; it freezes the current state and guarantees no further loss, which is still useful if you plan to edit. For sharing, converting straight to JPEG is the honest path. Our [HEIC to JPG](/tools/heic-to-jpg), [HEIC to PNG](/tools/heic-to-png), and [HEIC to WebP](/tools/heic-to-webp) converters run the conversion locally in your browser, so the file never leaves your device. The same logic covers the rest of the matrix. Moving a JPEG into a lossless editing workflow: [JPG to PNG](/tools/jpg-to-png). Shrinking a PNG screenshot for the web: [PNG to JPG](/tools/png-to-jpg), or [PNG to WebP](/tools/png-to-webp) when you want smaller files with the transparency kept. Going the other way, [WebP to PNG](/tools/webp-to-png) and [WebP to JPG](/tools/webp-to-jpg) restore compatibility with older software. If you are stuck with uncompressed BMP scans, [BMP to JPG](/tools/bmp-to-jpg), [BMP to PNG](/tools/bmp-to-png), and [BMP to WebP](/tools/bmp-to-webp) give you the same lossy-lossless choice in one step. Even rendering documents hits the same fork: exporting a PDF page as an image means picking between [PDF to JPG](/tools/pdf-to-jpg) for photographic pages and [PDF to PNG](/tools/pdf-to-png) when the text has to stay crisp. Thirty years on, the formats that survived are the ones that knew exactly what their users could afford to forget, and what they could not. ### The birth of Markdown: why plain text won the web Published: 2026-07-09 Markdown started as a writing shortcut for web publishers. Two decades later it powers GitHub READMEs, static sites, note-taking apps, and most LLM outputs. This post traces its origins, compares it with HTML and rich document formats, weighs its real trade-offs, and looks at the tools and libraries that keep it alive across platforms and programming languages. Open any GitHub repository. The first thing you see is not the code — it is a `README.md`. That file is usually written in Markdown, and it is the single most-read document in the project. Job postings, academic papers, and legal contracts rarely live in Markdown, but an enormous amount of the web's technical writing does. Understanding why means going back to a format designed to be read before it is rendered. ## Where Markdown came from In 2004, John Gruber, a technology writer, published the Markdown syntax specification with input from Aaron Swartz. Gruber's goal was practical: he wanted a way to write for the web that looked good in plain text and could be turned into HTML later. The web at the time ran on tags. Writing a blog post meant wrapping every paragraph, list, and link in angle brackets. Gruber found that noise unnecessary for the kind of prose most people were publishing. The result was a small set of conventions: - Headings use `#` symbols. - Lists use `-` or `*`. - Links use `[text](url)`. - Emphasis uses `*text*` or `_text_`. - Code uses backticks. These conventions were borrowed from email conventions, Usenet, and plain-text habits that writers already knew. Markdown did not invent much. It just wrote the rules down. Gruber also released a reference implementation, `Markdown.pl`, a Perl script that converted the syntax to HTML. The combination of a readable source format and a deterministic output format made it easy to adopt. Writers got a file they could edit in any text editor. Publishers got clean HTML they could style with CSS. ## Markdown is not HTML This sounds obvious, but the distinction matters technically. HTML is a structured document format. It describes elements, attributes, nesting, and behavior. A browser does not care how the source looks to a human; it cares about the DOM it can build from the markup. Markdown is a writing convention. It has no DOM, no event handlers, no forms, no metadata schema beyond what frontmatter users add. It is closer to a shorthand than a markup language. When you run Markdown through a parser, the output is usually HTML, but Markdown itself is only concerned with the parts of a document that a writer types by hand: headings, paragraphs, emphasis, lists, links, images, and code. That difference shapes where each format lives: | Task | Markdown | HTML | | --------------------- | ----------------------------- | ------------------------ | | Writing a first draft | Fast, readable in any editor | Verbose, interrupts flow | | Version control diff | Clean, sentence-level changes | Noisy because of tags | | Precise layout | Weak by design | Strong | | Interactivity | None | Native | | Styling | Delegated to the renderer | Inline or CSS | HTML is the final page. Markdown is the manuscript. ## Why it spread so fast Three forces pushed Markdown from a niche Perl script into the default language of technical writing. **Version control.** As Git became standard, developers started storing documentation alongside code. Plain text won because diffs were readable. HTML and Word documents turn small edits into unreadable blobs in a diff. Markdown stayed legible. **GitHub.** In 2009, GitHub began rendering `README.md` files on repository pages. Suddenly, every project needed a Markdown file. Stack Overflow followed with Markdown for questions and answers. Developers learned the syntax because the platforms they used every day required it. **Static site generators.** Tools like Jekyll, Hugo, Gatsby, and later Next.js turned Markdown files into full websites. Writers could publish without a CMS. The source files lived in a Git repository, and a build step generated HTML. That workflow, now called docs-as-code, turned Markdown into the input format for a large slice of the modern web. Note-taking apps added the final push. Obsidian, Notion, Bear, Logseq, and iA Writer all support Markdown or a close derivative. The format escaped developer tools and became a way to organize personal knowledge. ## Will Markdown replace docx and PDF? No. The question comes up because Markdown feels clean and the other formats feel heavy, but they solve different problems. A `.docx` file is a zipped XML package built for rich editing: tracked changes, comments, styles, tables of contents, mail merge, and embedded media. It is the format of contracts, reports, and manuscripts that need round-trip editing by non-technical users. A PDF is a fixed-layout electronic paper format. It preserves fonts, spacing, and pagination across devices. That is exactly what you want for a final invoice, resume, or academic paper that should look identical everywhere. Markdown is an interchange format. It is great for drafting, versioning, and publishing to the web. It is terrible at page layout, precise typography, and print-ready output. The realistic workflow is Markdown for writing, then conversion to docx or PDF when the document needs to leave the text editor. That is also where browser-based converters become useful. When a Markdown draft needs to become a shareable PDF, our [Markdown to PDF converter](/tools/markdown-to-pdf) handles the transformation locally. If you are starting from a PDF and want editable Markdown, the [PDF to Markdown converter](/tools/pdf-to-markdown) extracts the structure without uploading your file. ## What Markdown does well — and where it breaks ### Advantages - **Readable source.** A Markdown file is almost as clean as the rendered page. You can read it in a terminal, an email client, or a phone notes app. - **Portable.** It is plain text. No proprietary vendor, no license, no binary format to corrupt. - **Diff-friendly.** Git can show exactly which sentence changed. Writers and reviewers benefit immediately. - **Tool-rich.** Every programming language has parsers. Every major platform has editors. - **Web-native.** It compiles to HTML, the actual output format of the web. ### Limitations - **Ambiguous spec.** Gruber's original spec leaves edge cases undefined. Different parsers produce different HTML for the same input. That is why CommonMark exists, but not every tool uses it. - **No layout control.** You cannot position images, set page margins, or define print styles without dropping into HTML or CSS. - **Flavor chaos.** GitHub Flavored Markdown, Pandoc Markdown, MultiMarkdown, Obsidian Markdown, and MDX all add incompatible extensions. A file written for one tool may misrender in another. - **Tables and footnotes are afterthoughts.** They are supported by extensions, not by the core syntax, and their behavior varies. The honest summary is that Markdown is good at the 90% of writing that is paragraphs, lists, links, and code. It pushes the remaining 10% onto HTML or specialized formats. ## Markdown in the AI era If you have used a large language model, you have seen Markdown. Most chat interfaces render LLM output as Markdown by default. There are practical reasons for that. First, Markdown is compact. Tokens are expensive, and a format that uses `#` instead of `

` saves space. Second, Markdown is structurally simple. Headings, lists, and code blocks are easy for a model to emit and easy for a parser to validate. Third, the training data is full of Markdown. GitHub, Stack Overflow, Reddit, and documentation sites all use it, so models learn the syntax reliably. Beyond chat output, Markdown has become the storage format for AI knowledge systems. Retrieval-Augmented Generation pipelines often chunk documents into Markdown or plain text because the structure is predictable. Vector databases, note-taking tools, and coding assistants store long-term context as Markdown files because humans can read them and machines can parse them. The risk is flavor inconsistency. One model outputs GitHub-style tables; another uses HTML for the same table. A knowledge base that mixes flavors can break when it moves between tools. Standardizing on CommonMark or a documented flavor is the only way to keep AI-generated Markdown portable. ## The future and evolution of Markdown Markdown will not become a richer format. Every attempt to make it richer — tables, footnotes, definition lists, attributes — pulls it away from the very simplicity that made it popular. The real evolution is happening in two directions. **Standardization.** CommonMark, started in 2014, defines a strict parsing specification. More tools now implement it, which reduces the surprise of moving a file from one parser to another. **Embedding.** MDX lets authors import React components inside Markdown. Jupyter notebooks mix Markdown cells with executable code. Static site generators treat Markdown as a data source for structured content. In each case, Markdown stays small, and the surrounding tool adds the power. The likely future is more of the same: Markdown as the universal plain-text draft format, with converters turning it into HTML, PDF, docx, slides, or whatever the destination requires. ## Reading and editing tools by platform You do not need a special app to use Markdown. Any text editor works. Still, some tools make the experience significantly better. ### Windows - **VS Code** with Markdown extensions: the default choice for developers. Supports previews, linting, and Markdown-it rendering. - **Typora**: a minimal WYSIWYG-style editor that hides syntax until you need it. - **MarkText**: an open-source alternative to Typora with a clean split view. - **Notepad++**: fine for quick edits, with Markdown syntax highlighting via plugins. ### macOS - **iA Writer**: focused on distraction-free writing and syntax control. - **Bear**: a notes app that uses Markdown-ish syntax for personal knowledge management. - **Ulysses**: popular among long-form writers who publish to the web. - **Marked 2**: not an editor, but a powerful live preview renderer for files edited elsewhere. ### Linux - **Ghostwriter**: a distraction-free Markdown editor with live preview. - **Apostrophe**: a clean GTK-based editor designed for prose. - **ReText**: a simple editor that exports to multiple formats. - **Vim / Neovim / Emacs**: unmatched for writers who already live in the terminal. ### Cross-platform - **Obsidian**: local-first knowledge base with linking, graphs, and plugins. - **Logseq**: outliner that stores everything as Markdown or Org files. - **Joplin**: open-source note app with end-to-end encryption and Markdown support. ## Markdown libraries by language If you are building software that parses or renders Markdown, you rarely need to write the parser yourself. The ecosystem is mature. | Language | Library | Notes | | ----------------------- | --------------------------------------------- | -------------------------------------------------------------------------- | | Python | `markdown`, `mistletoe`, `markdown-it-py` | `markdown` is the classic; `markdown-it-py` is a CommonMark-compliant port | | JavaScript / TypeScript | `marked`, `markdown-it`, `remark` / `unified` | `remark` is part of the unified ecosystem for AST-based processing | | Go | `goldmark`, `blackfriday` | `goldmark` is CommonMark-compliant and extensible | | Rust | `pulldown-cmark`, `comrak` | Fast, safe, CommonMark-focused | | Ruby | `redcarpet`, `kramdown` | `redcarpet` is GitHub-flavored; `kramdown` is the Jekyll default | | Java | `commonmark-java`, `flexmark-java` | `flexmark` supports many Pandoc-style extensions | | C# | `Markdig` | Highly extensible, used by static site generators like Statiq | Most of these libraries handle the core syntax well. The differences show up in extensions, performance, and how strictly they follow CommonMark. Choose based on the flavor you need to support, not just the language you are using. ## The bottom line Markdown did not win because it is powerful. It won because it stays out of the way. A writer can open any text editor, type a document, and commit it to version control without thinking about file formats. The trade-off is intentional: Markdown gives up layout precision in exchange for portability and readability. That trade-off is why it powers READMEs, documentation, static sites, note apps, and now AI output. It is also why it will keep living alongside docx and PDF. Each format has a job. Markdown's job is to be the plain-text starting point. When you need to move that starting point into a richer format, a converter is usually the next step. ### Markdown cheatsheet: a fast, practical tutorial Published: 2026-07-09 Markdown looks simple until you need a table, a footnote, or a strikethrough that renders the same everywhere. This post covers the core syntax, the main standards, practical examples, advanced tricks, and a printable cheatsheet. It also points to the browser-based Markdown to PDF and PDF to Markdown converters when you need to move between formats. Most documentation starts as a plain text file with a few asterisks and hash signs. That file is usually Markdown. It is not the only way to write for the web, but it is the default for READMEs, issue trackers, chatbots, and static sites because the source is readable before it is rendered. This post is a fast, practical tutorial. It assumes you have ten minutes and a text editor. No installation required. ## What Markdown is Markdown is a lightweight markup syntax. John Gruber published the original spec in 2004 with one goal: a format that looks good in plain text and converts cleanly to HTML. Since then it has become the input format for GitHub, Obsidian, Notion, many static site generators, and most large language model outputs. The core idea is simple. You mark structure with punctuation instead of tags: ```markdown # This is a heading This is a paragraph. - This is a list item - This is another one ``` A parser turns that into HTML. Different parsers support different extensions, which is where the standards come in. ## Markdown standards matter Markdown has no single official standard. Gruber's original spec leaves gaps, so different tools filled them in incompatible ways. If you write a table in one app and paste it into another, it may break. Know which flavor you are targeting. - **CommonMark.** A strict, well-tested specification started in 2014. It defines core syntax precisely. If you want portability, write CommonMark. - **GitHub Flavored Markdown (GFM).** Adds tables, task lists, strikethrough, fenced code blocks, and autolinks. This is what you see in GitHub READMEs and issue comments. - **Pandoc Markdown.** Adds citations, footnotes, definition lists, subscripts, superscripts, and math. Common in academic writing. - **Obsidian / Quarto / MDX.** These add wiki links, callouts, executable code cells, or embedded components. They are powerful but not portable. For most daily work, GFM is the safest target. For long-form documentation that may move between tools, CommonMark plus a documented extension set is better. ## Markdown basics ### Headings Use one to six hash signs. One is the largest. ```markdown # Heading 1 ## Heading 2 ### Heading 3 ``` ### Paragraphs and line breaks Separate paragraphs with a blank line. End a line with two spaces or a backslash to force a line break. ```markdown This is the first paragraph. This is the second. ``` ### Emphasis ```markdown _italic_ or _italic_ **bold** or **bold** **_bold and italic_** ~~strikethrough~~ (GFM only) ``` ### Lists Unordered lists use `-`, `*`, or `+`: ```markdown - Item one - Item two - Nested item ``` Ordered lists use numbers: ```markdown 1. Step one 2. Step two 3. Step three ``` The numbers do not have to be correct. Markdown renumbers them on render. Still, use sequential numbers so the source is readable. ### Links and images ```markdown [Link text](https://example.com) [Link with title](https://example.com "Title") ![Alt text](https://example.com/image.png) ``` For internal links, use relative paths: ```markdown [Convert Markdown to PDF](/tools/markdown-to-pdf) ``` ### Code Inline code uses single backticks: `` `console.log("hi")` ``. Code blocks use triple backticks: ````markdown ```python def hello(): return "hello" ``` ```` ```` Add a language identifier after the opening backticks so syntax highlighters can do their job. ## Common tricks and examples ### Blockquotes ```markdown > This is a quote. > It can span lines. ```` You can nest them: ```markdown > Outer quote > > > Nested quote ``` ### Horizontal rules ```markdown --- ``` Use three or more dashes, asterisks, or underscores on a line by themselves. ### Task lists GFM supports checkboxes: ```markdown - [x] Write the draft - [ ] Review the tables - [ ] Publish the post ``` They render as disabled checkboxes in HTML. Do not use them as a substitute for real form inputs. ### Escaping characters Prefix Markdown characters with a backslash when you want them literally: ```markdown \*not italic\* \# not a heading ``` ## Advanced tricks and examples ### Tables Tables are a GFM extension, not part of the original Markdown spec. ```markdown | Feature | CommonMark | GFM | | ---------- | ---------- | --- | | Tables | No | Yes | | Task lists | No | Yes | ``` Alignment is optional: ```markdown | Left | Center | Right | | :--- | :----: | ----: | | A | B | C | ``` Keep tables simple. Nested tables, row spans, and column spans are not standard and often fail. ### Footnotes Pandoc and some GFM parsers support footnotes: ```markdown Here is a statement.[^1] [^1]: This is the footnote text. ``` If you need footnotes in a rendered PDF, use a converter that supports Pandoc-style syntax or embed them manually. ### Math Pandoc and many modern editors support LaTeX math: ```markdown Inline math: $E = mc^2$ Block math: $$ \int_a^b f(x) \, dx = F(b) - F(a) $$ ``` Math rendering depends on the parser and the output format. HTML usually needs MathJax or KaTeX. PDF converters often need a LaTeX backend. ### Definition lists Another Pandoc extension: ```markdown Term : Definition of the term. Another term : Another definition. ``` ### HTML inside Markdown When Markdown falls short, you can drop into HTML: ```markdown

This is red text.

``` This works for layout, embedded video, or attributes that Markdown does not support. It also kills portability, so use it sparingly. ## When to convert Markdown Markdown is great for writing and version control. It is not great for final documents that must look identical everywhere. That is why converters exist. If you have a Markdown draft that needs to become a shareable PDF, use the [Markdown to PDF converter](/tools/markdown-to-pdf). It runs in the browser, so your file never leaves your machine. If you have a PDF and need editable Markdown, use the [PDF to Markdown converter](/tools/pdf-to-markdown). It extracts headings, lists, and paragraphs without uploading anything to a server. ## Markdown cheatsheet | Element | Syntax | Example output | | --------------- | -------------- | --------------------------- | | Heading 1 | `# H1` | H1 | | Heading 2 | `## H2` | H2 | | Heading 3 | `### H3` | H3 | | Bold | `**bold**` | **bold** | | Italic | `*italic*` | _italic_ | | Strikethrough | `~~text~~` | ~~text~~ | | Inline code | `` `code` `` | `code` | | Link | `[text](url)` | [text](https://example.com) | | Image | `![alt](url)` | image | | Blockquote | `> quote` | blockquote | | Unordered list | `- item` | list item | | Ordered list | `1. item` | list item | | Horizontal rule | `---` | horizontal rule | | Code block | ` ```lang ` | syntax-highlighted block | | Task list | `- [ ] task` | checkbox | | Table | `\| a \| b \|` | table | Print this table, tape it to your monitor, and you will rarely need to look up Markdown syntax again. ## Final notes Markdown rewards restraint. Use the core syntax for 90% of what you write. Reach for tables, footnotes, and HTML only when the document actually needs them. If you stick to CommonMark or GFM, your files will move between editors, platforms, and converters without surprises. ### How to convert PDF pages to images: a practical guide Published: 2026-07-03 PDF pages don't always fit where you need them. This guide covers when to convert PDF to images, the trade-offs of each approach, native OS methods, and code examples in five languages. A frontend developer gets a 40-page brand guidelines PDF and needs to drop three specific pages into a Figma board. A support engineer wants to paste a diagram from a datasheet into a Slack thread. A lawyer needs to attach a signed contract page to an email without sending the whole file. PDF is built for fixed-layout documents. The web, image editors, and chat apps are built for pixels. Converting a PDF page to an image bridges that gap, but the method you pick changes the output quality, file size, and how much control you keep. ## Why PDF is both great and annoying for this PDF stores pages as a stream of drawing commands: place this glyph, draw this vector, render this image at this size. That makes it resolution-independent and visually consistent. It also means a PDF is not an image. To turn it into one, something has to render those commands onto a raster canvas. The good parts: - Text and vectors stay sharp at any zoom level because they are described mathematically, not stored as pixels. - A single PDF can hold hundreds of pages in one file. - Fonts, color profiles, and annotations travel with the document. The hard parts: - PDF readers disagree on rendering. The same page can look slightly different in Adobe Acrobat, Preview, Chrome, or a headless library. - Scanned PDFs are just images wrapped in PDF containers, so "converting" them means re-encoding, which can add artifacts or bloat. - Complex PDFs with transparency, layers, or interactive forms may flatten unpredictably. - Page dimensions vary. A US Letter page at 72 DPI is 612 by 792 pixels. At 300 DPI it is 2550 by 3300. If you do not specify the resolution, you may get something unusable. ## What people actually convert PDFs into Most conversion tasks fall into one of three output formats. Each has a different job. | Format | Best for | Trade-off | | -------- | ---------------------------------------------------- | --------------------------------------------- | | **JPG** | Photos, previews, email attachments, web galleries | Lossy, but small file sizes | | **PNG** | Screenshots, diagrams, anything needing transparency | Lossless, larger than JPG for photos | | **WebP** | Modern web, apps, anywhere bandwidth matters | Smaller than JPG/PNG, slightly less universal | Then there are the practical dimensions: - **Single page vs. batch.** One page is easy. A folder of invoices needs automation. - **DPI.** 150 DPI is fine for thumbnails. 300 DPI is standard for print and OCR. 600 DPI is overkill unless you are zooming into fine details. - **Color space.** RGB is safe for screens. CMYK PDFs converted to RGB can shift colors if the conversion is naive. ## Picking the right approach The right tool depends on what you are optimizing for. ### Fast, browser-based conversion If you just need a page as a JPG, PNG, or WebP and the file is not sensitive enough to require a server, a browser-based converter is the quickest path. Our [PDF to JPG](/tools/pdf-to-jpg), [PDF to PNG](/tools/pdf-to-png), and [PDF to WebP](/tools/pdf-to-webp) tools render the PDF locally. The file never leaves your device, which matters for contracts, IDs, and medical records. ### Command-line batch work For folders of PDFs or CI pipelines, a command-line tool wins. You get repeatable output, DPI control, and scripting. ### In-application conversion When conversion is part of a product, calling a library is usually cleaner than shelling out to a CLI tool. It removes an external dependency and gives you error handling that matches the rest of your codebase. ## Converting on Windows ### Adobe Acrobat 1. Open the PDF and go to the page you need. 2. Choose **File > Export to > Image > JPEG/PNG/TIFF**. 3. Set the output resolution in the export dialog. 4. Save. Acrobat gives reliable output, but it is not free and not scriptable without the paid SDK. ### PDF-XChange Editor A lighter alternative with a free tier. **File > Export > Export Pages as Images** lets you pick format, DPI, and page range. ### PowerShell with pdftoppm Install Poppler for Windows, then use `pdftoppm` from PowerShell: ```powershell pdftoppm -jpeg -r 300 input.pdf output ``` This produces `output-1.jpg`, `output-2.jpg`, and so on, one per page, at 300 DPI. For PNG with transparent backgrounds: ```powershell pdftoppm -png -r 300 input.pdf output ``` For a single page: ```powershell pdftoppm -jpeg -r 300 -f 1 -l 1 input.pdf output ``` The `-f` and `-l` flags set first and last page. ### PowerShell with ImageMagick ImageMagick can render PDFs, but on Windows it usually delegates to Ghostscript under the hood: ```powershell magick -density 300 input.pdf[0] output.jpg ``` The `[0]` means the first page. Without it, ImageMagick may try to produce a multi-frame image. ## Converting on macOS ### Preview 1. Open the PDF in Preview. 2. Select the page thumbnail you want. 3. Choose **File > Export**, pick the format, and set the resolution. Preview is fast and private, but it handles one page at a time. ### Terminal with sips macOS includes `sips`, but it does not render PDF text well. Use it only for PDFs that are already bitmaps: ```bash sips -s format jpeg input.pdf --out output.jpg ``` For real PDF rendering, install Poppler via Homebrew: ```bash brew install poppler pdftoppm -jpeg -r 300 input.pdf output ``` ### Automator quick action You can build a right-click service in Automator that runs `pdftoppm` on any selected PDF. This is useful if you convert pages regularly and do not want to remember flags. ## Converting on Linux Poppler is usually the best choice on Linux. ```bash sudo apt install poppler-utils pdftoppm -jpeg -r 300 input.pdf output pdftoppm -png -r 300 input.pdf output ``` For WebP output, convert to PNG first and then use `cwebp`: ```bash pdftoppm -png -r 300 input.pdf temp cwebp temp-1.png -o output.webp ``` ### Batch conversion If you have a folder of PDFs and want one image per first page: ```bash for f in *.pdf; do pdftoppm -jpeg -r 300 -f 1 -l 1 "$f" "${f%.pdf}" done ``` ### ImageMagick ImageMagick works on Linux but is often slower for PDFs because it rasterizes through Ghostscript: ```bash magick -density 300 input.pdf[0] -quality 90 output.jpg ``` Set `-density` before reading the PDF. Putting it after will not help. ## Converting with code ### TypeScript / Node.js Use `pdfjs-dist` to render pages to a canvas, then export to image data. ```typescript import * as pdfjsLib from "pdfjs-dist" import { createCanvas } from "canvas" import fs from "fs" async function pdfPageToPng( pdfPath: string, pageNumber: number, outputPath: string, scale: number = 2 ) { const data = new Uint8Array(fs.readFileSync(pdfPath)) const pdf = await pdfjsLib.getDocument({ data }).promise const page = await pdf.getPage(pageNumber) const viewport = page.getViewport({ scale }) const canvas = createCanvas(viewport.width, viewport.height) const context = canvas.getContext("2d") await page.render({ canvasContext: context, viewport }).promise const buffer = canvas.toBuffer("image/png") fs.writeFileSync(outputPath, buffer) await pdf.destroy() } await pdfPageToPng("input.pdf", 1, "output.png", 2) ``` The `scale` value maps roughly to DPI: a scale of `2` at 72 DPI gives 144 DPI output. For 300 DPI, use a scale of about `4.17`. In the browser, our [PDF to PNG](/tools/pdf-to-png) converter does the same render-to-canvas step without sending the file anywhere. ### PHP PHP can shell out to `pdftoppm` or use libraries like `spatie/pdf-to-image`, which wraps ImageMagick: ```php setPage(1) ->setOutputFormat('png') ->saveImage('output.png'); ``` If you prefer not to add a dependency, call Poppler directly: ```php org.apache.pdfbox pdfbox 3.0.2 ``` `renderImageWithDPI` takes a zero-based page index and a DPI value. ### Python Python makes this easy with `pymupdf` or `pdf2image`. With `pymupdf`: ```python import fitz doc = fitz.open("input.pdf") page = doc[0] mat = fitz.Matrix(2, 2) pix = page.get_pixmap(matrix=mat) pix.save("output.png") ``` The `Matrix` controls scale. For roughly 300 DPI from a 72 DPI PDF, use `fitz.Matrix(300/72, 300/72)`. With `pdf2image`, which wraps Poppler: ```python from pdf2image import convert_from_path images = convert_from_path("input.pdf", dpi=300, first_page=1, last_page=1) images[0].save("output.jpg", "JPEG", quality=90) ``` `pdf2image` is convenient but requires Poppler installed on the system. ## Common pitfalls - **Forgetting DPI.** Default PDF rendering is often 72 or 96 DPI. At that resolution, text looks fuzzy. Always specify the output DPI if quality matters. - **Ignoring color space.** A CMYK PDF converted to RGB without a profile can look washed out or oversaturated. - **Re-encoding scanned PDFs.** If the PDF is already a JPEG scan, converting it to PNG will not recover lost detail. It will just make the file larger. - **Font substitution.** Headless servers sometimes lack the fonts embedded in the PDF. The renderer substitutes, and layout breaks. Embedding fonts when creating the PDF prevents this. - **Page numbering off by one.** Code APIs usually use zero-based page indexes. Command-line tools usually use one-based. ## What to use where - **One-off personal use:** Preview on macOS, a PDF reader on Windows, or a browser converter. - **Batch processing on a server:** `pdftoppm` or `pdf2image`. - **Inside a product:** Apache PDFBox for Java, `pymupdf` for Python, `pdfjs-dist` for TypeScript. - **Privacy-sensitive files:** Use a browser-based tool so the PDF never leaves the device. If you want the fastest path without installing anything, our [PDF to JPG](/tools/pdf-to-jpg), [PDF to PNG](/tools/pdf-to-png), and [PDF to WebP](/tools/pdf-to-webp) converters run entirely in the browser. ### A short history of PDF: why the document format won Published: 2026-07-03 PDF solved a simple problem: a document should look the same on every device. This post traces the format from John Warnock's 1991 Camelot Project to ISO 32000, explains why it beat rival formats, and covers the strengths, weaknesses, and future of the Portable Document Format. A print shop in 1993 receives a file on a floppy disk. It is a Microsoft Word document with embedded clip art and a custom font the shop does not own. They open it. The margins collapse, the bullets turn into squares, and the logo floats to the next page. The customer picks up the job the next day and refuses to pay. This was a daily problem. Every document format before PDF assumed the receiver had the same software, fonts, and printer as the sender. PDF fixed that by describing a page exactly the way it would print, then packaging the fonts and images inside the file itself. ## What PDF actually is PDF stands for Portable Document Format. At its core, it is a container file that stores a fixed description of one or more pages. Each page is defined as a stream of drawing commands: move here, draw this glyph in this font, place this image at this size. The result looks the same on a LaserWriter, a Windows PC, or a fax machine. A PDF file can carry its own fonts, color profiles, vector graphics, raster images, metadata, annotations, form fields, digital signatures, and JavaScript. It can be linearized so a web browser shows the first page before the whole file downloads. It can be tagged so screen readers know what is a heading and what is a caption. The format is not just a frozen image. It is a structured binary file built on the same imaging model as PostScript, Adobe's earlier page-description language. ## Where PDF came from John Warnock, Adobe's co-founder, started the project that became PDF. In 1991 he wrote an internal paper called "The Camelot Project" describing a system where any document could be viewed and printed reliably on any machine. The idea was to solve the chaos of incompatible word processors, spreadsheets, and desktop publishing tools. Adobe released the first PDF specification and Acrobat software in 1993. The early years were slow. The Acrobat Reader was not free at first, and the web barely existed. Microsoft Office did not export PDF until 2007. For a long time, PDF was mostly a professional printing and publishing format. Two events changed its trajectory. In 2008, Adobe released the PDF specification as an open standard under ISO 32000. That meant anyone could write software that read or wrote PDF without paying Adobe. Then smartphones and email attachments made cross-platform document sharing normal, and PDF was already the safest way to do it. ## Why PDF exists Before PDF, sending a document meant sending a promise. A Word file promised that the receiver had the right fonts, the right version, and the right printer driver. A PostScript file promised the receiver had a PostScript interpreter. A plain text file promised the receiver did not care about layout. PDF removed those promises. The file carries everything it needs to render. A PDF created on a Mac in 1998 still opens correctly on a Linux machine in 2026. That stability is the whole point. The format also solved archiving. Paper records decay. Digital records rot faster because software changes. PDF/A, a strict subset of PDF, was designed for long-term preservation. It forbids features that depend on external resources, requires fonts to be embedded, and locks the visual appearance so future software cannot reinterpret the layout. ## Where PDF is used today PDF has become the default container for anything that must look the same everywhere: - **Legal and government filings**: courts, tax agencies, and contract workflows rely on fixed-layout documents. - **Medical records**: PDF/A is a common archive format for patient files and imaging reports. - **Academic publishing**: most journals distribute papers as PDF because equations and figures must stay intact. - **Invoices and receipts**: businesses generate PDFs from templates so formatting does not drift. - **Forms**: PDF supports fillable fields, checkboxes, and digital signatures. - **E-books**: fixed-layout books, textbooks, and comics often use PDF instead of reflowable EPUB. - **Page extraction**: when you need a page from a PDF as an image, tools like [PDF to JPG](/tools/pdf-to-jpg), [PDF to PNG](/tools/pdf-to-png), and [PDF to WebP](/tools/pdf-to-webp) convert locally without uploading the file. That last point matters for privacy. PDFs often contain contracts, IDs, or financial records. Converting them in the browser keeps the data on the user's device. ## Other document formats and how they compare PDF is not the only option. Each format optimizes for something different. | Format | Strength | Weakness | | ----------------- | ------------------------------- | --------------------------------------- | | DOCX / ODT | Easy to edit | Layout shifts across versions and fonts | | HTML | Reflows to any screen | Print layout is unpredictable | | EPUB | Built for e-readers | Reflowable text breaks fixed designs | | PostScript | Precise printer control | Not interactive, no built-in fonts | | XPS | Microsoft's fixed-layout answer | Never gained wide adoption | | DjVu | Excellent scanned documents | Niche support, poor editing | | TIFF / PNG images | Pixel-perfect visuals | Not searchable, huge file sizes | | Plain text | Universal and tiny | No formatting at all | PDF sits in the middle. It preserves visual fidelity better than editable formats and remains smaller and more useful than a folder of images. ## Why PDF became the industry standard Several factors locked PDF into place. First, Adobe gave it away. Acrobat Reader became free in 1994, and Adobe pushed hard to get it pre-installed on computers and bundled with browsers. By the time competitors appeared, users already knew how to open a PDF. Second, operating systems adopted it. macOS renders PDF natively. iOS and Android can open PDFs out of the box. Windows added a built-in reader. The format became invisible infrastructure. Third, ISO standardization removed legal risk. Companies could build PDF support into their products without negotiating a license. Fourth, PDF solved a real problem that no rival solved as completely. Word documents drift. HTML pages reflow. Images are static. PostScript is printer-only. PDF combined the fixed page of PostScript with the portability of a self-contained file. ## Pros and cons of PDF | Aspect | Advantage | Limitation | | ----------- | ---------------------------------------------- | ----------------------------------------- | | Fidelity | Looks identical on almost any device | Hard to adapt to small screens | | Portability | Self-contained with embedded fonts | Binary format needs a reader | | Archiving | PDF/A preserves visual appearance for decades | Must follow strict rules to be valid | | Security | Supports encryption, redaction, and signatures | Passwords and permissions can be bypassed | | Search | Text is selectable if properly encoded | Scanned PDFs need OCR to be searchable | | Editing | Difficult to edit by design | Good for final copies, bad for drafts | ## The inconvenient parts of PDF PDF is great for finished documents and frustrating for everything else. Editing a PDF usually means buying software or accepting a clunky free tool. Text extraction often breaks because PDF stores characters by position, not by reading order. Copy a paragraph from a two-column layout and the lines may interleave. Export a table and the columns collapse into one. Forms are another pain. PDF form fields look simple but behave inconsistently across readers. Submitting a filled PDF form sometimes requires an email client or a server script that stopped working years ago. Scanned PDFs are particularly bad. They look like documents but are actually images. Without OCR, you cannot search, copy, or resize the text. The file sizes can also balloon when users scan at 600 dpi in color for a black-and-white invoice. Mobile reading is awkward. A PDF page is a fixed rectangle. Zoom in to read the text and you scroll horizontally every line. Reflowable formats handle phones better. ## The future of PDF PDF is not going away. ISO 32000-2, also called PDF 2.0, was published in 2017 and updates the format for modern use. It improves unicode handling, digital signatures, and accessibility tagging. The bigger shift is how we use PDFs. Cloud services now convert, merge, split, and sign PDFs inside a browser. PDF parsers power invoice extraction, contract analysis, and automated data entry. Machine learning systems read PDFs as part of document pipelines. Accessibility is also improving. Tagged PDFs, structured headings, and alternative text make the format less hostile to screen readers. Regulators in the EU and US increasingly require accessible PDFs for government documents. The format will probably outlive many of the applications that create it. That is the strange victory of PDF: it solved a 1990s problem so completely that the solution became invisible. ### How to convert BMP to JPG, PNG, and WebP: a practical guide Published: 2026-06-25 BMP is easy to read but bulky to store. This guide covers native OS tools, command-line workflows, and code examples in five languages for converting BMP to JPG, PNG, or WebP. A 1920 × 1080 BMP saved at 24 bits weighs just under 6 MB. The same image as a quality-90 JPEG is usually under 500 KB. That roughly ten-to-one gap is why BMP files still show up in legacy scanners, medical software, and Windows internals. It is also why they usually need to be converted before they can be used anywhere else. BMP's real advantage is simplicity. Converting it well means knowing when that simplicity helps, when it gets in the way, and which target format fits the job. ## Why BMP still exists BMP stores pixels with minimal header overhead. No Huffman tables, no DEFLATE state machine, no chroma subsampling. For embedded systems, legacy Windows tools, and any situation where the whole task is "read the header, copy the bytes," that simplicity is useful. The same limitations are what pushed it out of everyday use: - **No effective compression.** Uncompressed BMPs are large. RLE variants exist, but they rarely beat modern codecs. - **No reliable alpha channel.** The 32-bit BMP alpha byte is inconsistently supported across tools. - **Bottom-up row order.** Most BMPs store rows from the bottom of the image upward, which adds a small conversion step for anything expecting top-down data. - **No metadata ecosystem.** No EXIF, no ICC profile support in the classic header, no animation. For archival or compatibility, BMP is fine. For web, email, mobile, or storage efficiency, it needs to become something else. ## Picking the right output format Before running a command or writing code, decide what you are optimizing for. | Target | Use when | Trade-off | | -------- | ---------------------------------------------------- | ------------------------------------------- | | **JPG** | Photographs, previews, any screen display | Lossy, but file sizes are tiny | | **PNG** | Graphics, screenshots, anything needing transparency | Lossless, larger than JPG for photos | | **WebP** | Modern web, apps, anywhere bandwidth matters | Smaller than JPG/PNG, broad browser support | If you are converting a scanned document with text and diagrams, PNG keeps edges sharp. If you are converting a photo from a legacy device, JPG or WebP is the right call. For web delivery, WebP usually wins on size. Our browser-based [BMP to JPG](/tools/bmp-to-jpg), [BMP to PNG](/tools/bmp-to-png), and [BMP to WebP](/tools/bmp-to-webp) converters handle all three cases locally, and the file never leaves your device. ## Converting on Windows ### Paint 1. Open the BMP in Paint. 2. Choose **File > Save as**. 3. Select **JPEG picture**, **PNG picture**, or **WebP image**. 4. Save. Paint works for one-off files. It offers no quality control and no batch option, so it is not practical for folders of images. ### PowerShell (ImageMagick) Install ImageMagick from the official installer, then: ```powershell magick input.bmp output.jpg magick input.bmp output.png magick input.bmp output.webp ``` For batch conversion in a folder: ```powershell Get-ChildItem *.bmp | ForEach-Object { magick $_.FullName ($_.BaseName + ".jpg") } ``` ### PowerShell without external tools Windows 10 and 11 include the .NET imaging stack. This works for BMP to JPG and PNG, but not WebP without an extra library: ```powershell Add-Type -AssemblyName System.Drawing $img = [System.Drawing.Image]::FromFile("input.bmp") $img.Save("output.jpg", [System.Drawing.Imaging.ImageFormat]::Jpeg) $img.Dispose() ``` ## Converting on macOS ### Preview 1. Open the BMP in Preview. 2. Choose **File > Export**. 3. Pick the format from the dropdown. 4. Adjust quality for JPEG if needed. Preview is fast and private, but like Paint it handles one file at a time. ### Terminal with sips `sips` is built into macOS and supports BMP, JPEG, PNG, and TIFF: ```bash sips -s format jpeg input.bmp --out output.jpg sips -s format png input.bmp --out output.png ``` WebP requires ImageMagick or `cwebp` from the `webp` Homebrew package: ```bash brew install webp # cwebp does not read BMP directly, so convert to PNG first sips -s format png input.bmp --out temp.png cwebp temp.png -o output.webp rm temp.png ``` ### Batch shell loop ```bash for f in *.bmp; do sips -s format jpeg "$f" --out "${f%.bmp}.jpg" done ``` ## Converting on Linux ### ImageMagick ```bash sudo apt install imagemagick magick input.bmp output.jpg magick input.bmp output.png magick input.bmp output.webp ``` Adjust JPEG quality: ```bash magick input.bmp -quality 90 output.jpg ``` ### Batch conversion ```bash for f in *.bmp; do magick "$f" "${f%.bmp}.jpg" done ``` If you only need the smallest possible WebP output, use `cwebp` directly: ```bash for f in *.bmp; do cwebp -q 85 "$f" -o "${f%.bmp}.webp" done ``` ## Converting with code When you need conversion inside an application, pipeline, or backend service, calling a library is usually cleaner than shelling out to ImageMagick. ### TypeScript / Node.js Use `sharp`. It handles BMP input and outputs JPG, PNG, and WebP. ```typescript import sharp from "sharp" async function convertBmp( input: string, output: string, format: "jpg" | "png" | "webp" ) { await sharp(input) .toFormat(format, format === "jpg" ? { quality: 90 } : undefined) .toFile(output) } await convertBmp("input.bmp", "output.jpg", "jpg") await convertBmp("input.bmp", "output.png", "png") await convertBmp("input.bmp", "output.webp", "webp") ``` In the browser, where you cannot run `sharp`, our [BMP to WebP](/tools/bmp-to-webp) converter uses WebAssembly to decode and encode entirely on the client. ### PHP PHP has built-in image functions if the GD extension is enabled. ```php { const buffer = await file.slice(0, 2).arrayBuffer() const bytes = new Uint8Array(buffer) return bytes.length === 2 && bytes[0] === 0x42 && bytes[1] === 0x4d } ``` ### Python ```python def is_bmp(path: str) -> bool: with open(path, "rb") as f: return f.read(2) == b"BM" ``` ### Go ```go func isBmp(path string) bool { f, err := os.Open(path) if err != nil { return false } defer f.Close() buf := make([]byte, 2) if _, err := f.Read(buf); err != nil { return false } return bytes.Equal(buf, []byte("BM")) } ``` ### PHP ```php function isBmp(string $path): bool { $header = file_get_contents($path, false, null, 0, 2); return $header === "BM"; } ``` ### ImageMagick CLI ```bash magick identify -verbose image.bmp | grep "Format:" # Format: BMP (Microsoft Windows bitmap image) ``` Or simply: ```bash file image.bmp # image.bmp: PC bitmap, Windows 3.x format, 1920 x 1080 x 24 ``` ## The future of BMP BMP is a finished format. The core specification has not changed in any meaningful way since the Windows 95 era. That is both a limitation and a guarantee: a BMP written in 1995 still opens correctly today. The format will not grow new features. It will not get better compression, proper alpha handling, or animation support. Nobody is investing in BMP because nobody needs a better BMP. PNG, WebP, AVIF, and HEIC have already won every context where efficiency matters. But BMP will survive in the places where it already lives: Windows internals, embedded displays, legacy medical equipment, and classrooms. It is unglamorous and inefficient, but impossible to remove because too many systems know how to read it. If you have legacy BMP files that need to work on modern devices, convert them. Photographs become much smaller as JPEG or HEIC. Graphics with transparency work better as PNG or WebP. When bridging the Apple ecosystem, converting HEIC to a universally readable format is the first step. Our [HEIC to JPG converter](/tools/heic-to-jpg) runs in the browser, so the file stays on your device. For lossless output with transparency, use [HEIC to PNG](/tools/heic-to-png). For web-optimized sizes, [HEIC to WebP](/tools/heic-to-webp) produces smaller files with broad browser support. BMP's staying power came from simplicity and inertia: it is simple enough that every system implements it, and entrenched enough that no one removes it. ### WebAssembly explained: what it fixes and where it falls short Published: 2026-06-16 WebAssembly is not a replacement for JavaScript. It is a compact binary instruction format that lets browsers run code compiled from C, C++, Rust, and other languages at near-native speed. This post covers the limitations of pure web apps, what WebAssembly solves, its trade-offs, common use cases, and why client-side HEIC conversion depends on it. Drop a HEIC photo into a browser converter. The file is a container holding HEVC-encoded image data — the same H.265 compression used for 4K video. Your browser has no built-in HEVC decoder, and writing one from scratch in JavaScript would be slow, fragile, and enormous. The decoder you actually need is libheif, a C++ library maintained by strukturag. WebAssembly is what lets that C++ decoder run inside the browser tab. That one example captures the whole idea. WebAssembly is not a new programming language and it is not a JavaScript replacement. It is a portable binary instruction format and a sandboxed execution environment that runs inside the browser alongside JavaScript. ## What WebAssembly actually is WebAssembly (Wasm) is a W3C standard. It defines a compact, binary instruction format and a stack-based virtual machine. You do not usually write Wasm by hand; you compile to it from C, C++, Rust, Go, Zig, C#, or a growing list of other languages. The result is a `.wasm` module that the browser downloads, validates, and executes inside a memory-safe sandbox. All major browsers have supported WebAssembly since 2017. The module format is designed to be: - **Compact**: binary, so it parses faster than equivalent JavaScript source. - **Fast**: ahead-of-time compiled to machine code by the browser. - **Safe**: each module gets an isolated linear memory with bounds checks. - **Language-agnostic**: any language that can target the Wasm instruction set can run on the web. ## The limits of the traditional web JavaScript is a good language for user interfaces, network requests, and glue code. It is dynamically typed, garbage-collected, and JIT-compiled. Those properties make it flexible, but they also make it unpredictable for heavy compute. A garbage collection pause can freeze a UI thread in the middle of an animation. JIT warm-up means the same code can run at different speeds at different moments. For numeric or bitwise work — image decoding, video encoding, cryptography, physics simulation, large matrix operations — JavaScript is often an order of magnitude slower than the same logic compiled from C or Rust. The other limitation is ecosystem lock-in. Decades of image, audio, video, and scientific libraries are written in C and C++. Rewriting them in JavaScript is not a realistic way to bring that capability to the web. ## Why WebAssembly exists Wasm was created to solve two problems at once: 1. **Run existing native code in the browser** without rewriting it in JavaScript. 2. **Give web apps a predictable, high-performance execution layer** for the parts JavaScript was never designed for. It is explicitly a companion to JavaScript, not a successor. The DOM, network stack, and most APIs are still owned by JavaScript. Wasm handles the isolated compute; JavaScript handles the orchestration. ## What WebAssembly solves - **CPU-bound workloads**: decoding images, transcoding video, running physics, encrypting data. - **Predictable performance**: no garbage collector, no JIT warm-up curve. - **Code reuse**: bring battle-tested libraries like libheif, FFmpeg, SQLite, and OpenCV to the browser. - **Privacy**: sensitive data can be processed locally instead of uploaded to a server. - **Offline execution**: once the `.wasm` module is downloaded, it runs without a network round-trip. ## Pros and cons | Aspect | Advantage | Limitation | | ----------- | ---------------------------------------------------- | --------------------------------------------------------------- | | Performance | Near-native speed for numeric and memory-bound tasks | Not faster than native; still bounded by browser and device | | Portability | One module runs on any browser and OS | Requires a JavaScript host for DOM and most browser APIs | | Security | Sandboxed linear memory with bounds checks | Vulnerable to Spectre-style side channels like any browser code | | Ecosystem | Reuses existing C/C++/Rust codebases | Interop with JavaScript adds complexity and overhead | | Startup | Binary parses quickly | Module download and instantiation can be large on first load | Wasm makes the browser capable of work it could not do before, but it does not remove the constraints of running on a user's device. ## Common use cases WebAssembly has become the default answer when a web app needs to do heavy lifting locally: - **Image and video editing**: Figma, Photopea, and similar tools use Wasm for rendering and effects. - **Video transcoding**: FFmpeg.wasm runs FFmpeg inside the browser for format conversion. - **Optical character recognition**: Tesseract.js ports the Tesseract OCR engine to Wasm. - **Gaming**: Unity, Godot, and Unreal Engine can export to Wasm for browser-based games. - **Data analysis**: Pyodide brings Python and scientific packages; sql.js runs SQLite in the browser. - **Machine learning inference**: ONNX Runtime Web uses a Wasm backend for CPU inference. - **CAD and 3D viewers**: complex geometry kernels that were previously desktop-only. - **Cryptography**: hashing, encryption, and zero-knowledge proofs executed client-side. ## Common WebAssembly-based libraries | Library | Origin | What it does | | -------------------- | ---------------------------- | --------------------------------------------------------------------------- | | **heic-to** | libheif via Emscripten | Decode HEIC/HEIF images and convert to JPEG, PNG, or bitmap in the browser. | | **FFmpeg.wasm** | FFmpeg via Emscripten | Audio/video transcoding, remuxing, and filtering entirely client-side. | | **Tesseract.js** | Tesseract OCR via Emscripten | Recognize text from images in the browser. | | **sql.js** | SQLite via Emscripten | Run a full SQLite database engine in the browser using an in-memory file. | | **Pyodide** | CPython via Emscripten | Run Python and packages like NumPy, Pandas, and SciPy without a backend. | | **ONNX Runtime Web** | ONNX Runtime via Emscripten | Execute ONNX machine-learning models on CPU (Wasm) or GPU (WebGL/WebGPU). | The pattern behind every entry is the same: compile a mature native project to Wasm and wrap it with a JavaScript API. That is what WebAssembly is for in practice. ## Why online HEIC to JPG/PNG/WebP needs WebAssembly HEIC is a container, not a codec. The actual image data is encoded with HEVC, which is computationally expensive and patent-encumbered. No browser ships a native HEVC decoder that web pages can use. Server-side conversion is the obvious fallback, but it requires uploading the user's photos. The alternative is to ship libheif — the same decoder used by desktop tools — compiled to WebAssembly. When you use our [HEIC to JPG converter](/tools/heic-to-jpg), the decoding happens in your browser: 1. The file is validated by reading the `ftyp` box signature. 2. The libheif Wasm module decodes the HEVC bitstream locally. 3. The decoded bitmap is written to a canvas and exported as JPEG. The same module powers [HEIC to PNG](/tools/heic-to-png) for lossless output with transparency and [HEIC to WebP](/tools/heic-to-webp) for web-optimized sizes. No upload, no server processing, and no third party sees the image. That workflow only works because WebAssembly can run a real image decoder. JavaScript alone cannot parse HEVC in reasonable time; a server upload would defeat the privacy promise. Wasm is what makes it possible. ## The future of WebAssembly Wasm is moving beyond the browser. The WebAssembly System Interface (WASI) defines a portable system interface that lets Wasm modules run on servers, edge workers, and IoT devices. Runtimes like Wasmtime, Wasmer, and WasmEdge are already deployed in production outside the browser. The Component Model proposal will let Wasm modules expose typed interfaces and compose like libraries, making it easier to plug a Rust module into a Python host or a Go service. WebAssembly GC adds better support for managed languages such as Java and Kotlin. None of this is about replacing JavaScript in the browser — it is about making Wasm a universal, lightweight runtime target. The same trend is visible inside the browser: more native capabilities moved client-side, more privacy-preserving tools, and more libraries that were once desktop-only running in a tab. Users rarely notice WebAssembly directly, but it is what makes demanding workloads runnable in a browser. ### ICO Format Decoded: Structure, Headers, and Why It Survived Published: 2026-06-10 ICO is a container, not an image codec. Invented for Windows 1.0 in 1985, it stores multiple resolutions of the same icon in one file so the OS can pick the right size at runtime. Here is the complete technical breakdown — from the six-byte header to why SVG favicons still have not killed it off. Open an ICO file in a hex editor. The first six bytes: ``` 00 00 01 00 03 00 ``` That is the entire file header. `00 00` is the Reserved field — always zero. `01 00` is the Type field — `1` means this is an icon file (cursor files use `2`). `03 00` is the Count field — little-endian for `3`, meaning this ICO contains three separate images. Six bytes to describe a container that holds three independent image files. The rest of the file is metadata about those images, followed by the image data itself. ICO is neither a compression algorithm nor a color space — it is simply a container, the smallest and most primitive container format still in daily use on every Windows machine and every major browser. ## Where ICO Came From Microsoft introduced ICO with **Windows 1.0 in 1985**. The PC ecosystem in 1985 had no concept of a standardized image file. There was no JPEG, no PNG, no GIF. Bitmap data was raw arrays of pixels, and every program handled its own storage. Microsoft needed a way to ship icons for programs, folders, and system UI elements. The requirements were simple: - One file per icon, regardless of how many sizes the OS needed - Fast lookup at runtime — the OS should not have to decode an image to know its dimensions - Small memory footprint on systems with 256 KB of RAM The solution was a directory structure. The file starts with a header that says how many images are inside. Then comes an array of entries, each describing one image's width, height, bit depth, and offset within the file. The OS reads the directory, picks the entry that matches the current display context, seeks to that offset, and renders the bitmap. This design predates ZIP by two years, predates GIF by two years, and predates JPEG by seven years. ICO was a miniature filesystem before filesystems became interesting. ## Why ICO Exists at All An icon is not a single image — it is a set of images at different resolutions. Windows renders the same icon at 16 x 16 in a file list, at 32 x 32 on the desktop, at 48 x 48 in the Explorer detail pane, and at 256 x 256 in the "extra large" view. A high-DPI display at 200% scale needs a 32 x 32 icon rendered from a 64 x 64 source. The OS decides which size to use based on context, and that choice has to be instant. If icons were stored as individual PNG files, the OS would need to open multiple files, decode each one, and cache the results. With ICO, the OS opens one file, reads a 16-byte directory entry, and jumps directly to the bitmap data. The directory makes the format self-describing. No decoder needed for metadata. The same logic applies to favicons. When a browser requests `/favicon.ico`, it gets one file that contains every size it might need — 16 x 16 for the tab, 32 x 32 for the bookmark bar, 180 x 180 for iOS home screen shortcuts. The browser picks the right entry without parsing image headers. ## The File Header The ICO header has two parts: the `ICONDIR` and the `ICONDIRENTRY` array. ### ICONDIR (6 bytes) ``` Bytes 0-1: Reserved (must be 0) Bytes 2-3: Type (1 = icon, 2 = cursor) Bytes 4-5: Count (number of images, little-endian uint16) ``` Every ICO file starts with `00 00 01 00`. The next two bytes tell you how many images follow. ### ICONDIRENTRY (16 bytes each) Each image gets one entry: ``` Bytes 0: Width (in pixels; 0 means 256) Bytes 1: Height (in pixels; 0 means 256) Bytes 2: ColorCount (0 if more than 256 colors) Bytes 3: Reserved (always 0) Bytes 4-5: Planes (1 for icons) Bytes 6-7: BitCount (bits per pixel: 1, 4, 8, 24, or 32) Bytes 8-11: BytesInRes (size of image data in bytes, uint32) Bytes 12-15: ImageOffset (byte offset to image data from file start, uint32) ``` The Width and Height fields are one byte each. The maximum explicitly storable value is 255. When an image is 256 x 256 pixels, the field stores `0x00`, which decoders interpret as 256. This quirk has been part of the specification since 1985. Here is what the directory looks like for an ICO with three images — a 16 x 16 BMP, a 32 x 32 BMP, and a 256 x 256 PNG: ``` Offset 0x00: 00 00 01 00 03 00 -- ICONDIR: 3 images Offset 0x06: 10 10 00 00 01 00 18 00 2C 01 00 00 16 00 00 00 -- 16x16, 24bpp, BMP, 300 bytes at 0x16 Offset 0x16: 20 20 00 00 01 00 18 00 A8 02 00 00 42 01 00 00 -- 32x32, 24bpp, BMP, 680 bytes at 0x142 Offset 0x26: 00 00 00 00 01 00 20 00 B4 1C 00 00 EA 03 00 00 -- 256x256, 32bpp, PNG, 7348 bytes at 0x3EA ``` The OS reads the directory, finds the entry matching its needs, and seeks to `ImageOffset` — no parsing, no guessing, just direct memory access. ## Why PNG, WebP, and JPEG Never Replaced ICO By every modern metric, PNG is a better format than ICO's internal bitmap encoding. PNG has better compression, true alpha transparency, and widespread tooling. WebP is smaller still. JPEG handles photographs. Yet ICO persists. Three reasons: **1. Single-file multi-resolution.** PNG stores one image. ICO stores an arbitrary number. A website could serve a ZIP of PNGs, but no browser would know how to pick the right one for a favicon. The ICO directory structure solves this in six bytes. **2. System API binding.** Windows `LoadIcon`, `ExtractIcon`, and `SHGetFileInfo` all expect ICO data. The Win32 API has no equivalent for PNG icon containers. Changing this would break every Windows application compiled since 1985, and Microsoft has never been in the business of breaking backward compatibility. **3. The favicon standard.** The HTML `` tag accepts PNG, SVG, and ICO, but the implicit default request for `/favicon.ico` predates those options. Every browser since Internet Explorer 5 (1999) requests `/favicon.ico` by default. Sites that do not explicitly declare a favicon link still need an ICO at that path or the browser gets a 404. PNG did not replace ICO because ICO was never competing on image quality. It was competing on container semantics, and no other format offers the same directory-in-a-file model with thirty years of operating system support. ## What Is Inside the Container Each entry in an ICO file points to an independent image. The image data can be one of two formats: ### BMP Encoding (Legacy) Before Windows Vista, all ICO images were uncompressed or RLE-compressed BMP bitmaps. The stored data is a **DIB (Device Independent Bitmap)** — a BMP without the `BITMAPFILEHEADER`. It starts directly with the `BITMAPINFOHEADER`: ``` Bytes 0-3: Header size (40 for BITMAPINFOHEADER) Bytes 4-7: Width (uint32) Bytes 8-11: Height (uint32, doubled for XOR + AND masks) Bytes 12-13: Planes (1) Bytes 14-15: BitCount (1, 4, 8, 24, or 32) Bytes 16-19: Compression (0 for uncompressed, 1 or 2 for RLE) Bytes 20-23: Image size (0 if uncompressed) Bytes 24-27: X pixels per meter Bytes 28-31: Y pixels per meter Bytes 32-35: Colors used Bytes 36-39: Important colors ``` The Height field in the DIB header is **double the actual icon height**. A 32 x 32 icon stores `64` in the Height field. The top half is the XOR mask (the actual color image), and the bottom half is the AND mask (a 1-bit transparency bitmap). For 32-bit icons with an alpha channel, the AND mask is typically ignored. For 24-bit and lower BMP-encoded icons without alpha, the AND mask is the only transparency mechanism. A `1` in the AND mask means transparent; a `0` means opaque. This is how Windows achieved transparency before 32-bit color became standard. ### PNG Encoding (Windows Vista+) Starting with Windows Vista, ICO files can store PNG-encoded images. The image data at the offset specified in `ICONDIRENTRY` is a raw PNG file — complete with its own `89 50 4E 47` signature and full PNG chunk structure. This is the format you want for 256 x 256 icons. A 256 x 256 32-bit BMP would be approximately 262 KB uncompressed. The same image as PNG is typically 20-60 KB. Modern icon tools generate PNG-encoded entries for 256 x 256 and BMP-encoded entries for smaller sizes, giving the best balance of compatibility and file size. ### Chunk Comparison | Encoding | Introduced | Compression | Alpha Support | Best For | | -------- | -------------------- | ----------- | -------------- | -------------------- | | BMP | Windows 1.0 (1985) | None or RLE | 1-bit AND mask | 16 x 16 to 48 x 48 | | PNG | Windows Vista (2006) | DEFLATE | 8-bit alpha | 64 x 64 to 256 x 256 | ## Detecting and Inspecting ICO Files Do not trust the `.ico` extension. Read the first six bytes and parse the directory. ### TypeScript ```typescript interface IcoEntry { width: number height: number bitCount: number bytesInRes: number imageOffset: number } interface IcoInfo { valid: boolean type: "icon" | "cursor" | "unknown" count: number entries: IcoEntry[] } async function inspectIco(file: File): Promise { const buffer = await file.slice(0, 1024).arrayBuffer() const bytes = new Uint8Array(buffer) if (bytes.length < 6) return { valid: false, type: "unknown", count: 0, entries: [] } const reserved = bytes[0] | (bytes[1] << 8) const type = bytes[2] | (bytes[3] << 8) const count = bytes[4] | (bytes[5] << 8) if (reserved !== 0 || (type !== 1 && type !== 2)) { return { valid: false, type: "unknown", count: 0, entries: [] } } const entries: IcoEntry[] = [] const dirSize = 6 + count * 16 if (bytes.length < dirSize) { return { valid: false, type: "unknown", count: 0, entries: [] } } for (let i = 0; i < count; i++) { const off = 6 + i * 16 entries.push({ width: bytes[off] === 0 ? 256 : bytes[off], height: bytes[off + 1] === 0 ? 256 : bytes[off + 1], bitCount: bytes[off + 6] | (bytes[off + 7] << 8), bytesInRes: bytes[off + 8] | (bytes[off + 9] << 8) | (bytes[off + 10] << 16) | (bytes[off + 11] << 24), imageOffset: bytes[off + 12] | (bytes[off + 13] << 8) | (bytes[off + 14] << 16) | (bytes[off + 15] << 24), }) } return { valid: true, type: type === 1 ? "icon" : "cursor", count, entries, } } ``` ### Python ```python import struct from typing import TypedDict class IcoEntry(TypedDict): width: int height: int bit_count: int bytes_in_res: int image_offset: int class IcoInfo(TypedDict): valid: bool type: str count: int entries: list[IcoEntry] def inspect_ico(path: str) -> IcoInfo: with open(path, "rb") as f: header = f.read(1024) if len(header) < 6: return {"valid": False, "type": "unknown", "count": 0, "entries": []} reserved, type_, count = struct.unpack(" false, "type" => "unknown", "count" => 0, "entries" => []]; } $reserved = unpack("v", substr($header, 0, 2))[1]; $type = unpack("v", substr($header, 2, 2))[1]; $count = unpack("v", substr($header, 4, 2))[1]; if ($reserved !== 0 || ($type !== 1 && $type !== 2)) { return ["valid" => false, "type" => "unknown", "count" => 0, "entries" => []]; } $dirSize = 6 + $count * 16; if (strlen($header) < $dirSize) { return ["valid" => false, "type" => "unknown", "count" => 0, "entries" => []]; } $entries = []; for ($i = 0; $i < $count; $i++) { $off = 6 + $i * 16; $w = ord($header[$off]); $h = ord($header[$off + 1]); $bitCount = unpack("v", substr($header, $off + 6, 2))[1]; $bytesInRes = unpack("V", substr($header, $off + 8, 4))[1]; $imageOffset = unpack("V", substr($header, $off + 12, 4))[1]; $entries[] = [ "width" => $w === 0 ? 256 : $w, "height" => $h === 0 ? 256 : $h, "bit_count" => $bitCount, "bytes_in_res" => $bytesInRes, "image_offset" => $imageOffset, ]; } return [ "valid" => true, "type" => $type === 1 ? "icon" : "cursor", "count" => $count, "entries" => $entries, ]; } ``` ### ImageMagick CLI ```bash magick identify -verbose favicon.ico | grep -E "(Print size|Resolution|Colorspace|Type)" ``` List all internal images: ```bash magick identify favicon.ico ``` Extract a specific size: ```bash magick favicon.ico[2] extracted-256x256.png ``` Or simply: ```bash file favicon.ico # favicon.ico: MS Windows icon resource - 5 icons, 16x16, 32 bits/pixel, 32x32, 32 bits/pixel ``` ## Best Practices and Use Cases ICO is not a general-purpose image format. It is a deployment artifact for specific contexts. Use it where the context demands it, and use PNG everywhere else. ### Favicons For modern websites, serve both formats: ```html ``` Browsers pick the first format they support. SVG-aware browsers get the vector icon. Legacy browsers and bookmark utilities fall back to ICO. The ICO file should contain: | Size | Encoding | Purpose | | --------- | -------- | --------------------------------- | | 16 x 16 | BMP | Browser tab, legacy IE | | 32 x 32 | BMP | Taskbar, bookmark bar | | 48 x 48 | BMP | Windows shortcuts | | 180 x 180 | PNG | iOS home screen icon | | 256 x 256 | PNG | Windows Explorer extra-large view | A favicon ICO with these five entries is typically 30-50 KB. Without the 256 x 256 PNG, it drops to under 10 KB. ### Windows Application Icons Windows application executables embed an ICO resource. The OS loads the appropriate size from the embedded directory at runtime. For desktop applications targeting Windows 10 and 11, include: - 16 x 16, 24 x 24, 32 x 32, 48 x 48 (BMP, for legacy and standard DPI) - 64 x 64, 128 x 128, 256 x 256 (PNG, for high-DPI displays) Windows automatically scales down if an exact size is missing, but scaling looks worse than rendering a native smaller size. Each size you omit costs visual quality. ### When Not to Use ICO - **Web content images**: Use WebP, JPEG, or PNG. ICO has no compression advantage and no browser-native rendering benefit for inline images. - **Photographs**: ICO is not designed for high-color continuous-tone imagery. File sizes explode. - **Cross-platform assets**: macOS uses `.icns`, not ICO. Linux uses PNG or SVG. ICO is a Windows-native format that happens to work on the web. ## The Future of ICO ICO is going to stick around far longer than most obituaries predict. The reason is the same as its origin: backward compatibility. SVG favicons are technically superior. They scale to any resolution, compress better than any raster format, and support animation and interactivity. Chrome, Firefox, and Safari all support SVG favicons. Yet ICO persists because millions of devices, enterprise systems, and legacy browsers still request `/favicon.ico` by default. A site without an ICO file generates 404s in server logs and shows a broken icon in older software. Windows 11 still uses ICO for application icons, folder icons, and system UI. The Win32 API still expects ICO data. Microsoft has shown no interest in replacing this format — there is no business reason to break thirty years of application compatibility. The real shift is in how ICO files are produced, not in the format itself. Modern toolchains — IconKitchen, Figma plugins, online generators — output ICO files with PNG-encoded high-resolution entries automatically. The container stays the same; the payload gets better. Nobody loves ICO as a format. But it works everywhere, breaks nothing, and costs nothing to support — which is exactly why it will still be around in 2035. If you need to create ICO files from existing images, [JPG to ICO](/tools/jpg-to-ico) converts JPG, PNG, and WebP sources into multi-resolution ICO files directly in your browser — no uploads, no server processing. It generates the standard size matrix and automatically picks PNG encoding for 256 x 256 and BMP encoding for smaller sizes, giving you the optimal balance of compatibility and file size. ### The Birth of WebP: How VP8 Became an Image Format Published: 2026-06-09 WebP is a RIFF-based container wrapping VP8 video frames for still images. Google announced it in 2010 with bold claims of 25-34% smaller files than JPEG and PNG. Here is the full technical story — from the file signature to the real-world adoption gap. Open a WebP file in a hex editor and the first twelve bytes are: ``` 52 49 46 46 ?? ?? ?? ?? 57 45 42 50 ``` That is a RIFF/WAVE-style container header. `52 49 46 46` spells "RIFF" in ASCII. The next four bytes store the file size as a little-endian uint32. `57 45 42 50` spells "WEBP". A WebP file is not a raw bitstream. It is a container, the same kind used by WAV audio and AVI video, built from the RIFF specification Microsoft introduced in 1991. Inside sits a VP8 video frame, repurposed for a still image. Using a video codec for still images shapes everything about how WebP behaves in practice. Google announced WebP on September 30, 2010. The pitch was simple: same visual quality as JPEG, but 25-34% smaller. For PNG, the claim was even bolder: 26% smaller for lossless images. Images account for roughly half of all bytes transferred on the web. Those numbers suggested an obvious migration. They were not. ## The acquisition that created WebP WebP did not come from an image lab. It came from a video codec. In February 2010, Google acquired On2 Technologies for approximately $124 million. On2 was a video compression company with a long history; their codecs powered Flash video, Skype video calls, and AOL streaming. Their flagship product was VP8, a video codec designed to compete with H.264 without patent royalties. Google open-sourced VP8 in May 2010 under the name WebM, bundling it with the Vorbis audio codec and the Matroska container. The goal was clear: build a patent-free video stack to challenge MPEG-LA's H.264 licensing pool, which was starting to demand royalties from web video streaming. But Google had a second use case in mind. VP8's intra-frame compression (the compression of a single video frame without reference to other frames) functioned as a still-image codec. The prediction modes, transform coding, and entropy coding that made VP8 efficient for video worked just as well for single frames. Google extracted the intra-frame mode, wrapped it in a RIFF container, and called it WebP. The name followed simple logic. "Web" for its intended platform. "P" because image formats tend to end that way: JPEG, PNG, BMP, TIFF. Technically, WebP was a video frame packaged as a photo. ## Why build a new format at all? By 2010, JPEG was eighteen years old and PNG was fourteen. Both were entrenched. Why bother? JPEG's limitations were well understood: - No transparency. A JPEG pixel is either fully opaque or you need a separate mask. - No animation. Animated JPEG does not exist as a standard. - Lossy-only. JPEG's baseline spec has no lossless mode. (JPEG-LS and JPEG 2000 exist, but neither is web-compatible.) - 8-bit color depth per channel. No wide-gamut or HDR support in the baseline. - Blocking artifacts at low quality. The 8 x 8 DCT grid is visible at quality settings below 75. PNG had similar constraints: - No lossy mode. PNG is always lossless. A 12 MP photograph as PNG is 15-25 MB. - Large files for photographs. PNG's DEFLATE compression cannot compete with DCT-based psycho-visual discard. - No animation in the base spec. APNG exists but took years to gain browser support. The pitch was a single format that handled lossy and lossless compression, transparency, and animation, all in smaller files than the incumbents. ## How WebP actually works WebP has two fundamentally different internal formats: lossy WebP (VP8 intra-frame) and lossless WebP (a separate codec, also derived from VP8 research). ### Lossy WebP: VP8 intra Lossy WebP stores a VP8 bitstream inside a RIFF container. The encoding pipeline resembles JPEG's, with a few important differences: | Stage | JPEG | Lossy WebP | | ------------------ | ----------------- | ------------------------------------------- | | Transform | 8 x 8 DCT | 4 x 4 or 16 x 16 integer DCT-like transform | | Prediction | None (intra only) | 4 intra-prediction modes per 4 x 4 block | | Chroma subsampling | 4:2:0 default | 4:2:0 default | | Entropy coding | Huffman | Binary arithmetic coding | | Bit depth | 8-bit | 8-bit | The intra prediction is where most of the gain comes from. JPEG encodes each 8 x 8 block independently. WebP predicts each 4 x 4 block from its already-encoded neighbors (top, left, or both), then encodes only the prediction error. For smooth gradients and large flat regions, the error is tiny, and the compression ratio improves significantly. The arithmetic coder is also more efficient than JPEG's Huffman coding, typically 5-10% additional savings for the same quality. Google's own benchmarks from 2010 claimed: | Metric | WebP vs JPEG | | --------------------------- | ------------------------- | | Average file size reduction | 25-34% at equivalent SSIM | | Encode speed | ~8x slower than libjpeg | | Decode speed | Comparable to libjpeg | Encode speed was the hidden cost. Producing a WebP file took significantly more CPU than JPEG. For photographers exporting hundreds of images, that mattered. ### Lossless WebP Lossless WebP uses a completely different codec. It is not VP8. It is a custom format combining four techniques. Predictive coding provides 14 different spatial prediction modes per pixel. A color cache keeps a hash table of recently seen colors to exploit local repetition. LZ77 back-references work like PNG's DEFLATE, but with 2D spatial-aware matching. The entropy coder is a Huffman and arithmetic hybrid that adapts to local statistics. Google claimed 26% smaller files than PNG on average. In practice, savings vary widely. Simple graphics with large flat regions see little benefit, while photographs with fine texture can see 30-40% reduction. ### Extended WebP (VP8X) The VP8X chunk extends WebP with additional features. It adds an alpha channel, animation, EXIF and XMP metadata, and ICC color profiles. Alpha is 8-bit and encoded separately, compressed with lossless WebP's entropy coder. Animation stores multiple frames with timing metadata, basically a stripped VP8 video. EXIF holds camera and geolocation data. XMP holds Adobe-style processing instructions. The ICC profile enables wide-gamut and HDR color management. A VP8X file begins with a VP8X chunk header, followed by flags that indicate which extensions are present. ## The file format WebP is a RIFF container. The byte layout is easy to follow if you understand RIFF. ### RIFF container structure ``` Bytes 0-3: "RIFF" (0x52 0x49 0x46 0x46) Bytes 4-7: File size - 8 (little-endian uint32) Bytes 8-11: "WEBP" (0x57 0x45 0x42 0x50) Bytes 12-15: Chunk FourCC — "VP8 ", "VP8L", or "VP8X" Bytes 16-19: Chunk size (little-endian uint32) Bytes 20+: Chunk data ``` ### VP8X extended header If the FourCC at bytes 12-15 is "VP8X" (0x56 0x50 0x38 0x58): ``` Bytes 20-23: Chunk size = 10 (little-endian uint32) Bytes 24: Flags byte Bit 0: Animation present Bit 1: XMP metadata present Bit 2: EXIF metadata present Bit 3: Alpha channel present Bit 4: ICC profile present Bits 5-7: Reserved Bytes 25-27: Canvas width - 1 (little-endian uint24) Bytes 28-30: Canvas height - 1 (little-endian uint24) ``` The canvas dimensions are stored as `width - 1` and `height - 1`, so a 1200 x 675 image stores `1199` and `674`. The maximum canvas size is 16,777,215 x 16,777,215 pixels. ### Chunk types | FourCC | Content | Compression | | ------ | ------------------------- | --------------------- | | `VP8 ` | VP8 bitstream (lossy) | VP8 intra | | `VP8L` | VP8L bitstream (lossless) | Custom lossless | | `VP8X` | Extended header + flags | None | | `ALPH` | Alpha channel data | Lossless WebP entropy | | `ANMF` | Animation frame | VP8/VP8L per frame | | `ICCP` | ICC color profile | None | | `EXIF` | EXIF metadata | None | | `XMP ` | XMP metadata | None | ## Detecting WebP by reading the file signature Do not trust the `.webp` extension. Read the first 16 bytes and parse the RIFF header. Exact byte layout of a simple lossy WebP: ``` Bytes 0-3: "RIFF" Bytes 4-7: File size (little-endian uint32) Bytes 8-11: "WEBP" Bytes 12-15: "VP8 " (lossy) or "VP8L" (lossless) or "VP8X" (extended) ``` TypeScript in the browser: ```typescript interface WebPInfo { valid: boolean type: "lossy" | "lossless" | "extended" | "unknown" width?: number height?: number hasAlpha?: boolean isAnimated?: boolean } async function inspectWebP(file: File): Promise { const buffer = await file.slice(0, 30).arrayBuffer() const bytes = new Uint8Array(buffer) if (bytes.length < 12) return { valid: false, type: "unknown" } const riff = String.fromCharCode(...bytes.slice(0, 4)) const webp = String.fromCharCode(...bytes.slice(8, 12)) if (riff !== "RIFF" || webp !== "WEBP") { return { valid: false, type: "unknown" } } const type = String.fromCharCode(...bytes.slice(12, 16)) if (type === "VP8 ") { // Lossy: width/height at bytes 26-29 const w = bytes[26] | (bytes[27] << 8) const h = bytes[28] | (bytes[29] << 8) return { valid: true, type: "lossy", width: w, height: h, hasAlpha: false } } if (type === "VP8L") { // Lossless: dimensions packed in bits of bytes 21-24 const bits = bytes[21] | (bytes[22] << 8) | (bytes[23] << 16) | (bytes[24] << 24) const w = (bits & 0x3fff) + 1 const h = ((bits >> 14) & 0x3fff) + 1 const alpha = ((bits >> 28) & 0x01) !== 0 return { valid: true, type: "lossless", width: w, height: h, hasAlpha: alpha, } } if (type === "VP8X") { const flags = bytes[20] const w = (bytes[24] | (bytes[25] << 8) | (bytes[26] << 16)) + 1 const h = (bytes[27] | (bytes[28] << 8) | (bytes[29] << 16)) + 1 return { valid: true, type: "extended", width: w, height: h, hasAlpha: (flags & 0x10) !== 0, isAnimated: (flags & 0x02) !== 0, } } return { valid: false, type: "unknown" } } ``` ### Python ```python import struct from typing import TypedDict class WebPInfo(TypedDict): valid: bool type: str width: int | None height: int | None has_alpha: bool | None is_animated: bool | None def inspect_webp(path: str) -> WebPInfo: with open(path, "rb") as f: header = f.read(30) if len(header) < 12: return {"valid": False, "type": "unknown"} if header[:4] != b"RIFF" or header[8:12] != b"WEBP": return {"valid": False, "type": "unknown"} chunk_type = header[12:16] if chunk_type == b"VP8 ": w, h = struct.unpack("> 14) & 0x3FFF) + 1 alpha = ((bits >> 28) & 0x01) != 0 return {"valid": True, "type": "lossless", "width": w, "height": h, "has_alpha": alpha, "is_animated": None} if chunk_type == b"VP8X": flags = header[20] w = struct.unpack(">14)&0x3FFF) + 1 alpha := ((bits >> 28) & 0x01) != 0 return WebPInfo{Valid: true, Type: "lossless", Width: w, Height: h, HasAlpha: alpha}, nil case "VP8X": flags := buf[20] w := int(binary.LittleEndian.Uint32(append(buf[24:27], 0))) + 1 h := int(binary.LittleEndian.Uint32(append(buf[27:30], 0))) + 1 return WebPInfo{ Valid: true, Type: "extended", Width: w, Height: h, HasAlpha: (flags & 0x10) != 0, IsAnimated: (flags & 0x02) != 0, }, nil } return WebPInfo{Valid: false, Type: "unknown"}, nil } ``` ### PHP ```php function inspectWebP(string $path): array { $header = file_get_contents($path, false, null, 0, 30); if (strlen($header) < 12) { return ["valid" => false, "type" => "unknown"]; } if (substr($header, 0, 4) !== "RIFF" || substr($header, 8, 4) !== "WEBP") { return ["valid" => false, "type" => "unknown"]; } $type = substr($header, 12, 4); if ($type === "VP8 ") { $w = unpack("v", substr($header, 26, 2))[1]; $h = unpack("v", substr($header, 28, 2))[1]; return ["valid" => true, "type" => "lossy", "width" => $w, "height" => $h, "has_alpha" => false]; } if ($type === "VP8L") { $bits = unpack("V", substr($header, 21, 4))[1]; $w = ($bits & 0x3FFF) + 1; $h = (($bits >> 14) & 0x3FFF) + 1; $alpha = (($bits >> 28) & 0x01) !== 0; return ["valid" => true, "type" => "lossless", "width" => $w, "height" => $h, "has_alpha" => $alpha]; } if ($type === "VP8X") { $flags = ord($header[20]); $w = unpack("V", substr($header, 24, 3) . "\x00")[1] + 1; $h = unpack("V", substr($header, 27, 3) . "\x00")[1] + 1; return [ "valid" => true, "type" => "extended", "width" => $w, "height" => $h, "has_alpha" => (bool)($flags & 0x10), "is_animated" => (bool)($flags & 0x02), ]; } return ["valid" => false, "type" => "unknown"]; } ``` With `fileinfo`: ```php $finfo = new finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file('image.webp'); // image/webp ``` ### ImageMagick CLI ```bash magick identify -verbose image.webp | grep "Format:" # Format: WEBP (WebP Image Format) ``` Full metadata extraction: ```bash magick identify -verbose image.webp ``` This outputs width, height, color depth, alpha presence, compression type, and ICC profile information. Or simply: ```bash file image.webp # image.webp: RIFF (little-endian) data, Web/P image ``` ## Where WebP delivers WebP performs well in specific areas. File size is the headline. On Google's reference corpus, lossy WebP averaged 25-34% smaller than JPEG at the same SSIM. Lossless WebP averaged 26% smaller than PNG. For high-traffic sites, those savings translate directly into bandwidth costs and faster page loads. Feature consolidation also helps. One format replaces both JPEG and PNG for most use cases. Lossy mode handles photos, lossless mode handles graphics, the alpha channel handles transparency, and animation handles short sequences. Developers only need to know one format instead of three. Browser-native decode is another advantage. Chrome, Firefox, Safari, and Edge all ship hardware-accelerated or highly optimized software WebP decoders. Decode speed is comparable to JPEG on desktop and within 10-20% on mobile. Progressive decoding lets WebP display incrementally as data arrives, similar to JPEG's progressive mode. For slow connections, a recognizable image appears after receiving roughly 30% of the file. Animation rounds out the list. Animated WebP files are typically 60-80% smaller than animated GIFs at equivalent visual quality, with full 24-bit color and 8-bit alpha per frame. ## Where WebP falls short WebP's problems are less about the specification and more about the ecosystem around it. Encode speed was a known weakness. In 2010, WebP encoding was roughly 8x slower than libjpeg. The gap has narrowed; libwebp in 2026 is about 2-3x slower than libjpeg-turbo. It still matters for batch workflows. A photographer exporting 1,000 images will wait noticeably longer. WebP is strictly 8-bit per channel, so it has no 16-bit or HDR support. For wide-gamut photography, medical imaging, or HDR content, WebP is unusable. HEIC, AVIF, and JPEG XL all support higher bit depths. WebP cannot do lossless JPEG recompression. JPEG XL can take an existing JPEG and recompress it losslessly for about 20% savings. Converting a JPEG to WebP requires full re-encoding, which introduces generation loss. Tooling gaps slowed adoption. Photoshop did not support WebP natively until 2022. ImageMagick's WebP support required a libwebp plugin compilation, which many distributions omitted by default. Many content management systems still generate JPEG/PNG by default. The VP8 patent cloud also made some organizations cautious. Google released VP8 with a patent indemnification promise, but the codec's patent landscape was never as clean as PNG's or JPEG's. Some organizations avoided WebP because they did not trust Google's legal shield to hold up in court. ## Why the "inferior" format won JPEG is thirty-four years old. It lacks transparency, animation, and a lossless mode, and it shows visible artifacts at quality 75. WebP beats it on most metrics. Yet the 2025 Web Almanac puts JPEG at roughly 46% of all web images versus WebP at 19%. That gap is not a technical failure. It reflects network effects and switching costs. JPEG is the QWERTY of image formats. Cameras save it by default, phones display it natively, printers accept it, and every social network, CMS, CDN, and email client handles it without plugins, codecs, or conversion. The format is so universal that "image" and "JPEG" are functionally synonymous for most users. WebP's adoption curve tells the story: | Year | Milestone | | ---- | ------------------------------------------- | | 2010 | Google announces WebP (Chrome 8) | | 2012 | Chrome 23 adds lossless and alpha support | | 2013 | Chrome adds animated WebP | | 2014 | Android 4.0+ adds native WebP support | | 2015 | Facebook converts all mobile photos to WebP | | 2016 | Safari 14 adds WebP support | | 2020 | Universal browser support achieved | | 2022 | Photoshop adds native WebP export | | 2025 | WebP at 19% of web images per Web Almanac | Chrome adopted WebP early because Google controlled both the browser and the format. Facebook adopted it because it saved petabytes of bandwidth. But the long tail of the web (WordPress blogs, small e-commerce sites, enterprise CMS deployments, email newsletters) moved slowly or not at all. The larger problem was Apple's ecosystem. iPhones saved HEIC by default, not WebP. macOS Preview did not support WebP until macOS 11 Big Sur (2020). The iOS share sheet did not offer WebP export. For photographers, designers, and social media creators working primarily on Apple devices, WebP was invisible. Meanwhile, AVIF arrived in 2019 with better compression than WebP and royalty-free licensing from the Alliance for Open Media. Chrome, Firefox, and Safari all ship AVIF. Cloudflare and Cloudinary serve AVIF automatically. WebP became a stepping stone, better than JPEG but already being leapfrogged by the next generation. ## Where WebP stands today WebP landed somewhere in the middle. It met some of its goals and missed others. For developers starting new projects in 2026, WebP is the pragmatic default when images need transparency or animation. It is smaller than PNG for lossless graphics and smaller than JPEG for photographs. Browser support is universal. Encode tooling is mature. But WebP did not replace JPEG. It carved out a niche alongside it, the same niche PNG already held, just with smaller files. The vision of "one format for all images" did not materialize. What this looks like in practice: | Use case | Best format | Why | | ---------------------- | --------------- | ------------------------------------------------ | | Photographs (legacy) | JPEG | Universal, fast encode, small enough | | Photographs (new) | AVIF | 30% smaller than WebP, royalty-free | | Photographs (fallback) | WebP | 25% smaller than JPEG, universal support | | Lossless graphics | WebP or PNG | WebP is smaller; PNG is the safe fallback | | Transparency | WebP or PNG | WebP has smaller files; PNG is the safe fallback | | Animation | WebP or AVIF | Both beat GIF by 60-80%; AVIF is newer | | Wide-gamut / HDR | AVIF or JPEG XL | 10+ bit depth, ICC/ICC v4 support | | Print workflows | TIFF or JPEG XL | CMYK, 16-bit, lossless JPEG recompression | WebP's most lasting effect may be proving that the web can adopt a new image format when a major browser vendor pushes it. That made AVIF easier to sell. It forced Apple to support non-JPEG/PNG formats natively. It also established that transparency and animation can live in a single container. But it also proved that better compression alone does not win. Ubiquity and inertia matter more than compression ratios. JPEG will outlive WebP not because it is better, but because it is already everywhere. ## What actually happened WebP was built from a video codec to solve a bandwidth problem. It did solve that problem for Google, for Facebook, and for any site willing to convert its image pipeline. The compression is real and the features are useful. Browser support is complete. But the web does not switch formats because a white paper says the new one is 25% smaller. It switches when the new format is easier to use than the old one, or when the old one fails badly enough to force migration. JPEG did not fail that badly. WebP was not easy enough. By the time WebP became easy, AVIF had already arrived with a bigger number on the spec sheet. WebP is the Betamax of image formats: technically solid, well-supported, and then overtaken by something that arrived slightly later with better marketing and broader backing. It will not disappear. It will coexist with JPEG, PNG, AVIF, and whatever comes next, serving the same role PNG serves today: the safe, capable fallback that works everywhere. If you have PNG files that need smaller footprints for the web, [PNG to WebP](/tools/png-to-webp) converts them locally in your browser — no uploads, no server processing. For JPEGs that need transparency or animation, [JPG to WebP](/tools/jpg-to-webp) handles the conversion with quality control. And when you need the universal fallback, [WebP to PNG](/tools/webp-to-png) and [WebP to JPG](/tools/webp-to-jpg) bring WebP files back to formats that open in every viewer. ### The Birth of PNG: How a Patent War Created the Web's Favorite Lossless Format Published: 2026-06-02 PNG was born from a GIF patent crisis in 1995. Built by volunteers in four months, it replaced GIF for static images by combining filter preprocessing with DEFLATE compression. Here is the full technical story — from the Unisys lawsuit to the file signature you can read in a hex editor. Open a PNG file in a hex editor. The first eight bytes: ``` 89 50 4E 47 0D 0A 1A 0A ``` That is the **PNG signature**. Every PNG decoder checks for it. The first byte `0x89` is deliberately chosen to be high — it prevents naive text editors from treating the file as ASCII. `50 4E 47` spells "PNG" in ASCII. `0D 0A` is a DOS line ending, `1A` is the DOS end-of-file marker, and `0A` is a Unix line feed. The designers embedded these line-ending characters so that FTP transfers in text mode would corrupt the file immediately, forcing users to transfer in binary mode. It was a small act of paranoia from developers who had just watched a patented format turn into a legal weapon. PNG is everywhere today. It powers screenshots, UI assets, diagrams, logos, and any image where pixels must stay exactly the same after repeated saves. It is older than Google, older than the iPod, and still the default choice when lossless compression matters. But it was never meant to be a format at all. It started as a stopgap, not a standard. ## The Lawsuit That Forced a New Format In January 1995, **Unisys** announced that it would enforce its LZW compression patent — U.S. Patent 4,558,302 — against developers using the GIF format. The patent covered the Lempel-Ziv-Welch algorithm, the compression method at the heart of every GIF encoder and decoder. The web ran on GIF in 1995. Animated banners, transparent logos, tiled backgrounds — GIF did all of it. Then Unisys demanded royalties. Commercial software vendors faced licensing fees. Open-source projects faced existential threats. The GNU Image Manipulation Program (GIMP) was directly affected. The web development community was furious. Something had to replace GIF for static images. The requirements were clear: no patents, better compression than GIF, support for true color, and a proper alpha channel instead of GIF's crude single-color transparency. It also needed to be simple enough that a single developer could implement a decoder in a weekend. On April 4, 1995, **Thomas Boutell** posted a proposal to the `comp.graphics` Usenet newsgroup. He called it PBF — Portable Bitmap Format. The name did not stick. Over the next few months, a mailing list formed. Contributors included **Tom Lane** (lead of the Independent JPEG Group), **Lee Daniel Crocker**, **Alexander Lehmann**, and dozens of others. By October 1, 1996, the PNG specification was frozen as **RFC 2083**. The entire process took roughly eighteen months from idea to standard. For comparison, JPEG took six years. ## What Existed Before PNG In 1995, your image format options were limited and each carried baggage: | Format | Compression | Color depth | Transparency | Patent risk | Typical use | | ------ | ------------------- | ----------------- | -------------- | ---------------- | ------------------------- | | GIF | LZW | 256 colors max | 1-bit, 1 color | Yes (LZW) | Web graphics, animations | | JPEG | DCT + Huffman | 24-bit true color | None | Baseline expired | Photographs | | BMP | None or RLE | Up to 24-bit | None | No | Windows wallpaper | | TIFF | LZW, PackBits, etc. | Up to 48-bit | Yes | LZW optional | Print, scanning | | PCX | RLE | Up to 24-bit | None | No | DOS games, early clip art | **GIF** owned the web but was legally toxic. Its 256-color palette was fine for icons and cartoons, but useless for photographs. Its transparency was binary: a pixel was either fully opaque or fully transparent. No soft edges, no drop shadows. **JPEG** handled photographs brilliantly but destroyed data irreversibly. Open a JPEG, edit it, save it again, and the image degraded. JPEG also had no transparency at all. For web designers who needed a logo floating over a textured background, JPEG was useless. **BMP** and **PCX** were uncompressed or barely compressed. A 640 × 480 BMP in 1995 ate 900 KB. On a 28.8 kbps modem, that took over four minutes to download. **TIFF** was powerful and flexible, but its flexibility was its curse. TIFF files could use a dozen different compression schemes, color spaces, and bit depths. Writing a universal TIFF decoder was a thesis-level project, not a weekend hack. PNG was designed to hit a narrow target: replace GIF for static images, beat its compression, add true color and real transparency, and stay free forever. ## How PNG Actually Compresses PNG compression is a two-stage pipeline. Neither step is clever on its own. Together they are surprisingly effective. ### Stage 1: Filtering Before any compression happens, PNG runs the raw pixel data through a **filter**. The filter does not compress anything. It rearranges the data so that the next stage can compress it better. An image is a grid of bytes. In a photograph of a clear sky, adjacent pixels are nearly identical. But the raw byte stream still stores `120, 121, 120, 122, 119` for each channel. The differences are tiny: `+1, -1, +2, -3`. If you store the differences instead of the absolute values, the resulting numbers cluster around zero. That clustering is what compression algorithms love. PNG defines five filter types per scanline: | Filter | Name | What it does | | ------ | ------- | ------------------------------------------------------- | | 0 | None | Stores raw bytes | | 1 | Sub | Stores difference from previous pixel | | 2 | Up | Stores difference from pixel above | | 3 | Average | Stores difference from average of Sub and Up | | 4 | Paeth | Stores difference from best predictor (Sub/Up/diagonal) | The encoder tries all five filters per scanline and picks the one that produces the smallest output after Stage 2. This is why a PNG encoder can be slow: it is doing a brute-force search over filter combinations. But decoding is fast — the filter type is stored in the file, so the decoder just applies the inverse operation. ### Stage 2: DEFLATE After filtering, the data is compressed with **DEFLATE**, the same algorithm used by gzip and ZIP files. DEFLATE is a combination of **LZ77** (sliding-window duplicate string elimination) and **Huffman coding** (variable-length prefix codes for frequent symbols). The result: a typical screenshot or UI graphic compresses 3–5× smaller than uncompressed BMP. A photograph compressed as PNG is usually 5–10× larger than JPEG, but every pixel is recoverable. The compression is lossless by construction: no data is discarded, only redundancies are removed. For context, a 1920 × 1080 screenshot in raw RGB is **6.2 MB**. The same screenshot as PNG typically drops to **800 KB – 1.5 MB**. The same image as JPEG quality 90 is **300–500 KB**, but re-saving it ten times would introduce visible artifacts. ## The Features That Mattered PNG was not just a patent-free GIF clone. It added capabilities that web designers had been begging for since 1993. **True color**: PNG supports 24-bit RGB (16.7 million colors) and 48-bit deep color. No palette limits. A PNG photograph can display every color the human eye can distinguish. **Alpha channel**: PNG supports 8-bit alpha — 256 levels of transparency per pixel. A shadow can fade smoothly from opaque to transparent. A rounded button can anti-alias against any background. GIF offered 1-bit transparency: one color was either fully on or fully off. The visual difference is night and day. **Adam7 interlacing**: PNG can store pixels in a 7-pass interlaced order. A browser renders a coarse preview after receiving 1/64 of the file, then progressively refines it. Unlike GIF's line-by-line interlacing, Adam7 spreads detail across the entire image from the first pass. By the third pass, the image is recognizable. By the seventh, it is perfect. **Gamma correction**: PNG stores a gamma value in its metadata. An image created on a Mac (gamma 1.8) displays correctly on a Windows PC (gamma 2.2) without manual color correction. This was a genuine problem in the 1990s when cross-platform consistency was rare. **CRC checksums**: Every PNG chunk carries a CRC-32 checksum. Corrupted downloads are detected immediately instead of producing a half-rendered image. ## Detecting PNG by Reading the File Signature Do not trust the `.png` extension. Read the first eight bytes and check the signature. Exact byte layout: ``` Bytes 0–7: Signature 89 50 4E 47 0D 0A 1A 0A Bytes 8–11: Chunk length (big-endian uint32) Bytes 12–15: Chunk type: "IHDR" (image header) Bytes 16–19: Image width (big-endian uint32) Bytes 20–23: Image height (big-endian uint32) Byte 24: Bit depth Byte 25: Color type Byte 26: Compression method (always 0) Byte 27: Filter method (always 0) Byte 28: Interlace method (0 or 1) ``` TypeScript in the browser: ```typescript async function isPng(file: File): Promise { const buffer = await file.slice(0, 8).arrayBuffer() const bytes = new Uint8Array(buffer) const signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a] return bytes.length === 8 && bytes.every((b, i) => b === signature[i]) } ``` ### Python ```python def is_png(path: str) -> bool: with open(path, "rb") as f: header = f.read(8) return header == b"\x89PNG\r\n\x1a\n" ``` Higher-level option with the standard library: ```python import imghdr if imghdr.what("image.png") == "png": pass ``` Or with Pillow: ```python from PIL import Image try: with Image.open("image.png") as img: is_png = img.format == "PNG" except Exception: is_png = False ``` ### Go ```go func isPng(path string) bool { f, err := os.Open(path) if err != nil { return false } defer f.Close() buf := make([]byte, 8) if _, err := f.Read(buf); err != nil { return false } return bytes.Equal(buf, []byte{0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}) } ``` ### PHP ```php function isPng(string $path): bool { $header = file_get_contents($path, false, null, 0, 8); return $header === "\x89PNG\r\n\x1a\n"; } ``` With `fileinfo`: ```php $finfo = new finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file('image.png'); // image/png ``` ### ImageMagick CLI ```bash magick identify -verbose image.png | grep "Format:" # Format: PNG (Portable Network Graphics) ``` Or simply: ```bash file image.png # image.png: PNG image data, 1200 x 675, 8-bit/color RGBA, non-interlaced ``` ## PNG's Limitations PNG is not perfect. Its design choices were trade-offs, and some of those trade-offs still cost us today. **No built-in animation**: The PNG Working Group explicitly rejected animation. They wanted to solve the static-image problem completely before adding complexity. The result: animated GIF survived for another two decades. APNG (Animated PNG) was eventually standardized in 2004, but browser support remained patchy until the late 2010s. Even today, animated GIFs outnumber APNGs by orders of magnitude. **Large file sizes for photographs**: A 12 MP photograph as PNG is typically **15–25 MB**. As JPEG quality 90, it is **3–5 MB**. PNG's lossless compression cannot compete with JPEG's DCT-based psycho-visual discard. For photographs, PNG is the wrong tool. **No CMYK support**: PNG is RGB-only. Print workflows that require CMYK separation must convert PNG to TIFF or JPEG. This was a deliberate choice — the designers focused on screen display, not print — but it limits PNG's usefulness in professional publishing. **Slower decode than JPEG**: PNG decoding requires inverse filtering per scanline and DEFLATE decompression. JPEG decoding is highly parallelizable and heavily optimized in hardware. On mobile devices, a large PNG can take 2–3× longer to render than an equivalent-resolution JPEG, delaying Largest Contentful Paint. **No progressive quality**: Unlike JPEG 2000 or JPEG XL, PNG cannot produce a lower-quality preview from a truncated file. Either you have the whole file, or you have nothing. Adam7 interlacing helps with coarse previews, but it does not reduce total file size. ## Why PNG Never Replaced JPEG This is the most common misconception about image formats. PNG and JPEG were never competing for the same job. JPEG is a **lossy psycho-visual compressor**. It throws away data your eyes were unlikely to notice. It was designed for continuous-tone photographs — images with smooth gradients, fine texture, and natural lighting. For that job, JPEG is still unbeatable on the size-quality curve after thirty-three years. PNG is a **lossless data compressor**. It preserves every bit. It was designed for discrete-tone images — screenshots, UI elements, diagrams, logos, text overlays — where sharp edges and exact colors matter. For that job, PNG is the standard. The two formats carved out separate territories: | Use case | Right format | Why | | ------------------------------ | ------------ | ---------------------------------- | | Photographs | JPEG/AVIF | Lossy compression is 5–10× smaller | | Screenshots | PNG/WebP | Lossless preserves text sharpness | | Logos with transparency | PNG/WebP | Alpha channel + lossless edges | | UI icons | PNG/SVG | Small size, exact color match | | Scientific data visualizations | PNG | No artifacts in gradient legends | | Print-ready images | TIFF/JPEG XL | CMYK support, high bit depth | PNG never set out to replace JPEG. It just found a different job. ## Where PNG Stands Today The 2025 Web Almanac puts PNG at **roughly 22%** of all images served on the web. That is down from its peak — WebP and AVIF are eating share — but PNG remains the fallback format that every browser, every image editor, and every operating system can open without hesitation. **WebP** (Google, 2010) supports both lossy and lossless modes, plus animation and transparency. A lossless WebP is typically 20–30% smaller than an equivalent PNG. Browser support is universal since 2020. For new projects, WebP lossless is the pragmatic replacement for PNG in most cases. **AVIF** (AOM, 2019) achieves even better compression, but its lossless mode is slower to encode and decode than PNG. AVIF also lacks full browser support for some advanced PNG features like 16-bit channels and embedded gamma correction. **SVG** owns the icon and logo space for simple vector graphics, but rasterized complex graphics still need PNG. The practical reality: PNG is not going away. It is the safe default, the format you export to when you need to guarantee that the recipient can open the file. It is the QWERTY of image formats — not optimal, but universally understood. ## The Future of PNG PNG is a finished standard. The specification has not changed meaningfully since 2003. That stability is a feature, not a bug. You can open a PNG created in 1997 in any modern browser and it will render identically. But the ecosystem around PNG continues to evolve: **APNG** is gaining ground. Safari has supported it since 2014. Chrome and Firefox followed. Discord, Slack, and Twitter all render APNGs natively. For short UI animations — loading spinners, reaction emojis, status indicators — APNG is replacing animated GIF with smaller files and better color fidelity. **PNG optimization tools** keep improving. `oxipng`, `pngcrush`, and `zopfli` can shave another 10–30% off PNG file sizes by brute-forcing better filter combinations and DEFLATE parameters. For high-traffic sites, running every PNG through `oxipng` is standard practice. **PNG as a container**: Some modern workflows embed ICC color profiles, EXIF metadata, and even XMP data inside PNG chunks. PNG has become a lightweight archival format — not as rich as TIFF, but far more portable. **The long-term outlook**: PNG will coexist with WebP, AVIF, and JPEG XL for years. It fills a niche that no other format owns completely: lossless, patent-free, universally supported, and simple enough that a single developer can write a decoder from the specification in a week. That combination is hard to displace. ## The Bottom Line PNG was created because developers were fed up. A patent lawsuit threatened the open web, and a group of developers built an alternative in their spare time. They did not set out to create a thirty-year standard. They set out to solve one problem: how to put a transparent logo on a web page without paying a license fee. The result was far better than anyone expected. PNG gave the web true-color graphics, smooth transparency, and corruption-resistant file integrity. It proved that open standards, built by volunteers, could beat proprietary formats backed by large companies. It is not the smallest format. It is not the fastest to decode. It does not do animation well, and it is hopeless for photographs. But when you need to know that every pixel you saved is the pixel you will get back — PNG is still the tool you reach for. Not every image starts out as a PNG. If you have JPGs that need transparency or lossless editing, you can convert them right in your browser — no software to install, nothing leaves your device. [JPG to PNG](/tools/jpg-to-png) handles it locally. For web work where file size matters, [JPG to WebP](/tools/jpg-to-webp) shrinks the files without touching quality. And when you need favicon icons, [JPG to ICO](/tools/jpg-to-ico) turns photos into ICO files at multiple sizes. ### The Secret Life of JPEG: How a 1992 Format Took Over the Internet Published: 2026-05-22 JPEG is not magic. It is a pipeline of discrete cosine transforms, quantization tables, and chroma subsampling that throws away data your eyes were unlikely to notice. Thirty-three years later, it still dominates for one reason: everything opens it. If you open a `.jpg` in a hex editor, the first two bytes: ``` FF D8 ``` That is the **Start of Image** marker, the signature every JPEG decoder checks for before it does anything else. The bytes that follow describe the JPEG flavor, the color space, and where the pixel data begins. The format predates the web browser, yet the 2025 Web Almanac estimates it still carries roughly **57% of all images served on the modern web**. ## The storage crisis that created JPEG In 1986, a raw 640 × 480 grayscale image ate **307 KB** of disk space. A color image at the same resolution needed **921 KB**. At a time when a 20 MB hard drive cost hundreds of dollars and 1.44 MB floppy disks were the standard exchange medium, a single uncompressed photo could fill two-thirds of a disk. The need was obvious: a standard compression format for continuous-tone images, photographs, not line art. Multiple groups were working on the problem. The **Joint Photographic Experts Group**, formed in 1986 by ISO/IEC and ITU-T, merged the best ideas into a single draft. After six years of refinement, the standard was published in 1992 as **ISO/IEC 10918-1**. JPEG was never intended to be the only image format. It was designed for one job: making photographs small enough to store and transmit. It does that job by discarding information in a very specific order. ## Why JPEG compresses so well JPEG compression is a pipeline, not a single algorithm. Each stage removes data that the human visual system is least likely to miss. ### 1. Color space conversion (RGB → YCbCr) Your screen displays RGB. JPEG stores **YCbCr**. The `Y` channel carries luminance (brightness). `Cb` and `Cr` carry chrominance (blue-difference and red-difference). This matters because the human eye has about **2.5 million cone cells** tuned to brightness and only **100,000** tuned to color. We see luminance detail far better than color detail. ### 2. Chroma subsampling Most JPEGs use **4:2:0 subsampling**. For every 4 luminance samples, there is 1 Cb sample and 1 Cr sample. That means the chroma channels are stored at **one-quarter the resolution** of the luma channel. For a 4000 × 3000 image, the Y plane is full resolution. The Cb and Cr planes are 2000 × 1500 each. You just cut the raw data by roughly 50% before any real compression even starts, and most viewers never notice. ### 3. The discrete cosine transform (DCT) The image is split into **8 × 8 pixel blocks**. Each block is run through a DCT, which converts spatial data (pixel values) into frequency data (how fast the values change across the block). The result is an 8 × 8 matrix of coefficients. The top-left value is the **DC coefficient**, the average brightness of the block. The other 63 are **AC coefficients** representing increasingly high-frequency detail. High-frequency coefficients encode fine texture: hair, grass, noise. Low-frequency coefficients encode broad shapes: skies, walls, skin tones. ### 4. Quantization Here is where the loss happens. JPEG applies a **quantization table** to each DCT block. The table is a second 8 × 8 matrix of divisors. Each DCT coefficient is divided by its matching quantizer and rounded to the nearest integer. The standard quantization table hammers high-frequency coefficients hardest: ``` 16 11 10 16 24 40 51 61 12 12 14 19 26 58 60 55 14 13 16 24 40 57 69 56 14 17 22 29 51 87 80 62 18 22 37 56 68 109 103 77 24 35 55 64 81 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99 ``` A high-frequency coefficient of, say, 7 gets divided by 121 and rounded to **0**. It is gone. Irreversible. The decoder never sees it. That is lossy compression: data is destroyed, not just re-encoded. At quality 90, the quantizers are divided by a smaller scaling factor. At quality 50, the scaling factor is higher. More coefficients zero out. The file gets smaller. The image gets softer. ### 5. Entropy coding After quantization, the remaining coefficients are zig-zag scanned, run-length encoded, and compressed with **Huffman coding**. This stage is lossless. It only packs the already-destroyed data more efficiently. The result: a 12 MP uncompressed RGB image is **36 MB**. Save it as JPEG quality 90 with 4:2:0 subsampling and it drops to **~3.5 MB**. That is a **10:1 reduction** with visible quality loss only under magnification. ## How lossy is it, really? The damage is not evenly distributed. | Quality | Typical size (12 MP) | Visual impact | | ------- | -------------------- | ------------------------------------------------- | | 95+ | ~8 MB | Nearly invisible; preferred for archiving | | 90 | ~3.5 MB | Minor softening; standard for cameras | | 75 | ~1.8 MB | Visible blur in fine detail; web default | | 50 | ~1.0 MB | Blocking artifacts obvious at 100% zoom | | 30 | ~600 KB | Color banding, mosquito noise, unusable for print | Three distinct artifacts appear as quality drops: - **Blocking**: Visible 8 × 8 grid edges, especially in smooth gradients like skies. - **Ringing**: Oscillating halos around high-contrast edges (text next to background). - **Color bleeding**: Chroma subsampling smears color across sharp boundaries. The real killer is **generation loss**. Open a JPEG, edit it, save as JPEG again. Each save re-runs the entire pipeline: RGB → YCbCr → subsample → DCT → quantize. The rounding errors compound. After 10 generations, an image can look like it was painted in watercolor. After 50, it is unrecognizable. ## The green shift and other re-compression quirks Re-save a JPEG enough times and you may notice the color temperature drifting. Some images take on a subtle green cast. Others shift magenta. The reason is buried in the chroma channels. JPEG stores Cb and Cr at reduced resolution and quantizes them aggressively. Each save introduces rounding error in both channels. The conversion back to RGB uses this matrix: ``` R = Y + 1.402 × (Cr - 128) G = Y - 0.344136 × (Cb - 128) - 0.714136 × (Cr - 128) B = Y + 1.772 × (Cb - 128) ``` Notice that **green is computed from both Cb and Cr**. When repeated quantization nudges Cb upward and Cr downward by even a single quantization step, the `G` channel drifts. A positive bias in Cb pushes green down. A negative bias in Cr pushes green up. The interaction is not symmetric because the coefficients `-0.344136` and `-0.714136` have different magnitudes. The result is a slow accumulation of green in some image regions, especially where the original chroma values were already near quantization boundaries. This is not a guaranteed effect. It depends on the encoder's quantization tables, the subsampling mode, and the image content. But it is real and reproducible, and it is one reason professional workflows avoid re-saving JPEGs. ## If JPEG is so flawed, why does everything use it? JPEG did not become popular because it is perfect. It became popular because it is good enough and works everywhere. Several things keep it in place. The baseline JPEG patent held by Forgent Networks expired in 2006, so the format is royalty-free. Every camera, phone, printer, and browser already has a JPEG decoder in silicon or heavily optimized C, so rendering costs almost nothing. For social media, news sites, and email attachments, a quality 75 JPEG is usually indistinguishable from the source on a phone screen. And content management systems, CDNs, image libraries, and legacy archives all speak JPEG. Replacing them takes more than a better format; it takes a better format plus a reason to migrate petabytes of existing assets. ## The formats that should have won Several formats have tried to dethrone JPEG. None have succeeded completely. | Format | Lossy | Lossless | Transparency | Animation | Max bit depth | Key advantage | | ------- | ----- | -------- | ------------ | --------- | ------------- | ----------------------------------------------- | | JPEG | Yes | No | No | No | 8-bit | Universal support | | PNG | No | Yes | Yes | No | 16-bit | Perfect lossless, alpha | | WebP | Yes | Yes | Yes | Yes | 8-bit | 25–35% smaller than JPEG, browser-native | | HEIC | Yes | Yes | Yes | Yes | 16-bit | ~50% smaller than JPEG, Apple's default | | AVIF | Yes | Yes | Yes | Yes | 12-bit | Best compression today, royalty-free | | JPEG XL | Yes | Yes | Yes | Yes | 32-bit | Lossless JPEG recompression, progressive decode | **PNG** solved the lossless problem but produces files 5–10× larger than JPEG for photos. It owns screenshots, UI assets, and graphics. **WebP** (Google, 2010) beats JPEG on size and adds transparency and animation. It now ships in every major browser. The 2025 Web Almanac puts WebP at **11%** of LCP images, up from 7% in 2024. It is the safe upgrade path today. **HEIC** (Apple, 2017) uses HEVC compression inside an ISOBMFF container. It is ~40–50% smaller than JPEG and holds multiple images per file. It dominates the Apple ecosystem and stalls everywhere else because of HEVC patent pools. **AVIF** (AOM, 2019) derives from AV1 video. It achieves the best compression ratios of any widely supported format, roughly 30% smaller than WebP at equivalent quality. The downside is **decode speed**. AVIF images can take 2–3× longer to render than JPEG on mobile devices, eating battery and delaying Largest Contentful Paint. **JPEG XL** (ISO/IEC 18181, 2021) is technically superior to all of them. It compresses 50–60% smaller than JPEG. It decodes fast. It supports progressive decoding: a usable image appears after downloading only ~1% of the file. Most importantly, it can **losslessly recompress existing JPEGs** for ~20% size savings with bit-for-bit recovery of the original. That combination is unique among current formats. ## Where we are now JPEG XL has had a rough ride. Google added experimental support to Chrome in 2021, then **removed it on October 31, 2022** (the "Halloween decision"). The stated reason: insufficient incremental benefit over existing formats. The backlash was immediate. The Chromium issue became the second most-starred in the project's history. Google was accused of protecting AVIF, a format tied to the Alliance for Open Media that Google co-founded. In late 2025, Chromium reversed course. A new Rust decoder (`jxl-rs`) landed in Chrome Canary. **Chrome 145**, released February 2026, shipped JPEG XL support behind a flag. Safari has supported it since 2023. Firefox Nightly is integrating the same Rust decoder. JPEG XL is not enabled by default yet, but it is back in the codebase. AVIF, meanwhile, is the pragmatic choice for 2026. Browser support is broad. Encoders are improving. Cloudinary and Cloudflare both serve AVIF automatically via `Accept` header negotiation. The median page serving AVIF or WebP shows **81% good LCP rates** versus **64%** for JPEG-only pages, per CoreDash data. ## What this means in practice JPEG is a 33-year-old compromise. It trades color resolution, high-frequency texture, and numerical precision for file sizes that made digital photography practical in the 1990s. The artifacts are well understood, generation loss is measurable, and the green drift is documented. JPEG keeps going for much the same reason QWERTY does: the cost of switching is higher than the cost of staying. In practice, the sensible approach is to keep three habits. Archive originals as PNG, TIFF, or quality 95+ JPEG, and never re-edit from a quality 75 web export. Serve modern formats dynamically through a CDN or image service that negotiates AVIF, WebP, or JPEG XL from the browser's `Accept` header. Store one master and let the edge convert on demand. And avoid batch-re-encoding JPEGs; each generation destroys data, so if you need smaller files, re-encode from the master rather than from another JPEG. JPEG will not disappear overnight. It will fade the way GIF did, still supported and still opening in most viewers, but increasingly outclassed by formats that do the same job with fewer bytes and fewer artifacts. This time, the replacements are gaining ground for real. ### What Is HEIC? A Technical Deep Dive into File Signatures, Detection, and Conversion Published: 2026-05-22 HEIC is not just a smaller JPEG. It is a container format based on ISO Base Media File Format with HEVC-encoded images inside. Here is how it works, how to detect it by reading raw bytes, and how to convert it when compatibility fails. Open a HEIC file in a hex editor. The first twelve bytes: ``` 00 00 00 18 66 74 79 70 68 65 69 63 ``` That is ISOBMFF — the same container standard MP4 uses. `0x18` (24 bytes) is the box size, `ftyp` is the file type box, `heic` is the major brand. A HEIC file is not an image encoding. It is a container with a brand marker, holding HEVC-encoded images. ## What HEIC Actually Is HEIC = **High Efficiency Image Container**. Apple's branded take on HEIF, standardized by MPEG as ISO/IEC 23008-12 in 2015. JPEG is both a compression algorithm and a file format. HEIC is only a container. The compression inside is HEVC (H.265), the same codec used for 4K video. One HEIC file can hold: - One primary image - Multiple alternate images (burst shots) - Image sequences (Live Photos: still + 3-second video) - Alpha channels and depth maps - 16-bit color depth per channel (JPEG caps at 8-bit) The container uses boxes — same structure as MP4: | Box | Purpose | | ------ | --------------------------------------- | | `ftyp` | File type and compatibility brands | | `meta` | Item metadata and properties | | `mdat` | Raw encoded image data (HEVC bitstream) | | `iloc` | Item locations within `mdat` | That extensibility lets HEIC do things JPEG never could. Parsing it means understanding the box hierarchy, not just reading a raw bitstream. ## Why Apple Switched Apple did not invent HEIC. MPEG published HEIF in 2015. Apple adopted it as the iPhone default in iOS 11 (2017). The switch was arithmetic, not marketing. A 12MP iPhone photo in JPEG is ~3.5 MB. In HEIC, ~1.8 MB. At 50 GB of free iCloud storage, that gap means roughly 14,000 extra photos. Apple sells storage tiers. The math writes itself. There was also ecosystem alignment. Apple already used HEVC for video (H.265 in iOS 11). Reusing the same codec for still images meant shared hardware decode blocks on A-series chips, lower power draw, and one licensing path. ## The Trade-offs HEIC beats JPEG on nearly every metric except compatibility. | Aspect | HEIC | JPEG | | ------------------------ | ------------------------------- | -------------------- | | Compression efficiency | ~40–50% smaller at same quality | Baseline | | Color depth | Up to 16-bit | 8-bit | | Transparency | Yes | No | | Multiple images per file | Yes | No | | Lossless re-edit | Yes | No | | Native Windows support | Requires HEIF extension | Universal | | Web browser support | Safari only | Universal | | Android support | Native on 9+ | Universal | | Patent licensing | HEVC patent pool | JPEG is royalty-free | HEVC sits under multiple patent pools (MPEG LA, Access Advance). Apple covers the fees for iOS users. Third-party vendors do not have that luxury. That uncertainty is a large part of why adoption outside the Apple ecosystem stalled. ## Detecting HEIC by Reading the File Signature Do not trust the `.heic` extension. Read the first 32 bytes and parse the `ftyp` box. Exact byte layout of a valid HEIC header: ``` Bytes 0–3: Box size (big-endian uint32) Bytes 4–7: Box type: "ftyp" (0x66 0x74 0x79 0x70) Bytes 8–11: Major brand: "heic" or "heif" or "mif1" Bytes 12–15: Minor version (usually 0x00000000) Bytes 16+: Compatible brands list (e.g., "mif1", "heic", "MiHE") ``` TypeScript in the browser: ```typescript async function isHeic(file: File): Promise { const buffer = await file.slice(0, 32).arrayBuffer() const bytes = new Uint8Array(buffer) if (String.fromCharCode(...bytes.slice(4, 8)) !== "ftyp") return false const brand = String.fromCharCode(...bytes.slice(8, 12)) return ["heic", "heif", "mif1", "msf1"].includes(brand) } ``` Our converter runs this check before attempting decode. Wrong brand = instant rejection, no wasted CPU. ### Python ```python def is_heic(path: str) -> bool: with open(path, "rb") as f: header = f.read(32) if len(header) < 12: return False if header[4:8].decode("ascii", errors="ignore") != "ftyp": return False return header[8:12].decode("ascii", errors="ignore") in {"heic", "heif", "mif1", "msf1"} ``` Higher-level option with `filetype`: ```python import filetype kind = filetype.guess("photo.heic") if kind and kind.extension in ("heic", "heif"): print(kind.mime) # image/heic ``` Or `pillow-heif`: ```python from pillow_heif import is_heif if is_heif("photo.heic"): # valid container pass ``` ### Go ```go func isHeic(path string) bool { f, err := os.Open(path) if err != nil { return false } defer f.Close() buf := make([]byte, 32) if _, err := f.Read(buf); err != nil { return false } if string(buf[4:8]) != "ftyp" { return false } brand := string(buf[8:12]) return brand == "heic" || brand == "heif" || brand == "mif1" || brand == "msf1" } ``` ### PHP ```php function isHeic(string $path): bool { $header = file_get_contents($path, false, null, 0, 32); if (strlen($header) < 12) return false; if (substr($header, 4, 4) !== 'ftyp') return false; return in_array(substr($header, 8, 4), ['heic', 'heif', 'mif1', 'msf1'], true); } ``` With `fileinfo`: ```php $finfo = new finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file('photo.heic'); // image/heic or image/heif ``` ### ImageMagick CLI ImageMagick 7+ with libheif: ```bash magick identify -verbose photo.heic | grep "Format:" # Format: HEIC (High Efficiency Image Container) ``` Without libheif, you get `no decode delegate for this image format`. On most Linux distros, `libheif-examples` provides `heif-convert` as a fallback. ## The Conversion Path Knowing a file is HEIC does not open it. Windows needs the [HEIF Image Extensions](https://www.microsoft.com/store/productId/9PMMSR1CGPWG). Most browsers refuse to render HEIC in `` tags. Android 9+ handles it natively; older devices do not. The fix: convert. Our [HEIC to JPG converter](/tools/heic-to-jpg) runs the entire pipeline in your browser: 1. **Drop files** — single photos or entire folders, batch processing automatic. 2. **Signature validation** — the exact byte check above runs on every file. Non-HEIC files are rejected immediately with a clear mismatch message. 3. **Client-side decoding** — a WebAssembly build of libheif runs locally. No uploads. No server. 4. **Quality-preserving output** — JPG at 90% quality keeps original resolution and color accuracy. 5. **Batch download** — individual files or a single ZIP archive. For lossless output with transparency: [HEIC to PNG](/tools/heic-to-png). For web-optimized sizes: [HEIC to WebP](/tools/heic-to-webp). Your files never leave your device. That is the point. ## Legal ### Privacy Policy Last updated: May 18, 2026 **Overview** File Convert Factory ("we", "us", or "our") operates our website. We are committed to protecting your privacy. This policy explains what information we collect, how we use it, and your rights. **Data Processing** All image conversions on File Convert Factory run entirely in your browser using WebAssembly technology. Your images are never sent to our servers. We do not store, log, or have access to any content you process using our tools. **Information We Collect** We collect minimal, non-personal information through third-party services: - Google Analytics — We use Google Analytics to understand how visitors use our site (page views, device type, country). This data is aggregated and anonymous. Google may set cookies on your browser. See Google's Privacy Policy. - Google AdSense — We use Google AdSense to display ads. Google may use cookies and tracking technologies to serve personalized ads based on your browsing history. See How Google uses information from sites that use its services. **Cookies** We do not set any first-party cookies. Third-party services (Google Analytics and Google AdSense) may set cookies on your browser. You can control cookie behavior through your browser settings. **Local Storage** We use your browser's local storage to save preferences such as recently used tools. This data never leaves your device and can be cleared through your browser settings. **Third-Party Links** Our site may contain links to third-party websites. We are not responsible for the privacy practices of those sites. **Children's Privacy** Our service is not directed at children under 13. We do not knowingly collect personal information from children. **Changes to This Policy** We may update this privacy policy from time to time. Changes will be posted on this page with an updated date. **Contact** If you have questions about this privacy policy, please reach out to us. ### Terms of Service Last updated: May 18, 2026 **Acceptance of Terms** By accessing and using File Convert Factory, you agree to be bound by these Terms of Service. If you do not agree to these terms, please do not use our service. **Description of Service** File Convert Factory provides free, browser-based image conversion tools including but not limited to HEIC to JPG conversion. All conversions run entirely client-side in your browser. **Use of Service** You agree to use File Convert Factory only for lawful purposes. You may not: - Use the service for any illegal or unauthorized purpose - Attempt to interfere with or disrupt the service - Attempt to gain unauthorized access to the service or its systems - Use automated tools to scrape or overload the service **Your Data** All data processing happens locally in your browser. We do not store, transmit, or have access to any data you input into our tools. You are solely responsible for the data you process and any output generated. **Disclaimer of Warranties** File Convert Factory is provided "as is" and "as available" without warranties of any kind, either express or implied. We do not guarantee that the service will be uninterrupted, error-free, or that results from the tools will be accurate or reliable. You use the service at your own risk. **Limitation of Liability** To the fullest extent permitted by law, File Convert Factory and its creators shall not be liable for any indirect, incidental, special, consequential, or punitive damages resulting from your use of or inability to use the service. **Intellectual Property** The File Convert Factory name, logo, design, and code are the property of their respective owners. You may not copy, modify, or distribute any part of the service without permission. **Changes to Terms** We reserve the right to modify these terms at any time. Continued use of the service after changes constitutes acceptance of the updated terms. **Contact** If you have questions about these terms, please reach out to us. ## Optional - [Sitemap](https://file-convert-factory.org/sitemap.xml): Complete URL inventory for all 6 supported locales. - [LLMs.txt](https://file-convert-factory.org/llms.txt): Concise curated index with links to key pages. - [Agents.txt](https://file-convert-factory.org/agents.txt): Agent capability declaration (read-only site, no API or MCP). This site supports 6 locales: en, de, pt, ru, zh-Hans, zh-Hant. All non-English content is available at the corresponding /{locale}/ path.