All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
Current trunk - started 2019-09-01
Requires libvips 8.12+.
- Support for true streaming (#225).
- Support for JPEG XL images.
- Support for upstream TLSv1.3 connections.
- Install target for the library and CLI tool.
- Support for changing the nginx version during building.
- Debug mode within the weserv module (
&debug=). Requires nginx to be compiled with--with-debug. pagePrimary,isPaletteandbitsPerSampleto metadata output (&output=json).- Support for brightness, saturation and hue modulation (
&mod=) (#226). - nginx directives for configuring API limits (#227).
- Support for nginx's
proxy_passdirective (#251). - AVIF encoding support (
&output=avif) (#238). - Support for enabling or disabling image savers (
weserv_saversdirective). - Prebuilt Docker image to GitHub's Container Registry (#204).
- Support for specifying the default quality per format (
weserv_*_qualitydirectives). - Support for controlling the CPU effort spent on improving compression (
weserv_*_effortdirectives). - The
rel="canonical"response header to proxied images (#309). - The
Timing-Allow-Originresponse header (#311). - Alpine based Docker image (#317).
- A pkg-config file of the API library (
weserv.pc). - Variants of nginx configurations (
imagesweserv-no-cache.confandimagesweserv-secure-link.conf). - Support for configuring the number of worker threads used by libvips (via the
VIPS_CONCURRENCYenv). /clear-cacheAPI endpoint (#272).$weserv_response_lengthembedded nginx variable.- Additional response headers (#325).
- Support multi-frame images for various operations (embed, crop, mask and orient).
- The
weserv_canonical_headernginx directive (#309). - Client-side DNS failover mechanism (#331).
- The
weserv_deny_ipandweserv_error_redirectnginx directives. - Support for
&default=1(#371). - Support for percentage-based values for some parameters (#384).
- Support for lossless encoding of WebP and TIFF images (
&ll) (#386). - Support for specifying the trim background color (
&tbg=) (#459).
- Migrate Docker base image to Rocky Linux 10.
- Migrate to Meson build system.
- Attempt to decode corrupted or invalid images (#194).
- Docker image improvements (#215, #216, #230 and #283).
- Return an error when the maximum number of pages is exceeded (#243).
- Bump minimum required libvips version to 8.12.
- Allow arbitrary values for the max-age parameter (#292).
- Increase rate limit quota to 2500 requests per 10 minutes (#196).
- The name of the project, CLI and shared library name (
imagesweserv->weserv). - Warn if nginx was configured without
--with-http_ssl_module. - Build nginx with
--with-http_secure_link_moduleby default in Docker. - Migrate from PCRE to PCRE2.
- Modernize code to C++17.
- Use jemalloc in the glibc-based Dockerfile.
- Improve ICC profile conversion.
- Speed-up thumbnailing of RGBA images.
- Improve error message for blocked domains/TLDs (#432).
- Improve luminance of
&tint=operation with weighting function.
- Compatibility with legacy websites by using the lowest OpenSSL security level (#208).
- Thread safety with copy-on-write for metadata (lovell/sharp#1986).
- A small memory leak in thumbnail.
- Comply URI parser with the RFC-3986 standard (#237).
- Page height logic for non-animated images (#242).
- Premultiplication bug during masking (#245).
- Message for HTTP 500 response status codes (#264).
- Focal point calculations (#270).
- Parsing of key-value pairs (#279 and #358).
- Reduce the size of the Docker image (#316).
- Only set permanent URLs as canonical (#309).
- Using the
&pageparameter in combination with&n=-1. - Skip shrink-on-load for known libjpeg rounding errors.
- Compatibility with mixed C++ ABIs (#338).
- Prevent upsizing via libwebp.
- Honor the
VIPS_MIN_STACK_SIZEandVIPS_BLOCK_UNTRUSTEDenv variables. - Ensure use of flip forces random access read.
- The maximum values of the sharpen operation (#357).
- Bump buffer size for HTTP response headers (#378).
- Ensure correct dimensions for 90/270 rotate.
- Ensure
&trimis effective when used without a value.
| Before | Use instead |
|---|---|
&bri=[-100/+100] |
&mod=[brightness multiplier] |
&a=focal-[x%]-[y%] |
&fpx=[x offset] and &fpy=[y offset] |
The weserv_mode proxy|file; directive is removed in favour of the weserv proxy|filter; directive. This means that
all occurrences of weserv on|off; and weserv_mode proxy|file; should be removed from existing nginx configurations.
To enable the Weserv module, it is now mandatory to include the weserv proxy|filter; directive in the location block.
For example:
@@ -1,12 +1,10 @@
server {
- weserv on;
-
location / {
- weserv_mode proxy;
+ weserv proxy;
}
location /static {
- weserv_mode file;
+ weserv filter;
alias /var/www/imagesweserv/public;
}5.0.0 - started 2019-02-07
Requires libvips 8.8+.
See this blog post for a summary of the new features in API 5.
- Support for animated WebP and GIF images.
- Support for loading HEIC-images.
- Without enlargement (
&we, can be used in combination with all&fit=parameters) (#173). - Background color when using
&fit=contain(&cbg=). - Image tinting (
&tint=). - Arbitrary rotation angles (
&ro=). - Background color when rotating by arbitrary angles (
&rbg=). - Adaptive row filtering (
&af, PNG only). - zlib compression level (
&l=, PNG only). - Metadata output (
&output=json). - Flipping an image horizontally (
&flop) and/or vertically (&flip). - Pre-resize crop behaviour (
&precrop) (#176). - Retrieve the largest/smallest page from a multi-resolution image (
&page=-1/&page=-2) (#170). - Duotone filter effect (
&filt=duotone). The two contrasting colours can be specified with&start=and&stop=. - Fit option to ensure that the dimensions are greater than or equal to both those specified (
&fit=outside). - Support for changing the
max-ageof theCache-ControlHTTP-header (&maxage=) (#186).
- Rewrote the entire code base to C++.
- Improved rate limiter. See the weserv/rate-limit-nginx-module repository.
- Align the confusing transformation (
&t=) parameters with the CSS terminology (&fit=). - A JSON-formatted response with the appropriate
application/jsonMIME-type, if an error occurs. - Docker image and deployment improvements (#180).
| Before | Use instead |
|---|---|
&t=fit |
&fit=inside&we |
&t=fitup |
&fit=inside |
&t=square |
&fit=cover |
&t=squaredown |
&fit=cover&we |
&t=absolute |
&fit=fill |
&t=letterbox |
&fit=contain |
&a=crop-[x%]-[y%] |
&a=focal-[x%]-[y%] |
&errorredirect |
&default |
&sharp=[f],[j],[s] |
&sharp=[s], &sharpf=[f] and &sharpj=[j] |
&crop=[w],[h],[x],[y] |
&cw=[w], &ch=[h], &cx=[x] and &cy=[y] |
4.0.0 - started 2018-07-17
Requires libvips 8.7+ and OpenResty 1.13.6.2+.
See this blog post for a summary of the new features in API 4.
- Mask background (
&mbg=).
- Rewrote the complete code base to Lua and switched to OpenResty.
- Switch from libvips' PHP binding to the LuaJIT binding.
- The
&shapeand&strimparameters were renamed to&maskand&mtrim. - Support for URI's starting with
http://andhttps://.
| Before | Use instead |
|---|---|
&shape= |
&mask= |
&strim= |
&mtrim= |
3.0.0 - started 2017-01-01
Requires libvips 8.7+ and PHP 7.1+.
With the magical help of libvips and the PHP binding php-vips, we "officially" support PNG, JPG, WEBP, GIF (not animated), SVG, PDF and TIFF as image input. "Unofficially" we're supporting all libMagick image file types.
&output=webpand&output=tiffin an effort to support more image formats as output (#68).- Device pixel ratio (
&dpr=) (#115). - Letterboxing (
&t=letterbox) (#80). - Rotation by any multiple of 90 (
&or=). - Smart crop
&a=entropyor&a=attention(only works when&t=square). - Focal point cropping (
&a=crop-x%-y%, only works when&t=square). - Shape cropping (
&shape=). - Brightness adjustment (
&bri=). - Contrast adjustment (
&con=). - Gamma adjustment (
&gam=). - Sharpen an image (
&sharp=). - Background color of an image (
&bg=) (#81). - Blur effect (
&blur=) (#69). - Filter effect (
&filt=). - The filename returned in the
Content-Dispositionheader (&filename=) (#122 and #78). - Support for Cyrillic and Arabic characters (#13).
- Redirect to a default image if the image URL is not found (
&errorredirect=) (#37). - Load a given page (
&page=, for PDF, TIFF and multi-size ICO files). - Support for non-standard ports (#10).
- A privacy policy. See Privacy-Policy.md.
- A Docker image for easier deployment. See the Docker installation instructions.
- Dropped Intervention Image in favor of php-vips because resizing an image with libvips is typically 4x-5x faster than using the quickest ImageMagick.
- We're now using the uri package to parse URIs correctly. This is a drop-in replacement to PHP’s
parse_urlfunction.
| Before | Use instead |
|---|---|
&a=t |
&a=top |
&a=b |
&a=bottom |
&a=l |
&a=left |
&a=r |
&a=right |
&circle |
&shape=circle |
2.0.0 - started 2015-12-27
This version was never used in production; it was only used for testing purposes and marked the start of rewriting the image proxy (which has been in production since 2007).
- Add CHANGELOG.md based on ‘Keep a CHANGELOG’.
- Composer ready and PSR-2 compliant.
- Use the Intervention Image library for image handling and manipulation.
- Use the Guzzle library for sending HTTP requests.
1.0.0 - started 2007-09-10
The start of our image proxy. See for more details here.
We never kept a changelog from 2007 to 2015. For a quick overview of what we've added, changed or fixed in the past, see our completed label on our issue tracker. Or take a look at our 1.x branch.