#include <gandalf/image/image_defs.h>To copy a whole image of any format or type, use one of the following routines:
Gan_Image *pImage1, *pImage2, *pImage3; /* declare images 1, 2 & 3 */ /* ... create images 1 & 2, fill image 1 ... */ gan_image_copy_q ( pImage1, pImage2 ); /* copy image 1 to image 2, OR */ pImage3 = gan_image_copy_s ( pImage1 ); /* copy image 1 as new image */Image 2 here may have been created with any format, type or dimensions. Gandalf will reset the attributes of image 2 to those of image 1 before copying the image data. These routines make copies of the image data, so image 1 may be destroyed after it is copied.
To copy parts of an image, you will need to include the header file
#include <gandalf/image/image_extract.h>The routines to extract sub-parts of an image are gan_image_extract_q() and gan_image_extract_s(). They have the following extra features over a simple routine to copy image sub-regions:
Gan_Image *pImage1, *pImage2; /* declare images 1 & 2 */ Gan_RGBPixel_uc rgbucPixel; /* create RGB unsigned character image 1 and fill with constant */ pImage1 = gan_image_alloc_rgb_uc ( 200, 100 ); rgbucPixel.R = 128; rgbucPixel.R = 80; rgbucPixel.R = 200; gan_image_fill_const_rgb_uc ( pImage1, &rgbucPixel ); /* create image 2 in an arbitrary way */ pImage2 = gan_image_alloc_gl_uc(0,0); /* extract sub-region in image 1 into image 2, with height 60, width 50, starting as position 30,40 (y,x), leaving the format/type the same. The pixel data is copied */ gan_image_extract_q ( pImage1, 30, 40, 60, 50, pImage1->format, pImage1->type, GAN_TRUE, pImage2 );Now an example continuing from the above, and showing how to make the result image point into the source image.
/* extract sub-region in image 1 into image 2, with height 60, width 50, starting as position 30,40 (y,x), leaving the format/type the same. Here the pixel data is not copied; instead the result image points into the source image */ gan_image_extract_q ( pImage1, 30, 40, 60, 50, pImage1->format, pImage1->type, GAN_FALSE, pImage2 );Finally an example showing how to convert the sub-region to a different format and type.
{ Gan_Image *pImage3; /* declare image 3 */ /* extract sub-region in image 1 into image 2, with height 60, width 50, starting as position 30,40 (y,x), converting the format to grey-level and the type to unsigned short. Here the format and type are modified * as the pixels are extracted from the source image */ pImage3 = gan_image_extract_s ( pImage1, 30, 40, 60, 50, GAN_GREY_LEVEL_IMAGE, GAN_USHORT, GAN_TRUE ); }
There are also routines to convert the whole of an image to a different format or type (or both). These are simpler macro versions of gan_image_extract_[qs](), and can be illustrated as follows:
Gan_Image *pImage1, *pImage2, *pImage3; /* declare images 1, 2 & 3 */ /* ... create RGB unsigned character image 1 and fill with constant, and create image 2 in an arbitrary way ... */ /* convert image 1 to grey-level format and unsigned short type */ gan_image_convert_q ( pImage1, GAN_GREY_LEVEL_IMAGE, GAN_USHORT, pImage2 ); /* convert image 1 to image 2, OR */ pImage3 = gan_image_convert_s ( pImage1, GAN_GREY_LEVEL_IMAGE, GAN_USHORT );
Error detection: These routines return the result image pointer, and return NULL on error.