title: 24bpp to 8bpp conversion C with raw image data
body: <p>I am currently trying to convert raw binary image data (512 x 512 24bpp) to a 512 x 512 8bpp image by using 3bits for the R channel, 3 for the G channel, and 2 for the B channel. However when using my code my picture comes out grey scale? Can anyone tell me what I'm doing wrong?</p>
  
  <pre><code>/*24 bit per pixel - 8 bit per pixel transformation*/
  
  unsigned char buf[512][512][3];
  unsigned char in[512][512][3];
  unsigned char out[512][512][3];
  unsigned char pix[512][512];
  
  int main(){
  
      FILE *fp, *output;
      int i, j;
  
      /*open file*/
      if((fp = fopen("LennaRGB512.data", "rb")) == NULL){
          printf("error opening file\n");
      }
  
      /*read file into buffer*/
      for (i = 0; i &lt; 512; i++) {
          for (j = 0; j &lt; 512; j++) {
              buf[i][j][0] = fgetc(fp); /*r*/
              buf[i][j][1] = fgetc(fp); /*g*/
              buf[i][j][2] = fgetc(fp); /*b*/
  
              in[i][j][0] = buf[i][j][0];
              in[i][j][1] = buf[i][j][1];
              in[i][j][2] = buf[i][j][2];
          }
      }
  
      fclose(fp);
  
      output = fopen("lenna_8bpp.data", "wb");
      for(i = 0; i &lt; 512; i++){
          char pix[512][512];
          for(j = 0; j &lt; 512; j++){
              out[i][j][0] = (in[i][j][0] * 8) / 256;
              out[i][j][1] = (in[i][j][1] * 8) / 256;
              out[i][j][2] = (in[i][j][2] * 4) / 256;
              pix[i][j] = (out[i][j][0] &lt;&lt; 5) | (out[i][j][1] &lt;&lt; 2) | out[i][j][2];
              fputc(pix[i][j], output);
          }
      }
  
  
  
      fclose(output);
      return 0;
  }
  </code></pre>
  
  <p>There are tons of questions on doing this with .bmp files and others but I can't find any help with manipulating the raw image data pixel by pixel.</p>