2012-04-17 9 views
2

Я печатаю значения пикселей в файле .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; 

} 
+0

Что не так при сравнении с числовой константой ('pixel-> red! = 255' и т. Д.)? Или ваш реальный код требует от вас сравнения с произвольными строковыми значениями? –

+1

И что? Если пиксель белый, вы печатаете «255 255 255», иначе вы печатаете «0 0 0»? – mfontanini

+0

Вам не кажется, что было бы полезно знать, какие типы красные/зеленые/синие? – PlasmaHH

ответ

3

пиксельный являются, вероятно, целые числа, а не строки:

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); 
+0

Пробовал это без везения. также пробовал с одинарными кавычками тоже. Также ya, что было бы проще сделать это таким образом, но он должен работать одинаково, и позже мне придется делать это, когда мне нужны разные цвета для второго экрана, на котором будет отображаться изображение. – LiverpoolFTW

+0

Как вы потерпели неудачу? Ошибка компилятора? Вы не получили ожидаемый результат? – mfontanini

+0

Отсутствие изменения в выходе, по-прежнему ставит значение пикселя, даже если его не 255 255 255 – LiverpoolFTW

Смежные вопросы