2

我正在打印 .bmp 文件中的像素值。我的问题是,如果像素不是 255 255 255(白色),那么我希望它是 0 0 0(黑色)。

这是完整的代码:(是的,这是从从 24bpp 位图中获取每个像素的 RGB 值,以便在 C 中转换为 GBA 格式)这适用于 24 位 .bmp

#include <stdio.h>
#include <stdlib.h>
#pragma pack(2)


typedef struct
{
    char signature[2];
    unsigned int fileSize;
    unsigned int reserved;
    unsigned int offset;
} BmpHeader;

typedef struct
{
    unsigned int headerSize;
    unsigned int width;
    unsigned int height;
    unsigned short planeCount;
    unsigned short bitDepth;
    unsigned int compression;
    unsigned int compressedImageSize;
    unsigned int horizontalResolution;
    unsigned int verticalResolution;
    unsigned int numColors;
    unsigned int importantColors;

} BmpImageInfo;

typedef struct
{
    unsigned char blue;
    unsigned char green;
    unsigned char red;
    //unsigned char reserved; Removed for convenience in fread; info.bitDepth/8 doesn't seem to work for some reason
} Rgb;


int main( int argc, char **argv ) {

        FILE *inFile;
        BmpHeader header;
        BmpImageInfo info;
        Rgb *palette;
        int i = 0;

        printf( "Opening file %s for reading.\n", argv[1] );

        inFile = fopen( argv[1], "rb" );
        if( !inFile ) {
                printf( "Error opening file %s.\n", argv[1] );
            return -1;
        }

        if( fread(&header, 1, sizeof(BmpHeader), inFile) != sizeof(BmpHeader) ) {
                printf( "Error reading bmp header.\n" );
            return -1;
        }

        if( fread(&info, 1, sizeof(BmpImageInfo), inFile) != sizeof(BmpImageInfo) ) {
                printf( "Error reading image info.\n" );
            return -1;
        }

        if( info.numColors > 0 ) {
                printf( "Reading palette.\n" );
                palette = (Rgb*)malloc(sizeof(Rgb) * info.numColors);
                if( fread(palette, sizeof(Rgb), info.numColors, inFile) != (info.numColors * sizeof(Rgb)) ) {
                        printf( "Error reading palette.\n" );
                return -1; // error
                }
        }

        printf( "Opening file %s for writing.\n", argv[2] );
        FILE *outFile = fopen( argv[2], "wb" );
        if( !outFile ) {
                printf( "Error opening outputfile.\n" );
                return -1;
        }
        Rgb *pixel = (Rgb*) malloc( sizeof(Rgb) );
        int read, j;
        for( j=0; j<info.height; j++ ) {
                printf( "------ Row %d\n", j+1 );
                read = 0;
                for( i=0; i<info.width; i++ ) {
                        if( fread(pixel, 1, sizeof(Rgb), inFile) != sizeof(Rgb) ) {
                                printf( "Error reading pixel!\n" );
                                return -1;
                        }
                        read += sizeof(Rgb);
                        if (pixel->red != 255 || pixel->green != 255 || pixel->blue != 255)
                            printf( "Pixel %d: 0 0 0\n", i+1, );
                        else
                            printf( "Pixel %d: %3d %3d %3d\n", i+1, pixel->red, pixel->green, pixel->blue );
                        /*if (pixel->red != 255 || pixel->green != 255 || pixel->blue != 255)
                            printf ("Pixel %d: 0 0 0\n", i+1);
                        else
                            printf( "Pixel %d: 255 255 255\n", i+1);*/

                }
                if( read % 4 != 0 ) {
                        read = 4 - (read%4);
                        printf( "Padding: %d bytes\n", read );
                        fread( pixel, read, 1, inFile );
                }
        }

        printf( "Done.\n" );
        fclose(inFile);
        fclose(outFile);

        printf( "\nBMP-Info:\n" );
        printf( "Width x Height: %i x %i\n", info.width, info.height );
        printf( "Depth: %i\n", (int)info.bitDepth );

        return 0;

}
4

1 回答 1

3

您像素的 RGB 值可能是整数,而不是字符串:

if (pixel->red != 255 || pixel->green != 255 || pixel->blue != 255)
    printf ("Pixel %d: 0 0 0\n", i+1);
else
    printf( "Pixel %d: %3d %3d %3d\n", i+1, pixel->red, pixel->green, pixel->blue );

如果像素为白色,则要打印“255 255 255”,否则要打印“0 0 0”,这样做更简单:

if (pixel->red != 255 || pixel->green != 255 || pixel->blue != 255)
    printf ("Pixel %d: 0 0 0\n", i+1);
else
    printf( "Pixel %d: 255 255 255\n", i+1);
于 2012-04-17T15:58:46.427 回答