\section{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.

\subsection{VIPS file header}
\label{sec:header}

All VIPS image files start with a 64-byte header giving basic information
about the image dimensions, see \tref{fg:header}. 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 \verb+header+ to extract the XML from an
image and \verb+edvips+ to replace it, see the man pages.

The \ct{Type} field, the \ct{Xres}/\ct{Yres} fields, and the
\ct{Xoffset}/\ct{Yoffset} fields are advisory. VIPS maintains their value
(if you convert an image to \cielab{} colour space with \ct{im\_XYZ2Lab()},
for example, VIPS will set \ct{Type} to be \ct{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 \ct{BandFmt}, \ct{Coding} and \ct{Type} fields can take the values
shown in tables~\ref{fg:bandfmt}, \ref{fg:coding} and \ref{fg:type}. The C++
and Python names for these values are slightly different, for historical
reasons.

\begin{tab2}
\begin{center}
\begin{tabular}{|l|l|l|}
\hline
Bytes  & Represent 					 & VIPS name \\
\hline
0--3   & VIPS magic number (in hex, 08 f2 f6 b6) 	 & \\
4--7   & Number of pels per horizontal line (integer) 	 & \ct{Xsize} \\
8--11  & Number of horizontal lines (integer) 		 & \ct{Ysize} \\
12--15 & Number of bands (integer) 			 & \ct{Bands} \\
16--19 & Unused (legacy) 				 & \ct{Bbits} \\
20--23 & Band format (eg. \ct{IM\_BANDFMT\_USHORT})	 & \ct{BandFmt} \\
24--27 & Coding type (eg. \ct{IM\_CODING\_NONE})	 & \ct{Coding} \\
28--31 & Type (eg. \ct{IM\_TYPE\_LAB})			 & \ct{Type} \\
32--35 & Horizontal resolution (float, pixels mm$^{-1}$) & \ct{Xres} \\
36--39 & Vertical resolution (float, pixels mm$^{-1}$)	 & \ct{Yres} \\
40--43 & Unused (legacy)				 & \ct{Length} \\
44--45 & Unused (legacy)				 & \ct{Compression} \\
46--47 & Unused (legacy)				 & \ct{Level} \\
48--51 & Horizontal offset of origin			 & \ct{Xoffset} \\
52--55 & Vertical offset of origin			 & \ct{Yoffset} \\
56--63 & For future expansion (all zeros for now)	 & \\
\hline
\end{tabular}
\end{center}
\caption{VIPS header\label{fg:header}}
\end{tab2}

\begin{tab2}
\begin{center}
\begin{tabular}{|l|l|l|l|}
\hline
\ct{BandFmt} 		    & C++ and Python name & Value & Meaning \\
\hline
\ct{IM\_BANDFMT\_NOTSET}    & \ct{FMTNOTSET}    & -1 & \\
\ct{IM\_BANDFMT\_UCHAR}     & \ct{FMTUCHAR}     & 0  & Unsigned 8-bit int \\
\ct{IM\_BANDFMT\_CHAR} 	    & \ct{FMTCHAR}      & 1  & Signed 8-bit int \\
\ct{IM\_BANDFMT\_USHORT}    & \ct{FMTUSHORT}    & 2  & Unsigned 16-bit int \\
\ct{IM\_BANDFMT\_SHORT}     & \ct{FMTSHORT}     & 3  & Signed 16-bit int \\
\ct{IM\_BANDFMT\_UINT} 	    & \ct{FMTUINT}      & 4  & Unsigned 32-bit int \\
\ct{IM\_BANDFMT\_INT} 	    & \ct{FMTINT}       & 5  & Signed 32-bit int \\
\ct{IM\_BANDFMT\_FLOAT}     & \ct{FMTFLOAT}     & 6  & 32-bit IEEE float \\
\ct{IM\_BANDFMT\_COMPLEX}   & \ct{FMTCOMPLEX}   & 7  & Complex (2 floats) \\
\ct{IM\_BANDFMT\_DOUBLE}    & \ct{FMTDOUBLE}    & 8  & 64-bit IEEE double \\
\ct{IM\_BANDFMT\_DPCOMPLEX} & \ct{FMTDPCOMPLEX} & 9  & Complex (2 doubles) \\
\hline
\end{tabular}
\end{center}
\caption{Possible values for \ct{BandFmt}\label{fg:bandfmt}}
\end{tab2}

\begin{tab2}
\begin{center}
\begin{tabular}{|l|l|l|l|}
\hline
\ct{Coding} & C++ and Python name & Value & Meaning \\
\hline
\ct{IM\_CODING\_NONE}  & \ct{NOCODING} & 0 & VIPS computation format \\
\ct{IM\_CODING\_LABQ}  & \ct{LABQ} & 2 & LABQ storage format \\
\ct{IM\_CODING\_RAD}  & \ct{RAD} & 6 & Radiance storage format \\
\hline
\end{tabular}
\end{center}
\caption{Possible values for \texttt{Coding}\label{fg:coding}}
\end{tab2}

\begin{tab2}
\begin{center}
\begin{tabular}{|l|l|l|l|}
\hline
\ct{Type} & C++ and Python name & Value & Meaning \\
\hline
\ct{IM\_TYPE\_MULTIBAND} & \ct{MULTIBAND} & 0  & Some multiband image \\
\ct{IM\_TYPE\_B\_W} 	 & \ct{B\_W}      & 1  & Some single band image \\
\ct{IM\_TYPE\_HISTOGRAM} & \ct{HISTOGRAM} & 10 & Histogram or LUT \\
\ct{IM\_TYPE\_FOURIER} 	 & \ct{FOURIER}   & 24 & Image in Fourier space \\
\ct{IM\_TYPE\_XYZ} 	 & \ct{XYZ}       & 12 & \ciexyz{} colour space \\
\ct{IM\_TYPE\_LAB} 	 & \ct{LAB}       & 13 & \cielab{} colour space \\ 
\ct{IM\_TYPE\_CMYK} 	 & \ct{CMYK}      & 15 & \ct{im\_icc\_export()} \\
\ct{IM\_TYPE\_LABQ} 	 & \ct{LABQ}      & 16 & 32-bit \cielab{} \\
\ct{IM\_TYPE\_RGB} 	 & \ct{RGB}       & 17 & Some RGB \\
\ct{IM\_TYPE\_UCS} 	 & \ct{UCS}       & 18 & \cieucs{} colour space \\
\ct{IM\_TYPE\_LCH} 	 & \ct{LCH}       & 19 & \cielch{} colour space \\
\ct{IM\_TYPE\_LABS} 	 & \ct{LABS}      & 21 & 48-bit \cielab{} \\
\ct{IM\_TYPE\_sRGB} 	 & \ct{sRGB}      & 22 & sRGB colour space \\
\ct{IM\_TYPE\_YXY} 	 & \ct{YXY}       & 23 & \cieyxy{} colour space \\
\ct{IM\_TYPE\_RGB16} 	 & \ct{RGB16}     & 25 & 16-bit RGB \\
\ct{IM\_TYPE\_GREY16} 	 & \ct{GREY16}    & 26 & 16-bit monochrome \\
\hline
\end{tabular}
\end{center}
\caption{Possible values for \texttt{Type}\label{fg:type}}
\end{tab2}

\subsection{Computation formats}

This type of image has \ct{Coding} set to \ct{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.

\subsection{Storage formats}

All storage formats have other values for the \ct{Coding} field. This
release supports \ct{IM\_CODING\_LABQ} and \ct{IM\_CODING\_RAD}.

\ct{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 \ct{IM\_CODING\_LABQ} images (\ct{im\_extract\_area()}, for
example), but most will require you to unpack the image to one of the
computation formats (for example with \ct{im\_LabQ2Lab()}) first.

\ct{IM\_CODING\_RAD} stores $RGB$ or $XYZ$ 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 \ct{IM\_CODING\_RAD} images (\ct{im\_extract\_area()}, for
example), but most will require you to unpack the image to one of the
computation formats with \ct{im\_rad2float()} first.

