### Image Utility Availability LightWave® 6.0 Component Layout, Modeler Header lwimage.h This global provides functions for creating and saving still images. Also see the Image List global. Pixmaps, used by this global and identified by LWPixmapID, differ from the images in the image list, which are identified by LWImageID. Pixmaps are stills, and you can draw on them and save them. Once saved to a file, the image can be loaded into LightWave® using the Image List `load` function. The pixmap returned by the Image List `evaluate` function is a copy of the image, and drawing on this copy does not change the original image. Global Call
       LWImageUtil *imgutil;
       imgutil = global( LWIMAGEUTIL_GLOBAL, GFUSE_TRANSIENT );
The global function returns a pointer to an LWImageUtil.
       typedef struct st_LWImageUtil {
          LWPixmapID   (*create)        (int w, int h, LWImageType);
          void         (*destroy)       (LWPixmapID);
          int          (*save)          (LWPixmapID, int saver, const char *name);
          void         (*setPixel)      (LWPixmapID, int x, int y, void *pix);
          void         (*getPixel)      (LWPixmapID, int x, int y, void *pix);
          void         (*getInfo)       (LWPixmapID, int *w, int *h, int *type);
          LWPixmapID   (*resample)      (LWPixmapID, int w, int h, int mode);
          int          (*saverCount)    (void);
          const char * (*saverName)     (int saver);
          void         (*setPixelTyped) (LWPixmapID img, int x, int y, int type,  void *pix);
          void         (*getPixelTyped) (LWPixmapID img, int x, int y, int type,  void *pix);
          int          (*getIndex8Map)  (LWPixmapID img, LWPixelRGB24 *map);
          int          (*getAttr)( LWPixmapID img, LWImageParam tag, void* data );
          int          (*getMakerNote)( LWPixmapID img, LWMakerNote tag, void* data );
       } LWImageUtil;
`image = create( w, h, type )` Create a new image. The type specifies the organization of the pixel data and may be any of the image I/O pixel types. `destroy( image )` Release resources allocated by `create`. The image ID is no longer valid after this is called. `result = save( image, saver_index, filename )` Save the image to a file using the specified format. The format is determined by the choice of image saver, which can be one of Layout's built-in image savers or any of the installed ImageSaver class plug-ins. Use the `saverCount` and `saverName` functions to determine what formats are available and which saver index to use. `setPixel( image, x, y, pixel )` Set the value of a pixel in the image. The format of the pixel data depends on the pixel type of the image. `getPixel( image, x, y, pixel )` Get the value of a pixel in the image. `getInfo( image, w, h, type )` Get the width, height and pixel type of an image. `image2 = resample( image, w, h, mode )` Create a new image by resizing an existing image. The mode determines how the existing pixels will be resampled and can be one of the following values. `LWISM_SUBSAMPLING LWISM_MEDIAN LWISM_SUPERSAMPLING LWISM_BILINEAR LWISM_BSPLINE LWISM_BICUBIC` `count = saverCount()` Returns the number of available image savers. `name = saverName( saver_index )` Returns the name of an image saver. `setPixelTyped( image, x, y, type, pixel )` (LW9.0+) Set the value of a pixel in the image. The pixel is assumed to be of the given format type. `getPixelTyped( image, x, y, type, pixel )` (LW9.0+) Get the value of a pixel in the image in a given format type. `count = getIndex8Map( image, map )` (LW9.0+) Get the color index map for `LIMTYP_INDEX8` images. The RGB colors are copied into the given map, which must have enough space to store at least 256 entries of `LWPixelRGB24` values. Returns the number of entries filled in, or zero if no color index map could be found for the image. `found = getAttr( image, tag, data )` (LW9.5+) Gets the value of an attribute for an image. The tag is one of the `LWIMPAR_*` symbols defined in `lwimageio.h`. If found, the value associated with the tag is placed in the memory location pointed to by `data`. The type of the value to which `data` points should match the type associated with the tag. `found = getMakerNote( image, tag, data )` (LW9.5+) Gets the value of a MakerNote attribute for an image. The tag is one of the `LWMN_*` symbols defined in `lwimageio.h`. If found, the value associated with the tag is placed in the memory location pointed to by `data`. The value is currently always a string pointer. Only NewTek makernotes are supported. Example This example creates a rainbow image, saves it, and loads it into Layout's internal image list using the image list global.
       #include <lwserver.h>
       #include <lwimage.h>
       #include <lwhost.h>

       LWMessageFuncs *msg;
       LWImageUtil *imgutil;
       LWImageList *imglist;
       LWImageID image;
       LWPixmapID pixmap;
       int x, y, saver, nsavers;
       unsigned char rgb[ 3 ];
       char *filename = "rainbow.tga";
       imgutil = global( LWIMAGEUTIL_GLOBAL, GFUSE_TRANSIENT );
       imglist = global( LWIMAGELIST_GLOBAL, GFUSE_TRANSIENT );
       msg = global( LWMESSAGEFUNCS_GLOBAL, GFUSE_TRANSIENT );
       if ( !imgutil || !imglist || !msg )
          return AFUNC_BADGLOBAL;

       pixmap = imgutil->create( 256, 20, LWIMTYP_RGB24 );
       if ( !pixmap ) {
          msg->error( "Couldn't create the image.", NULL );
          return AFUNC_OK;
       }

       for ( x = 0; x < 256; x++ )
          for ( y = 0; y < 20; y++ ) {
             hsv2rgb( 359.0f * x / 255.0f, y / 20.0f, 1.0f, rgb );
             imgutil->setPixel( pixmap, x, y, rgb );
          }

       nsavers = imgutil->saverCount();
       for ( saver = 0; saver < nsavers; saver++ )
          if ( !strcmp( "Targa Format (.tga)",
             imgutil->saverName( saver ))) break;

       if ( saver == nsavers )
          msg->error( "Couldn't find the Targa saver.", NULL );
       else
          imgutil->save( pixmap, saver, filename );

       imgutil->destroy( pixmap );

       image = imglist->load( filename );
The `hsv2rgb` function looks like this.
       void hsv2rgb( float h, float s, float v, char rgb[] )
       {
          float r, g, b, p, q, f, t;
          int i;

          if ( s == 0 ) {
             rgb[ 0 ] = rgb[ 1 ] = rgb[ 2 ] = ( int )( v * 255 );
             return;
          }

          h /= 60.0f;
          i = ( int ) h;
          f = h - i;
          p = v * ( 1.0f - s );
          q = v * ( 1.0f - ( s * f ));
          t = v * ( 1.0f - ( s * ( 1.0f - f )));

          switch ( i ) {
             case 0:  r = v;  g = t;  b = p; break;
             case 1:  r = q;  g = v;  b = p; break;
             case 2:  r = p;  g = v;  b = t; break;
             case 3:  r = p;  g = q;  b = v; break;
             case 4:  r = t;  g = p;  b = v; break;
             case 5:  r = v;  g = p;  b = q; break;
          }

          rgb[ 0 ] = ( int )( r * 255 );
          rgb[ 1 ] = ( int )( g * 255 );
          rgb[ 2 ] = ( int )( b * 255 );
       }