{
  "schema_version": "1.0.0",
  "dataset_id": "formattailor-image-format-capabilities",
  "title": "FormatTailor browser image-format capability map",
  "canonical_url": "https://formattailor.tech/image-format-compatibility/",
  "last_reviewed": "2026-08-21",
  "scope": "A product capability map for the current FormatTailor web application. It documents accepted inputs, offered outputs, implementation paths, and runtime checks; it is not a universal browser-support table.",
  "status_definitions": {
    "available": "The current FormatTailor interface offers this path, while still rejecting malformed files and results outside the documented safety limits.",
    "conditional": "FormatTailor accepts or requests the format, but success depends on the current browser, the particular file, and the documented runtime checks.",
    "not-offered": "The current FormatTailor interface does not offer this format as an output."
  },
  "implementation_snapshot": {
    "reviewed_files": [
      "src/components/ToolWorkspace.tsx",
      "src/lib/image.ts",
      "src/lib/format.ts",
      "package-lock.json"
    ],
    "decode_order": [
      "Try createImageBitmap with imageOrientation set to from-image.",
      "If unavailable or unsuccessful, try an HTMLImageElement backed by a local blob URL.",
      "For HEIC or HEIF only, lazy-load the bundled heic2any decoder and then decode its first returned image."
    ],
    "encode_rule": "Draw decoded pixels to a two-dimensional canvas, call HTMLCanvasElement.toBlob, and reject a result whose MIME type differs from the requested type.",
    "privacy_boundary": "Selected file bytes are handled by browser file, blob, image-decoding, canvas, and download APIs. The site still makes ordinary requests for its HTML, CSS, JavaScript, and any lazily loaded decoder code."
  },
  "product_limits": {
    "max_source_bytes": 41943040,
    "max_decoded_dimension_px": 16384,
    "max_decoded_pixels": 50000000,
    "max_output_dimension_px": 8000,
    "max_output_pixels": 50000000
  },
  "formats": [
    {
      "id": "jpeg",
      "name": "JPEG",
      "extensions": [
        ".jpg",
        ".jpeg"
      ],
      "mime_types": [
        "image/jpeg"
      ],
      "accepted_as_input": true,
      "input_status": "available",
      "decode_path": "Browser-native image decoder.",
      "offered_as_output": true,
      "output_status": "conditional",
      "encode_path": "Canvas toBlob request for image/jpeg; returned MIME type is checked.",
      "alpha": "none",
      "important_limit": "JPEG output is lossy and transparent pixels require a chosen solid background.",
      "evidence_source_ids": [
        "jpeg-t81",
        "html-canvas",
        "mdn-bcd"
      ]
    },
    {
      "id": "png",
      "name": "PNG",
      "extensions": [
        ".png"
      ],
      "mime_types": [
        "image/png"
      ],
      "accepted_as_input": true,
      "input_status": "available",
      "decode_path": "Browser-native image decoder.",
      "offered_as_output": true,
      "output_status": "available",
      "encode_path": "Canvas toBlob request for image/png; returned MIME type is checked.",
      "alpha": "supported-by-format",
      "important_limit": "PNG is lossless, so photographic output can be much larger than JPEG or WebP.",
      "evidence_source_ids": [
        "png-3",
        "html-canvas",
        "mdn-bcd"
      ]
    },
    {
      "id": "webp",
      "name": "WebP",
      "extensions": [
        ".webp"
      ],
      "mime_types": [
        "image/webp"
      ],
      "accepted_as_input": true,
      "input_status": "conditional",
      "decode_path": "Browser-native image decoder.",
      "offered_as_output": true,
      "output_status": "conditional",
      "encode_path": "Canvas toBlob request for image/webp; silent PNG fallback is rejected.",
      "alpha": "supported-by-format",
      "important_limit": "Encoding quality and file size vary by browser implementation and source content.",
      "evidence_source_ids": [
        "webp-container",
        "html-canvas",
        "mdn-bcd"
      ]
    },
    {
      "id": "avif",
      "name": "AVIF",
      "extensions": [
        ".avif"
      ],
      "mime_types": [
        "image/avif"
      ],
      "accepted_as_input": true,
      "input_status": "conditional",
      "decode_path": "Browser-native image decoder only; there is no bundled AVIF fallback decoder.",
      "offered_as_output": false,
      "output_status": "not-offered",
      "encode_path": null,
      "alpha": "supported-by-format",
      "important_limit": "A browser that cannot decode the selected AVIF file cannot use it in FormatTailor.",
      "evidence_source_ids": [
        "avif-spec",
        "mdn-bcd"
      ]
    },
    {
      "id": "heic-heif",
      "name": "HEIC / HEIF",
      "extensions": [
        ".heic",
        ".heif"
      ],
      "mime_types": [
        "image/heic",
        "image/heif"
      ],
      "accepted_as_input": true,
      "input_status": "conditional",
      "decode_path": "Try the browser decoder first, then the locally loaded heic2any decoder.",
      "offered_as_output": false,
      "output_status": "not-offered",
      "encode_path": null,
      "alpha": "varies-by-file",
      "important_limit": "FormatTailor exports one decoded image; sequences, depth information, and unsupported variants may not survive or may fail to decode.",
      "evidence_source_ids": [
        "heif-standard",
        "heic2any"
      ]
    }
  ],
  "sources": [
    {
      "id": "html-canvas",
      "title": "HTML Living Standard: Serializing bitmaps to a file",
      "publisher": "WHATWG",
      "url": "https://html.spec.whatwg.org/multipage/canvas.html#serialising-bitmaps-to-a-file",
      "role": "web-standard"
    },
    {
      "id": "file-api",
      "title": "File API: Blob URLs",
      "publisher": "W3C",
      "url": "https://w3c.github.io/FileAPI/#blob-url",
      "role": "web-standard"
    },
    {
      "id": "mdn-bcd",
      "title": "MDN browser-compat-data",
      "publisher": "Open Web Docs and MDN contributors",
      "url": "https://github.com/mdn/browser-compat-data",
      "role": "compatibility-data"
    },
    {
      "id": "jpeg-t81",
      "title": "Recommendation T.81: Digital compression and coding of continuous-tone still images",
      "publisher": "ITU-T",
      "url": "https://www.itu.int/rec/T-REC-T.81",
      "role": "format-standard"
    },
    {
      "id": "png-3",
      "title": "Portable Network Graphics (PNG) Specification, Third Edition",
      "publisher": "W3C",
      "url": "https://www.w3.org/TR/png-3/",
      "role": "format-standard"
    },
    {
      "id": "webp-container",
      "title": "WebP Container Specification",
      "publisher": "Google",
      "url": "https://developers.google.com/speed/webp/docs/riff_container",
      "role": "format-standard"
    },
    {
      "id": "avif-spec",
      "title": "AV1 Image File Format (AVIF)",
      "publisher": "Alliance for Open Media",
      "url": "https://aomediacodec.github.io/av1-avif/",
      "role": "format-standard"
    },
    {
      "id": "heif-standard",
      "title": "ISO/IEC 23008-12:2022 High Efficiency Image File Format",
      "publisher": "ISO",
      "url": "https://www.iso.org/standard/83650.html",
      "role": "format-standard"
    },
    {
      "id": "heic2any",
      "title": "heic2any browser decoder repository",
      "publisher": "Alex Corvi and contributors",
      "url": "https://github.com/alexcorvi/heic2any",
      "role": "implementation-dependency"
    },
    {
      "id": "exifr",
      "title": "exifr metadata parser repository",
      "publisher": "Mike Kovarik and contributors",
      "url": "https://github.com/MikeKovarik/exifr",
      "role": "implementation-dependency"
    }
  ]
}
