1.2 The VIPS file format

VIPS has its own very simple file format. It is used inside VIPS to hold images during computation. You can save images in VIPS format if you want, but the VIPS format is not widely used and you may have problems reading your images into other packages.

If you intend to keep an image, it’s much better to save it as TIFF, JPEG, PNG, PBM/PGM/PPM or HDR. VIPS can transparently read and write all these formats.

1.2.1 VIPS file header

All VIPS image files start with a 64-byte header giving basic information about the image dimensions, see Table 1.1. This is followed by the image data. This is usually just the pixel values in native format (ie. the byte order used by the machine that wrote the file) laid out left-to-right and top-to-bottom. After the image data comes a block of optional XML which holds extra image metadata, such as ICC profiles and image history. You can use the command-line program header to extract the XML from an image and edvips to replace it, see the man pages.

The Type field, the Xres/Yres fields, and the Xoffset/Yoffset fields are advisory. VIPS maintains their value (if you convert an image to CIE Lab colour space with im_XYZ2Lab(), for example, VIPS will set Type to be IM_TYPE_LAB), but never uses these values itself in determining the action of an image processing function. These fields are to help the user and to help application programs built on VIPS which are trying to present image data to the user in a meaningful way.

The BandFmt, Coding and Type fields can take the values shown in tables 1.2, 1.3 and 1.4. The C++ and Python names for these values are slightly different, for historical reasons.





BytesRepresent VIPS name



0–3 VIPS magic number (in hex, 08 f2 f6 b6)
4–7 Number of pels per horizontal line (integer)Xsize
8–11 Number of horizontal lines (integer) Ysize
12–15Number of bands (integer) Bands
16–19Unused (legacy) Bbits
20–23Band format (eg. IM_BANDFMT_USHORT)BandFmt
24–27Coding type (eg. IM_CODING_NONE) Coding
28–31Type (eg. IM_TYPE_LAB) Type
32–35Horizontal resolution (float, pixels mm1) Xres
36–39Vertical resolution (float, pixels mm1) Yres
40–43Unused (legacy) Length
44–45Unused (legacy) Compression
46–47Unused (legacy) Level
48–51Horizontal offset of origin Xoffset
52–55Vertical offset of origin Yoffset
56–63For future expansion (all zeros for now)




Table 1.1: VIPS header






BandFmt C++ and Python nameValueMeaning




IM_BANDFMT_NOTSET FMTNOTSET -1
IM_BANDFMT_UCHAR FMTUCHAR 0 Unsigned 8-bit int
IM_BANDFMT_CHAR FMTCHAR 1 Signed 8-bit int
IM_BANDFMT_USHORT FMTUSHORT 2 Unsigned 16-bit int
IM_BANDFMT_SHORT FMTSHORT 3 Signed 16-bit int
IM_BANDFMT_UINT FMTUINT 4 Unsigned 32-bit int
IM_BANDFMT_INT FMTINT 5 Signed 32-bit int
IM_BANDFMT_FLOAT FMTFLOAT 6 32-bit IEEE float
IM_BANDFMT_COMPLEX FMTCOMPLEX 7 Complex (2 floats)
IM_BANDFMT_DOUBLE FMTDOUBLE 8 64-bit IEEE double
IM_BANDFMT_DPCOMPLEXFMTDPCOMPLEX 9 Complex (2 doubles)





Table 1.2: Possible values for BandFmt






Coding C++ and Python nameValueMeaning




IM_CODING_NONENOCODING 0 VIPS computation format
IM_CODING_LABQLABQ 2 LABQ storage format
IM_CODING_RAD RAD 6 Radiance storage format





Table 1.3: Possible values for Coding






Type C++ and Python nameValueMeaning




IM_TYPE_MULTIBANDMULTIBAND 0 Some multiband image
IM_TYPE_B_W B_W 1 Some single band image
IM_TYPE_HISTOGRAMHISTOGRAM 10 Histogram or LUT
IM_TYPE_FOURIER FOURIER 24 Image in Fourier space
IM_TYPE_XYZ XYZ 12 CIE XYZ colour space
IM_TYPE_LAB LAB 13 CIE Lab colour space
IM_TYPE_CMYK CMYK 15 im_icc_export()
IM_TYPE_LABQ LABQ 16 32-bit CIE Lab
IM_TYPE_RGB RGB 17 Some RGB
IM_TYPE_UCS UCS 18 UCS(1:1) colour space
IM_TYPE_LCH LCH 19 CIE LCh colour space
IM_TYPE_LABS LABS 21 48-bit CIE Lab
IM_TYPE_sRGB sRGB 22 sRGB colour space
IM_TYPE_YXY YXY 23 CIE Yxy colour space
IM_TYPE_RGB16 RGB16 25 16-bit RGB
IM_TYPE_GREY16 GREY16 26 16-bit monochrome





Table 1.4: Possible values for Type

1.2.2 Computation formats

This type of image has Coding set to IM_CODING_NONE. The header is then followed by a large array of pixels, laid out left-to-right, top-to-bottom. Each pixel contains the specified number of bands. Each band has the specified band format, which may be an 8-, 16- or 32-bit integer (either signed or unsigned), a single or double precision IEEE floating point number, or a pair of single or double precision floats forming a complex number.

All values are stored in the host-machine’s native number representation (that is, either most-significant first, as in SPARC and 680x0 machines, or least-significant first, for Intel and DEC machines). If necessary, the VIPS library will automatically byte-swap for you during read.

1.2.3 Storage formats

All storage formats have other values for the Coding field. This release supports IM_CODING_LABQ and IM_CODING_RAD.

IM_CODING_LABQ stores L, a and b for each pixel, with 10 bits for L and 11 bits for each of a and b. These 32 bits are packed into 4 bytes, with the most significant 8 bits of each value in the first 3 bytes, and the left-over bits packed into the final byte as 2:3:3.

This format is a little awkward to process. Some VIPS functions can work directly on IM_CODING_LABQ images (im_extract_area(), for example), but most will require you to unpack the image to one of the computation formats (for example with im_LabQ2Lab()) first.

IM_CODING_RAD stores RGB or XY Z float images as 8 bytes of mantissa and then 8 bytes of exponent, shared between the three channels. This coding style is used by the Radiance family of programs (and the HDR format) commonly used for HDR imaging. This style of image is generated when you load an HDR image.

This format is a little awkward to process. Some VIPS functions can work directly on IM_CODING_RAD images (im_extract_area(), for example), but most will require you to unpack the image to one of the computation formats with im_rad2float() first.