Getting RGB values for each pixel from a 24bpp Bitmap for conversion to GBA format in C

后端 未结 8 1555
南方客
南方客 2020-12-16 08:52

I want to read the RGB values for each pixel from a .bmp file, so I can convert the bmp into a format suitable for GBA (GameBoy Advance).

I

8条回答
  •  别那么骄傲
    2020-12-16 09:19

    You need first to get the number of colors available in the embedded palette. This is available in the DIB Header.

    Then you can read all color components that contain the palette.

    You can see all header information like offset to know whereto seek : http://en.wikipedia.org/wiki/BMP_file_format.

    This should work: (Edit: Add code to write in file)

    FILE *inFile, *outFile;
    BMPHeader header;
    BMPImageInfo info;
    RGB *palette, *p;
    int i = 0;
    
    inFile = fopen("C://in.bmp", "rb");
    if( !inFile )
       return;
    
    if( fread(&header, sizeof(BMPHeader), 1, inFile) != 1 )
       return; // Manage error and close file
    
    if( fread&info, sizeof(BMPImageInfo), 1, inFile) != 1 )
       return; // Manage error and close file
    
    if( info.numColors > 0 )
    {
       palette = (RGB*)malloc(sizeof(RGB) * info.numColors);
       if( fread(palette, sizeof(RGB), info.numColors, inFile) != info.numColors )
          return; // manage error and close file
    }
    
    fclose(inFile)
    
    // Binary method => if read later by another computer
    outFile = fopen("path", "wb");
    if( !outFile )
       return;
    
    if( fwrite(&info.numColors, sizeof(unsigned int), 1, outFile) != 1 )
       return; // Manage Error and close file
    
    if( fwrite(&palette, sizeof(RGB), info.numColors, outFile) != info.numColors )
       return; // Manage error and close file
    
    fclose(outFile);
    
    // Text method => if read later by human
    outFile = fopen("path", "w");
    if( !outFile )
       return;
    
    for( i=0; ired, p->green, p->blue) < 0 )
          return; // Manage error and close file
    }
    
    fclose(outFile);
    

提交回复
热议问题