image.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:5k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h> 
  4. #include <GL/glut.h>
  5. #include "image.h"
  6. #define IMAGIC      0x01da
  7. #define IMAGIC_SWAP 0xda01
  8. #define SWAP_SHORT_BYTES(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8))
  9. #define SWAP_LONG_BYTES(x) (((((x) & 0xff) << 24) | (((x) & 0xff00) << 8)) | 
  10. ((((x) & 0xff0000) >> 8) | (((x) & 0xff000000) >> 24)))
  11.      typedef struct  
  12.      {
  13.        unsigned short imagic;
  14.        unsigned short type;
  15.        unsigned short dim;
  16.        unsigned short sizeX, sizeY, sizeZ;
  17.        unsigned long min, max;
  18.        unsigned long wasteBytes;
  19.        char name[80];
  20.        unsigned long colorMap;
  21.        FILE *file;
  22.        unsigned char *tmp[5];
  23.        unsigned long rleEnd;
  24.        unsigned long *rowStart;
  25.        unsigned long *rowSize;
  26.      } Image;
  27. static Image *ImageOpen(char *fileName)
  28. {
  29.   Image *image;
  30.   unsigned long *rowStart, *rowSize, ulTmp;
  31.   int x, i;
  32.   image = (Image *)malloc(sizeof(Image));
  33.   if (image == NULL) 
  34.     {
  35.       fprintf(stderr, "Out of memory!n");
  36.       exit(-1);
  37.     }
  38.   if ((image->file = fopen(fileName, "rb")) == NULL) 
  39.     {
  40.       perror(fileName);
  41.       exit(-1);
  42.     }
  43.   /*
  44.    * Read the image header
  45.    */
  46.   fread(image, 1, 12, image->file);
  47.   /*
  48.    * Check byte order
  49.    */
  50.   if (image->imagic == IMAGIC_SWAP) 
  51.     {
  52.       image->type = SWAP_SHORT_BYTES(image->type);
  53.       image->dim = SWAP_SHORT_BYTES(image->dim);
  54.       image->sizeX = SWAP_SHORT_BYTES(image->sizeX);
  55.       image->sizeY = SWAP_SHORT_BYTES(image->sizeY);
  56.       image->sizeZ = SWAP_SHORT_BYTES(image->sizeZ);
  57.     }
  58.   for ( i = 0 ; i <= image->sizeZ ; i++ )
  59.     {
  60.       image->tmp[i] = (unsigned char *)malloc(image->sizeX*256);
  61.       if (image->tmp[i] == NULL ) 
  62. {
  63.   fprintf(stderr, "Out of memory!n");
  64.   exit(-1);
  65. }
  66.     }
  67.   if ((image->type & 0xFF00) == 0x0100) /* RLE image */
  68.     {
  69.       x = image->sizeY * image->sizeZ * sizeof(long);
  70.       image->rowStart = (unsigned long *)malloc(x);
  71.       image->rowSize = (unsigned long *)malloc(x);
  72.       if (image->rowStart == NULL || image->rowSize == NULL) 
  73. {
  74.   fprintf(stderr, "Out of memory!n");
  75.   exit(-1);
  76. }
  77.       image->rleEnd = 512 + (2 * x);
  78.       fseek(image->file, 512, SEEK_SET);
  79.       fread(image->rowStart, 1, x, image->file);
  80.       fread(image->rowSize, 1, x, image->file);
  81.       if (image->imagic == IMAGIC_SWAP) 
  82. {
  83.   x /= sizeof(long);
  84.   rowStart = image->rowStart;
  85.   rowSize = image->rowSize;
  86.   while (x--) 
  87.     {
  88.       ulTmp = *rowStart;
  89.       *rowStart++ = SWAP_LONG_BYTES(ulTmp);
  90.       ulTmp = *rowSize;
  91.       *rowSize++ = SWAP_LONG_BYTES(ulTmp);
  92.     }
  93. }
  94.     }
  95.   return image;
  96. }
  97. static void ImageClose( Image *image)
  98. {
  99.   int i;
  100.   fclose(image->file);
  101.   for ( i = 0 ; i <= image->sizeZ ; i++ )
  102.     free(image->tmp[i]);
  103.   free(image);
  104. }
  105. static void ImageGetRow( Image *image, unsigned char *buf, int y, int z)
  106. {
  107.   unsigned char *iPtr, *oPtr, pixel;
  108.   int count;
  109.   if ((image->type & 0xFF00) == 0x0100)  /* RLE image */
  110.     {
  111.       fseek(image->file, image->rowStart[y+z*image->sizeY], SEEK_SET);
  112.       fread(image->tmp[0], 1, (unsigned int)image->rowSize[y+z*image->sizeY],
  113.     image->file);
  114.       iPtr = image->tmp[0];
  115.       oPtr = buf;
  116.       for (;;) 
  117. {
  118.   pixel = *iPtr++;
  119.   count = (int)(pixel & 0x7F);
  120.   if (!count)
  121.     return;
  122.   if (pixel & 0x80) 
  123.     {
  124.       while (count--) 
  125. {
  126.   *oPtr++ = *iPtr++;
  127. }
  128.     } 
  129.   else 
  130.     {
  131.       pixel = *iPtr++;
  132.       while (count--) 
  133. {
  134.   *oPtr++ = pixel;
  135. }
  136.     }
  137. }
  138.     }
  139.   else /* verbatim image */
  140.     {
  141.       fseek(image->file, 512+(y*image->sizeX)+(z*image->sizeX*image->sizeY),
  142.     SEEK_SET);
  143.       fread(buf, 1, image->sizeX, image->file);
  144.     }
  145. }
  146. static void ImageGetRawData( Image *image, unsigned char *data)
  147. {
  148.   int i, j, k;
  149.   int remain;
  150.   switch ( image->sizeZ )
  151.     {
  152.     case 1:
  153.       remain = image->sizeX % 4;
  154.       break;
  155.     case 2:
  156.       remain = image->sizeX % 2;
  157.       break;
  158.     case 3:
  159.       remain = (image->sizeX * 3) & 0x3;
  160.       if (remain)
  161. remain = 4 - remain;
  162.       break;
  163.     case 4:
  164.       remain = 0;
  165.       break;
  166.     }
  167.   for (i = 0; i < image->sizeY; i++) 
  168.     {
  169.       for ( k = 0; k < image->sizeZ ; k++ )
  170. ImageGetRow(image, image->tmp[k+1], i, k);
  171.       for (j = 0; j < image->sizeX; j++) 
  172. for ( k = 1; k <= image->sizeZ ; k++ )
  173.   *data++ = *(image->tmp[k] + j);
  174.       data += remain;
  175.     }
  176. }
  177. IMAGE *ImageLoad(char *fileName)
  178. {
  179.   Image *image;
  180.   IMAGE *final;
  181.   int sx;
  182.   image = ImageOpen(fileName);
  183.   final = (IMAGE *)malloc(sizeof(IMAGE));
  184.   if (final == NULL) 
  185.     {
  186.       fprintf(stderr, "Out of memory!n");
  187.       exit(-1);
  188.     }
  189.   final->imagic = image->imagic;
  190.   final->type = image->type;
  191.   final->dim = image->dim;
  192.   final->sizeX = image->sizeX; 
  193.   final->sizeY = image->sizeY;
  194.   final->sizeZ = image->sizeZ;
  195.   /* 
  196.    * Round up so rows are long-word aligned 
  197.    */
  198.   sx = ( (image->sizeX) * (image->sizeZ) + 3) >> 2;
  199.   final->data 
  200.     = (unsigned char *)malloc( sx * image->sizeY * sizeof(unsigned int));
  201.   if (final->data == NULL) 
  202.     {
  203.       fprintf(stderr, "Out of memory!n");
  204.       exit(-1);
  205.     }
  206.   ImageGetRawData(image, final->data);
  207.   ImageClose(image);
  208.   return final;
  209. }