read_image.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "stdlib.h"
  2. #include "stdio.h"
  3. #include "math.h"
  4. #include "basic.hpp"
  5. #include "dataStruct.hpp"
  6. Void CVTCEncoder::read_image(Char *img_path, 
  7. Int img_width, 
  8. Int img_height, 
  9. Int img_colors, 
  10. Int img_bit_depth,
  11. PICTURE *img)
  12. {
  13.   FILE *infptr = NULL;
  14.   int  img_size;
  15.    /* chroma  width and height  to handle odd image size */
  16.   int img_cwidth  = (img_width+1)/2, 
  17.       img_cheight = (img_height+1)/2; 
  18.   int wordsize = (img_bit_depth>8)?2:1;
  19.   unsigned char *srcimg; /* SL: to handle 1-16 bit */
  20.   int  i,k,status;
  21.   
  22.   if (img_colors==1) { /*SL: image size for mono */
  23.      img_size = img_width*img_height; /* bit_depth>8 occupies 2 bytes */
  24.   }
  25.   else { /* only for 420 color for now */
  26.     img_size = img_width*img_height+2*img_cwidth*img_cheight; 
  27.   }
  28.   
  29.   srcimg = new UChar[img_size*wordsize];
  30.   if ((infptr = fopen(img_path,"rb")) == NULL) 
  31.     exit(fprintf(stderr,"Unable to open image_file: %sn",img_path));
  32.   if ((status=fread(srcimg, sizeof(unsigned char)*wordsize, img_size, infptr))
  33.        != img_size)
  34.     exit(fprintf(stderr,"Error in reading image file: %sn",img_path));
  35.   fclose(infptr);
  36.   
  37.   /* put into VM structure */
  38.   img[0].width  = img_width;
  39.   img[0].height = img_height;
  40.   if(img_colors != 1) { /* SL: only for color image */
  41.     img[1].width  = img_cwidth; /* to handle odd image size */
  42.     img[1].height = img_cheight;
  43.     img[2].width  = img_cwidth;
  44.     img[2].height = img_cheight;
  45.   }
  46.   img[0].data = (void *)new UChar[img_width*img_height*wordsize];
  47.   if (img_colors==3) {
  48. img[1].data = (void *)new UChar[img_cwidth*img_cheight*wordsize];
  49.     img[2].data = (void *)new UChar[img_cwidth*img_cheight*wordsize];
  50.   }
  51.   k=0;
  52.   for (i=0; i<img_width*img_height*wordsize; i++) { 
  53.     if (img_bit_depth > 8){ /* mask the input */
  54.       if (i%2==0)
  55.         ((UChar *)img[0].data)[i] =
  56.       (UChar) (srcimg[k++]&((1<<(img_bit_depth-8))-1));
  57.       else
  58.         ((unsigned char *)img[0].data)[i] = srcimg[k++];
  59.     }
  60.     else {
  61.       ((unsigned char *)img[0].data)[i] = 
  62. (unsigned char) (srcimg[k++]&((1<<img_bit_depth)-1));
  63.     }
  64.   }
  65.   if (img_colors != 1) { /* SL: only for color image */
  66.     for (i=0; i<img_cwidth*img_cheight*wordsize; i++) {
  67.       if (img_bit_depth > 8) { /* mask the input */
  68.         if (i%2==0) 
  69.            ((unsigned char *)img[1].data)[i] = 
  70.      (unsigned char) (srcimg[k++]&((1<<(img_bit_depth-8))-1));
  71.         else
  72.            ((unsigned char *)img[1].data)[i] = srcimg[k++];
  73.       }
  74.       else {
  75.         ((unsigned char *)img[1].data)[i] = 
  76.   (unsigned char) (srcimg[k++]&((1<<img_bit_depth)-1));
  77.       }
  78.     }
  79.     for (i=0; i<img_cwidth*img_cheight*wordsize; i++){
  80.       if (img_bit_depth > 8) { /* mask the input */
  81.         if (i%2==0) 
  82.            ((unsigned char *)img[2].data)[i] = 
  83.      (unsigned char) (srcimg[k++]&((1<<(img_bit_depth-8))-1));
  84.         else
  85.           ((unsigned char *)img[2].data)[i] = srcimg[k++];
  86.       }
  87.       else {
  88.         ((unsigned char *)img[2].data)[i] = 
  89.   (unsigned char) (srcimg[k++]&((1<<img_bit_depth)-1));
  90.       }
  91.     }
  92.   }
  93.   if (srcimg) delete (srcimg);
  94. }