Skip to content

14.4.0

Choose a tag to compare

@wazum wazum released this 19 May 08:26
· 47 commits to master since this release

libvips becomes a first-class WebP conversion backend, either in-process via jcupitt/vips 2.x + PHP ext-ffi (typically 2–3× faster than MagickConverter at equivalent quality, substantially less memory) or as the vips CLI binary through the existing ExternalConverter. Both routes preserve animated GIFs as animated WebP.

New features

  • libvips (native) backend. A new VipsConverter calling libvips in-process via jcupitt/vips (2.x) + PHP ext-ffi. Pick libvips (native) in the converter dropdown. Parameters are space-separated key=value pairs per mime type (e.g. image/jpeg::Q=85 smart_subsample=true effort=4|…) passed straight to libvips's webpsave — see the option reference for the full list.
  • Animated GIFs survive as animated WebP. VipsConverter loads all frames automatically (n=-1) and emits multi-frame WebP when mixed=true is set. The vips CLI binary via ExternalConverter also preserves animation when the GIF entry uses %s[n=-1] on the source argument.
  • webp:diagnose reports libvips availability. Distinguishes ext-ffi missing / disabled / preload mode, jcupitt/vips not installed, and libvips shared library unreachable via Vips\Config::version(). Warns on PHP 8.3+ if zend.max_allowed_stack_size=-1 is not set (jcupitt/vips runs FFI callbacks off the main thread).

Upgrade notes

  • No schema changes, no upgrade wizard, no BC concerns. Default backend stays MagickConverter — existing installs are unaffected until you opt in.
  • To use the native backend, install libvips-tools on the host (Debian/Ubuntu pulls in libvips42 / libvips42t64 as a dependency), enable PHP's ext-ffi with ffi.enable=true in php.ini (not preload — jcupitt/vips does not support preloading), composer require jcupitt/vips, and set the converter to libvips (native) in the extension configuration. On PHP 8.3+ also set zend.max_allowed_stack_size=-1. Full recipe in the README's Using libvips natively section.