0

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.

4

3 回答 3

1

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:

  • Starts with the two character (the "magic number") "P6"
  • The P6 is followed by a whitespace, then the width (in ascii) of the image.
  • The width is followed by a whitespace, then the height (in ascii) of the image.
  • The last bit of the header is the "maximum value" of an entry. Just use 255. Follow this with a whitespace.
  • After that, you just write, in binary, RGB values. One unsigned char per channel.

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.

于 2021-10-15T07:52:38.373 回答
0

I don't quite understand what you want to do, but C language is a low level programming language. Of course, there will be nothing but numbers in memory.

The easiest way to store an image in C is creating a matrix structure and keeping the RGB values. The numbers you mention can be the RGB values ​​of each pixel.

于 2021-10-15T07:49:45.070 回答
0

You can read images without using libraries, but it's a lot of work.

For example, libjpeg-turbo is probably the most popular library for reading JPEG images:

https://github.com/libjpeg-turbo/libjpeg-turbo

It's around 50,000 lines of C and assembly.

Interestingly, it includes functions to read and write some other formats (these routines are used by the command-line JPEG tools for file format conversion). For example, here's the code used by libjpeg-turbo to load a BMP image:

https://github.com/libjpeg-turbo/libjpeg-turbo/blob/main/rdbmp.c

About 700 lines, though it can only read a subset of BMPs.

于 2021-10-15T08:53:03.030 回答