Version 1.3 of iipsrv, the IIPImage server, is now officially released and available for download! This is a major new version containing a whole host of new features, major performance enhancements, optimizations and numerous bug-fixes. This is a fast, stable and production-ready release.
New features include:
- Support for JPEG input images
- New output formats: TIFF and AVIF
- Fast low latency pass-through mode
- IIIF Enhancements
- Improved metadata support
- Build and packaging improvements
- Enhanced debugging
JPEG Input Support
Until now only TIFF and JPEG2000 have been supported as input image formats by the IIPImage server. The JPEG format has always been supported, but only as an output format. However, from version 1.3 of iipsrv
, it is now possible to use JPEG directly as an input format without the need to first transcode the image to TIFF or JPEG2000.
JPEG is, however, not an ideal format for use with an image server. Unlike formats such as TIFF and JPEG2000, JPEG does not support efficient random-access through tiling nor does it support multi-resolution encoding. Decoding, therefore, will necessarily be much slower than for TIFF or JPEG2000, especially for large images. Nevertheless, for small or even medium sized images, this performance penalty can often be acceptable as it allows JPEG to be used directly without the need to first transcode to a more optimized format.
The implementation fully handles all baseline JPEG images and, in addition, supports ICC, XMP as well as EXIF metadata. Progressive JPEG images, however, should be avoided as they contain multiple scans making them particularly slow to decode.
New Output Formats
This version of iipsrv adds support for both AVIF and TIFF output. Transcoding to AVIF or TIFF is available through both the IIP and IIIF APIs and tiles or regions can be requested in the same way that the existing output formats, JPEG, PNG or WebP can. For IIP requests new tile commands ATL
and TTL
have been introduced that work in exactly the same way as JTL
for JPEG tile output.
For example, to resize a TIFF image test.tif
to 500px in width and converted to AVIF format using the IIP API:
https://your.host/fcgi-bin/iipsrv.fcgi?FIF=test.tif&WID=500&CVT=avif
The equivalent request using the IIIF API:
https://your.host/iiif/test.tif/full/500,/0/default.avif
The default quality levels can be set using two new startup parameters: AVIF_QUALITY
and TIFF_QUALITY
. For AVIF, this value works in a similar way to JPEG and WebP and should be set to an integer between 0 and 100, where 0 is the highest amount of compression and, therefore, the lowest image quality, whereas 100 represents the best image quality, but a much larger file size. By default, this is set to 50 for AVIF. iipsrv uses the libavif library for AVIF transcoding and this library supports several backend codecs. The AVIF_CODEC
parameter can be used to select the specific default codec to use. Values should be an integer with 0 = auto, 1 = aom, 2 = rav1e, 3 = SVT-AV1. This is set to 0 by default.
For TIFF output, a new TIFF_COMPRESSION
startup parameter allows the default compression / encoding of the image to be set. This should be set to an integer where 0 = None, 1 = LZW, 2 = Deflate, 3 = JPEG, 4 = WebP, 5 = ZStandard. The TIFF_QUALITY
parameter sets the default compression level for compression schemes that support variable levels. The range of accepted values depends on the compression scheme chosen. For Deflate, this ranges from 1-9, for JPEG and WebP 1-100 and for ZStandard 1-23.
For IIP requests, the encoding quality can also be controlled on-the-fly via the QLT
URL parameter. For TIFF, both the encoding and compression can be specified through this parameter. For example to export an image, test.tif in TIFF format resized to a width of 500px with ZStandard encoding and a compression level of 12:
https://your.host/fcgi-bin/iipsrv.fcgi?FIF=test.tif&WID=500&QLT=zstd:12&CVT=tiff
Low Latency Pass-Through Mode
This release introduces a new highly efficient low-latency “pass-through” mode. Previous versions of iipsrv
(and most other image servers) first decode an image region when a request is made and then process and re-encode that data to the requested output format. This is necessary if any modification or image processing needs to be carried out on the image data. These can include geometric transformations such as rotation or resizing or pixel-wise transformation for contrast adjustment, gamma control or if the source image is in a different bit depth to the output data. For example downsampling from 16 bit per pixel to 8 bit per pixel etc. However, in many cases where the image data is simply to be viewed as-is, this slow decode-reencode cycle is entirely unnecessary. A very common usage scenario for iipsrv
is as a back-end server to a pan-and-zoom viewer. In such a use case, image tiles are requested which require no resizing or other processing.
This new functionality, therefore, allows encoded image tile data to be sent without the need for any encode-decode cycle when no modification of the image data is required. This provides a fast highly efficient path that allows iipsrv
to function as a fully dynamic image server, yet with almost the speed and efficiency of static image tiles. This functionality works only for TIFF input images and exploits the fact that tiled multi-resolution pyramid TIFF contains independent tiles that can be individually encoded using browser-native image formats, such as JPEG and WebP.
If a request is made for an image region that exactly coincides with an existing tile within the TIFF multi-resolution pyramid structure and if the requested output format and compression also perfectly match that in the source image, then the tile is simply extracted as-is with almost zero overhead. This functionality is available when using TIFF with JPEG or WebP compression. Such images can be generated using, for example Vips:
vips tiffsave --tile-width 256 --tile-height 256 --pyramid --compression webp --Q 75 input.tif output.tif
The compressed tiles within a TIFF do not contain metadata (XMP or EXIF) or an ICC profile, as these are stored only once within the top-level TIFF metadata. Thus, If metadata or an ICC profile exists, these are efficiently injected into the output bitstream without modification of the image data itself. This makes such image requests flexible, yet extremely efficient.
This new functionality can be controlled via the new CODEC_PASSTHROUGH
startup parameter, which accepts the integer values 0 or 1, where 0 = disabled and 1 = enabled. This is enabled by default.
IIIF Enhancements
This version has improved IIIF support with the introduction of several new features.
info.json
The new IIIF_EXTRA_INFO
startup parameter allows arbitrary extra fields to be added to the info.json for an image. Note that quotes need to be properly escaped for the final JSON to be valid and that no trailing comma should be added. For example, to inject a preferredFormats
field into the info.json for every image:
export IIIF_EXTRA_INFO='"preferredFormats": [ "webp", "avif" ]'
Multi-page images
The ability to request specific pages within a multi-page TIFF image (TIFFs must be encoded using sub-IFDs) through IIIF is now possible by using a delimiter after the file name part of the URL syntax. The startup parameter IIIF_DELIMITER
allows a character (or string) to be defined for this delimiter. For example, if we set IIIF_DELIMITER
to a semi-colon:
IIIF_DELIMITER=";"
then it’s possible to request the 4th page (index starts at 0) from the image test.tif like so:
https://your.host/test.tif;4/full/500,/0/default.jpg
Image processing extensions
This version also introduces access through IIIF to some of the existing image processing functionality available within iipsrv. The ability to perform contrast stretching, histogram equalization, inversion (image negative) and a log transform have until now only been available using the IIP API. However, these features can now be accessed when using IIIF via several non-standard extensions to the IIIF API. The qualities part of the IIIF API already allows images to be converted to grayscale
or bitonal
. These IIPImage extensions add stretch
for contrast stretching, equalization
for histogram equalization, negative
for inversion and log
for the application of a logarithm transform.
For example, the following will render the input image test.tif to an output with a height of 400px, flipped horizontally and converted to a negative in WebP format
https://your.host/test.tif/full/,400/!0/negative.webp
Note that this feature is disabled by default and must be explicitly enabled by setting the startup parameter IIIF_EXTENSIONS
to 1.
Metadata
This release supports the inclusion of EXIF data in JPEG, PNG, WebP and AVIF output. Currently this is only available when using JPEG input images and is not yet available for TIFF. The JPEG2000 format does not, in any case, support EXIF directly, but EXIF can be encoded within an XMP block and XMP is fully supported by iipsrv
for all image types.
This release also introduces a new COPYRIGHT
startup parameter. Copyright or rights information is already taken from any source image metadata and re-injected into the output image format metadata (for formats that support this). This information is also included for IIIF in the IIIF info.json metadata. This new startup parameter extends this and allows a default rights or copyright statement to be set for images that do not have individual copyright metadata within the image itself. This can be set with, for example:
export COPYRIGHT="Copyright IIPImage 2025"
Build and Packaging Improvements
The build configuration has been improved with a view to facilitating things for downstream distribution package managers. A new make check
command tests whether the compiled iipsrv
executable is able to run and make install
now installs a binary iipsrv
into the system’s sbin
directory (usually /usr/sbin/
). Therefore, to fully compile, check and install iipsrv
(with no .fcgi suffix) into /usr/sbin/
use:
./configure --prefix=/usr make make check sudo make install
Systemd and OpenRC init scripts and default configuration are also now provided in the scripts directory.
This allows iipsrv to be started through a standard systemd service command:
systemctl start iipsrv
Or through an OpenRC init service:
/etc/init.d/iipsrv start
See READMEs for SystemD and OpenRC for more details on how to install, configure use these.
Debugging
Improved debugging is now possible for developers wishing to test iipsrv. Add the --enable-debug-mode
flag during compilation to enable:
./configure --enable-debug-mode make
You can then start the iipsrv binary on the command line, then type in individual requests or use redirection to send an entire list of URLs with the output saved in the file iipsrv.debug
:
src/iipsrv.fcgi < request_list.txt
Production Stability
The IIPImage server is regularly used in heavy-load production environments and has a track record for stability and performance. As with previous versions, version 1.3 has undergone thorough and extensive bug and load testing and is the most stable version of
iipsrv
yet to be released. Furthermore, code analysis from the static analysis tool, Coverity Scan has once again certified iipsrv
to be defect free with 0.00 code defects.
Download
The iipsrv
source code and binary releases are now available from the download section.
Linux users running Debian, Ubuntu or Alpine Linux will be able to use the default package manager to install or update iipsrv once the packages have been updated.
Source code: iipsrv-1.3.tar.bz2
Mac OS X binaries: iipsrv-1.3-OSX.zip
Windows binaries (64 bit): iipsrv-1.3-win64.zip
Windows binaries (32 bit): iipsrv-1.3-win32.zip
Solaris 11.4 binaries: iipsrv-1.3-solaris11.tar.gz