Limitations
editThe library never decodes or encodes a file approximately: a feature it does not support throws an UnsupportedImageFeatureException, and a conversion that would lose information needs an explicit setting. This page lists the main gaps. Each format page gives the details of its format.
General
- No extension points. There is no public allocator, custom pixel type, codec plug-in or custom image processor.
- No CMYK pixel format. CMYK JPEG and TIFF files are converted to RGB when they are loaded, with an explicit
CmykConversionoption; CMYK cannot be written. See Color management. - No floating-point grayscale. RgbaFloat and RgbaHalf are the floating-point formats. OpenEXR and TIFF read and write them; the other encoders need an explicit reduction to 16 bits.
- No scaled or region decoding. An image is decoded at its full size; resize it afterward.
- Color profiles are never applied implicitly. Colors change only when you convert them (ConvertColorProfile). See Color management.
- Color management covers ICC versions 2 and 4 grayscale, RGB and CMYK profiles, and device-link and abstract profiles in sequences of profiles; no iccMAX or named-color profiles. CMYK samples are not a pixel format and no encoder writes them. Gamut mapping is per-channel clipping or a chroma reduction, opt-in.
Formats
| Format | Main limitations |
|---|---|
| JPEG | Hierarchical JPEG, JPEG-LS and lossless JPEG with arithmetic coding are not read. Writing is 8-bit baseline or progressive only (no 12-bit, lossless, arithmetic or CMYK), one frame. Gain maps are only read by AuxiliaryImageCollection and are not written. |
| GIF | At most 256 colors per frame and one fully transparent color; plain-text extensions are rejected. |
| PNG / APNG | Sub-byte grayscale requires PngOptimization.MinimumSize or PngOptimization.Layout (still images), and APNG delta rectangles OptimizeFrames or MinimumSize; palettes are selected by MinimumSize, Layout or PngPixelLayout.Indexed. Sequential writers fix their layout and palette from the first image. Unknown ancillary chunks are not kept. |
| WebP | 8-bit RGB(A) only; lossy output is 4:2:0; animations need a seekable destination. |
| QOI | 8-bit RGB(A) only, one still image, no metadata. |
| BMP | No embedded JPEG/PNG payloads, no embedded ICC profile; one still image is written. |
| TGA | No premultiplied alpha; true-color and grayscale output only, no metadata. |
| Netpbm | Only the first image of a concatenation is read; no metadata. |
| TIFF | Old-style JPEG compression, YCbCr data in separate planes, L*a*b* and some extra-sample layouts are not read. Writing uses chunky samples (no separate planes), one page per Save (use ImageCollection for documents) and a seekable destination. |
| ICO / CUR | At most 256 pixels per side; 32-bit DIB or PNG representations are written. |
| ANI | One representation per frame; always loops; needs a seekable destination. |
| AVIF | Gain maps, depth maps and thumbnails are only read by AuxiliaryImageCollection; gain maps are not written. Sequences need a seekable destination; the encoder is single-threaded except for grid tiles. |
| HEIC | Bit depths above 12, multilayer and 3D extensions are not read; bursts and live-photo videos are ignored, depth maps, thumbnails and gain maps are only read by AuxiliaryImageCollection (Apple's gain map parameters, in maker notes, are not read). Sequences need a seekable destination. |
| JPEG XL | Floating-point samples, more than 16 bits, premultiplied alpha and CMYK are not read; lossy decoding is close to, not identical with, the reference decoder. Writing has no layers or blending. |
| JPEG 2000 | Signed samples, more than 16 bits and Part 2 extensions are not read; no decoding of fewer quality layers; a region decode reads the whole compressed data of each tile it meets. Writing has no precincts and no tile-parts beyond one per tile; HTJ2K output has one quality layer and no HT refinement passes. |
| OpenEXR | Multi-part files, deep data, DWA/HTJ2K/ZSTD compressions and chroma (RY, BY) channels are not read; other channels than R, G, B, A and Y, and an overscan, need a layer or a window mode (OpenExrDecodingOptions). Writing uses lossless scan-line compression, but alpha premultiplication and sample conversion can change source pixels. |
Processing
- Convolution matrices have odd dimensions and no divisor (divide the weights).
- Edge detection has no non-maximum suppression or thresholds (no Canny detector).
- Histograms, equalization and auto-levels work on integer pixel formats only.
Drawing and text
- Drawing is sequential: it does not use several threads.
- No mesh gradients.
- Text lines are broken greedily; no word lists are provided for the scripts that need a dictionary to find word boundaries.
- No AAT (
morx,kerx) shaping, no subpixel (LCD) rendering, no ruby in vertical text. - Hinting is opt-in and horizontal only.
- Installed fonts are used only when you ask for them (Font.LoadInstalled, FontStack.WithInstalledFallback).
- No SVG glyphs, Type 1 fonts or fonts without outlines.