cimagepngjpegreadimage

How to read images using C


is there a way to read image pixels or any data considering the image using FILE fopen in C? I'm not interested in libraries. I tried to read the image data with fgetc but it prints out some numbers which don't make any sense.

EDIT: I know it's supposed to print out numbers but I was expecting numbers that represent each pixels.

EDIT: I'm looking for documentation links that will help me comprehend how jpeg or png formats work and store data.


Solution

  • If you really want to be able to read and write images, simply, via a FILE pointer, you'll want to look at a file format called a .ppm. (Portable Pixel Map.) This assumes, of course, that you can convert your image files to a .ppm, but that is easily achievable with the imagemagick command-line tool. You can use imagemagick to convert the .ppms you write to any output type you like.

    The format is insanely simple:

    Example:

    P6 128 128 255
    [128 * 128 * 3 bytes of data go here, in row major order. The top-left 
     pixel is first, then the pixel to the right of it. When you get to the 
     end of a row, just write the first pixel of the next row. That's all 
     there is. No other header info, no terminators, etc.]
    

    Example:

    #include <stdio.h>
    void main() {
      FILE * out;
      out = fopen("color_test.ppm", "wb");
      fprintf(out, "P6 256 256 255\n");
      for(int r=0; r<256; r++) {
        for(int b=0; b<256; b++) {
          fputc(r, out);
          fputc(0, out);
          fputc(b, out);
        }
      }
      fclose(out);
    }
    

    This generates:

    Image with reds in the vertical (0 at top and 255 at bottom) and blues along the bottem, with 0 at the left.

    Reading files is similarly easy. You can just pull them into a 3d array of unsigned chars, manipulate them in memory however you like, then write that data back out to another file much as my example does here.