Description
Now that libvips (vips-ffm) is integrated into core, we should expose a JPEG XL encoder as a libvips-backed image filter, mirroring the existing AVIF filter.
JPEG XL (.jxl) is a modern image format that the legacy pure-JVM (AWT/TwelveMonkeys) engine cannot produce. It typically yields smaller files than JPEG at equal quality and supports mathematically lossless encoding. libvips encodes it via its libjxl delegate, inferred from the .jxl output extension.
URL contract: filter=jxl&jxl_q=75 (also aliased as filter=jpegxl), with optional jxl_lossless and jxl_effort (1-9) parameters - matching the parameter convention of the other libvips filters.
This is a libvips-only capability with no legacy equivalent - exactly like avif and smartcrop. It is registered only in VipsImageFilterApiImpl, so it is selectable only when the libvips engine is active (IMAGE_API_USE_LIBVIPS=true and native libvips is present, resolved via ImageEngine.resolve()). When libvips is disabled the legacy engine has no knowledge of the jxl/jpegxl keys, so the filter is simply unavailable (no error). Because there is no JVM fallback for JPEG XL, no VipsLegacyFilters entry is added.
Acceptance Criteria
Priority
Medium
Additional Context
Mirrors VipsAvifImageFilter (dotCMS/src/main/java/com/dotmarketing/image/vips/). Requires the host libvips build to include the libjxl delegate; if absent the request fails like AVIF when libheif/AV1 is missing.
Description
Now that libvips (vips-ffm) is integrated into core, we should expose a JPEG XL encoder as a libvips-backed image filter, mirroring the existing AVIF filter.
JPEG XL (
.jxl) is a modern image format that the legacy pure-JVM (AWT/TwelveMonkeys) engine cannot produce. It typically yields smaller files than JPEG at equal quality and supports mathematically lossless encoding. libvips encodes it via itslibjxldelegate, inferred from the.jxloutput extension.URL contract:
filter=jxl&jxl_q=75(also aliased asfilter=jpegxl), with optionaljxl_losslessandjxl_effort(1-9) parameters - matching the parameter convention of the other libvips filters.This is a libvips-only capability with no legacy equivalent - exactly like
avifandsmartcrop. It is registered only inVipsImageFilterApiImpl, so it is selectable only when the libvips engine is active (IMAGE_API_USE_LIBVIPS=trueand native libvips is present, resolved viaImageEngine.resolve()). When libvips is disabled the legacy engine has no knowledge of thejxl/jpegxlkeys, so the filter is simply unavailable (no error). Because there is no JVM fallback for JPEG XL, noVipsLegacyFiltersentry is added.Acceptance Criteria
VipsJpegXlImageFilterencodes images to.jxlvia the libvipslibjxldelegateq(0-100 quality, default 75),lossless(present = lossless), andeffort(1-9, default 7) parameters under thejxl_prefixjxlandjpegxlkeys inVipsImageFilterApiImpl(libvips-only block)Priority
Medium
Additional Context
Mirrors
VipsAvifImageFilter(dotCMS/src/main/java/com/dotmarketing/image/vips/). Requires the host libvips build to include thelibjxldelegate; if absent the request fails like AVIF when libheif/AV1 is missing.