| \section{Built-in Module \sectcode{imageop}} | 
 | \label{module-imageop} | 
 | \bimodindex{imageop} | 
 |  | 
 | The \code{imageop} module contains some useful operations on images. | 
 | It operates on images consisting of 8 or 32 bit pixels | 
 | stored in Python strings.  This is the same format as used | 
 | by \code{gl.lrectwrite} and the \code{imgfile} module. | 
 |  | 
 | The module defines the following variables and functions: | 
 |  | 
 | \renewcommand{\indexsubitem}{(in module imageop)} | 
 |  | 
 | \begin{excdesc}{error} | 
 | This exception is raised on all errors, such as unknown number of bits | 
 | per pixel, etc. | 
 | \end{excdesc} | 
 |  | 
 |  | 
 | \begin{funcdesc}{crop}{image\, psize\, width\, height\, x0\, y0\, x1\, y1} | 
 | Return the selected part of \var{image}, which should by | 
 | \var{width} by \var{height} in size and consist of pixels of | 
 | \var{psize} bytes. \var{x0}, \var{y0}, \var{x1} and \var{y1} are like | 
 | the \code{lrectread} parameters, i.e.\ the boundary is included in the | 
 | new image.  The new boundaries need not be inside the picture.  Pixels | 
 | that fall outside the old image will have their value set to zero.  If | 
 | \var{x0} is bigger than \var{x1} the new image is mirrored.  The same | 
 | holds for the y coordinates. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{scale}{image\, psize\, width\, height\, newwidth\, newheight} | 
 | Return \var{image} scaled to size \var{newwidth} by \var{newheight}. | 
 | No interpolation is done, scaling is done by simple-minded pixel | 
 | duplication or removal.  Therefore, computer-generated images or | 
 | dithered images will not look nice after scaling. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{tovideo}{image\, psize\, width\, height} | 
 | Run a vertical low-pass filter over an image.  It does so by computing | 
 | each destination pixel as the average of two vertically-aligned source | 
 | pixels.  The main use of this routine is to forestall excessive | 
 | flicker if the image is displayed on a video device that uses | 
 | interlacing, hence the name. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{grey2mono}{image\, width\, height\, threshold} | 
 | Convert a 8-bit deep greyscale image to a 1-bit deep image by | 
 | tresholding all the pixels.  The resulting image is tightly packed and | 
 | is probably only useful as an argument to \code{mono2grey}. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{dither2mono}{image\, width\, height} | 
 | Convert an 8-bit greyscale image to a 1-bit monochrome image using a | 
 | (simple-minded) dithering algorithm. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{mono2grey}{image\, width\, height\, p0\, p1} | 
 | Convert a 1-bit monochrome image to an 8 bit greyscale or color image. | 
 | All pixels that are zero-valued on input get value \var{p0} on output | 
 | and all one-value input pixels get value \var{p1} on output.  To | 
 | convert a monochrome black-and-white image to greyscale pass the | 
 | values \code{0} and \code{255} respectively. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{grey2grey4}{image\, width\, height} | 
 | Convert an 8-bit greyscale image to a 4-bit greyscale image without | 
 | dithering. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{grey2grey2}{image\, width\, height} | 
 | Convert an 8-bit greyscale image to a 2-bit greyscale image without | 
 | dithering. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{dither2grey2}{image\, width\, height} | 
 | Convert an 8-bit greyscale image to a 2-bit greyscale image with | 
 | dithering.  As for \code{dither2mono}, the dithering algorithm is | 
 | currently very simple. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{grey42grey}{image\, width\, height} | 
 | Convert a 4-bit greyscale image to an 8-bit greyscale image. | 
 | \end{funcdesc} | 
 |  | 
 | \begin{funcdesc}{grey22grey}{image\, width\, height} | 
 | Convert a 2-bit greyscale image to an 8-bit greyscale image. | 
 | \end{funcdesc} |