\section{Standard module \sectcode{imghdr}}
\label{module-imghdr}
\stmodindex{imghdr}

The \code{imghdr} module determines the type of image contained in a
file or byte stream.

The \code{imghdr} module defines the following function:

\renewcommand{\indexsubitem}{(in module imghdr)}

\begin{funcdesc}{what}{filename\optional{\, h}}
Tests the image data contained in the file named by \var{filename},
and returns a string describing the image type.  If optional \var{h}
is provided, the \var{filename} is ignored and \var{h} is assumed to
contain the byte stream to test.
\end{funcdesc}

The following image types are recognized, as listed below with the
return value from \code{what}:

\begin{enumerate}
\item[``rgb''] SGI ImgLib Files

\item[``gif''] GIF 87a and 89a Files

\item[``pbm''] Portable Bitmap Files

\item[``pgm''] Portable Graymap Files

\item[``ppm''] Portable Pixmap Files

\item[``tiff''] TIFF Files

\item[``rast''] Sun Raster Files

\item[``xbm''] X Bitmap Files

\item[``jpeg''] JPEG data in JIFF format
\end{enumerate}

You can extend the list of file types \code{imghdr} can recognize by
appending to this variable:

\begin{datadesc}{tests}
A list of functions performing the individual tests.  Each function
takes two arguments: the byte-stream and an open file-like object.
When \code{what()} is called with a byte-stream, the file-like
object will be \code{None}.

The test function should return a string describing the image type if
the test succeeded, or \code{None} if it failed.
\end{datadesc}

Example:

\bcode\begin{verbatim}
>>> import imghdr
>>> imghdr.what('/tmp/bass.gif')
'gif'
\end{verbatim}\ecode
