Я печатаю значения пикселей в файле .bmp. Моя проблема в том, что если пиксель не 255 255 255 (белый), тогда я хочу, чтобы он был 0 0 0 (черный).C++: сравнение десятичного значения в выражении if
Это полный код: (Да это от Getting RGB values for each pixel from a 24bpp Bitmap for conversion to GBA format in C) Это работает для 24 бит .bmp значений RGB
#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;
}
Что не так при сравнении с числовой константой ('pixel-> red! = 255' и т. Д.)? Или ваш реальный код требует от вас сравнения с произвольными строковыми значениями? –
И что? Если пиксель белый, вы печатаете «255 255 255», иначе вы печатаете «0 0 0»? – mfontanini
Вам не кажется, что было бы полезно знать, какие типы красные/зеленые/синие? – PlasmaHH