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 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
to 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_pass
directive (#251). - AVIF encoding support (
&output=avif
) (#238). - Support for enabling or disabling image savers (
weserv_savers
directive). - Prebuilt Docker image to GitHub's Container Registry (#204).
- Support for specifying the default quality per format (
weserv_*_quality
directives). - Support for controlling the CPU effort spent on improving compression (
weserv_*_effort
directives). - The
rel="canonical"
response header to proxied images (#309). - The
Timing-Allow-Origin
response header (#311). - Alpine based Docker image (#317).
- A pkg-config file of the API library (
weserv.pc
). - Variants of nginx configurations (
imagesweserv-no-cache.conf
andimagesweserv-secure-link.conf
). - Support for configuring the number of worker threads of libvips (via the
VIPS_CONCURRENCY
env). /clear-cache
API endpoint (#272).$weserv_response_length
embedded nginx variable.- Additional response headers (#325).
- Support multi-frame images for various operations (embed, crop, mask and orient).
- The
weserv_canonical_header
nginx directive (#309). - Client-side DNS failover mechanism (#331).
- The
weserv_deny_ip
nginx directive. - Support for
&default=1
(#371). - Support for percentage-based values for some parameters (#384).
- Support for lossless encoding of WebP images (
&ll
) (#386).
- Migrate Docker base image to Rocky Linux 9.
- 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_module
by default. - 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.
- Compatibility with CMake < 3.12.
- Compatibility with legacy websites by using 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
&page
parameter 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_SIZE
andVIPS_BLOCK_UNTRUSTED
env 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.
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-age
of theCache-Control
HTTP-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/json
MIME-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
&shape
and&strim
parameters were renamed to&mask
and&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=webp
and&output=tiff
in 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=entropy
or&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-Disposition
header (&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 in order to parse URIs correctly. This is a drop-in replacement to PHP’s
parse_url
function.
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's only used for testing purposes, and it was a beginning to re-write the entire image proxy (which is in production since 2007).
- Add CHANGELOG.md based on ’Keep a CHANGELOG’.
- Composer ready and PSR-2 compliant.
- Used the Intervention Image library for image handling and manipulation.
- Used 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 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.