Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:比较if语句中的十进制值_C++_Pixel - Fatal编程技术网

C++ C++;:比较if语句中的十进制值

C++ C++;:比较if语句中的十进制值,c++,pixel,C++,Pixel,我正在打印.bmp文件中像素的值。我的问题是,如果像素不是255(白色),那么我希望它是0(黑色) 这是完整的代码:(是的,这是来自) 这适用于24位.bmp #include <stdio.h> #include <stdlib.h> #pragma pack(2) typedef struct { char signature[2]; unsigned int fileSize; unsigned int reserved; uns

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

这是完整的代码:(是的,这是来自) 这适用于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;

}
#包括
#包括
#布拉格语包(2)
类型定义结构
{
字符签名[2];
无符号整数文件大小;
无符号整数保留;
无符号整数偏移量;
}BmpHeader;
类型定义结构
{
无符号整数标题;
无符号整数宽度;
无符号整数高度;
无符号短计数;
无符号短位深度;
无符号整数压缩;
无符号整数压缩dimagesize;
无符号整数水平分辨率;
无符号整数垂直分辨率;
无符号整数颜色;
未签名的国际重要颜色;
}BmpImageInfo;
类型定义结构
{
无符号字符蓝色;
无符号字符绿色;
无符号字符红色;
//保留未签名字符;为方便起见在fread中删除;info.bitDepth/8由于某种原因似乎不起作用
}Rgb;
int main(int argc,字符**argv){
文件*填充;
BMP装载机收割台;
BmpImageInfo;
Rgb*调色板;
int i=0;
printf(“打开文件%s进行读取。\n”,argv[1]);
infle=fopen(argv[1],“rb”);
如果(!infle){
printf(“打开文件%s时出错。\n”,argv[1]);
返回-1;
}
if(fread(&header,1,sizeof(BmpHeader),infle)!=sizeof(BmpHeader)){
printf(“读取bmp标头时出错。\n”);
返回-1;
}
if(fread(&info,1,sizeof(BmpImageInfo),infle)!=sizeof(BmpImageInfo)){
printf(“读取图像信息时出错。\n”);
返回-1;
}
如果(info.numColors>0){
printf(“读取调色板。\n”);
调色板=(Rgb*)malloc(sizeof(Rgb)*info.numColors);
if(fread(调色板,大小(Rgb),info.numColors,infle)!=(info.numColors*sizeof(Rgb))){
printf(“读取调色板时出错。\n”);
返回-1;//错误
}
}
printf(“打开文件%s进行写入。\n”,argv[2]);
文件*outFile=fopen(argv[2],“wb”);
如果(!outFile){
printf(“打开输出文件时出错。\n”);
返回-1;
}
Rgb*像素=(Rgb*)malloc(sizeof(Rgb));
int-read,j;
对于(j=0;jgreen!=255 | |像素->蓝色!=255)
printf(“像素%d:0\n”,i+1,);
其他的
printf(“像素%d:%3d%3d%3d\n”,i+1,像素->红色,像素->绿色,像素->蓝色);
/*如果(像素->红色!=255 | |像素->绿色!=255 | |像素->蓝色!=255)
printf(“像素%d:0\n”,i+1);
其他的
printf(“像素%d:255\n”,i+1)*/
}
如果(读取%4!=0){
读取=4-(读取%4);
printf(“填充:%d字节\n”,读取);
fread(像素,读取,1,填充);
}
}
printf(“完成。\n”);
fclose(infle);
fclose(输出文件);
printf(“\nBMP信息:\n”);
printf(“宽度x高度:%i x%i\n”,info.Width,info.Height);
printf(“深度:%i\n”,(int)info.bitDepth);
返回0;
}

像素的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”,否则要打印“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);

与数值常量(
pixel->red!=255
等)进行比较有什么问题?或者您的真实代码需要您与任意字符串值进行比较吗?那又怎样?如果像素为白色,则打印“255”,否则打印“0 0”?您不认为了解红色/绿色/蓝色的类型可能有用吗?如果您也允许使用十六进制(例如000000或FFFFFF),那就好了。另外,如果这些是真正的整数,那么只需使用
strtol()
,然后比较整数。编辑以添加更多信息。对不起,我以为这会是一个更简单的问题。我只是想知道if语句中是否有%d个等价项,但没有运气。也尝试了单引号。还有,这样做会更简单,但应该是一样的,以后我必须在第二个屏幕上需要不同颜色的地方做,图像将在这是彩色的。你怎么失败的?编译器错误?您没有获得预期的输出?输出没有变化,即使不是255,仍会输入像素值255@LiverpoolFTW-如果您复制了第二个示例,则不可能打印像素的值。您确定更改后会编译像素值吗。尝试将printf(“Version2\n”)放在顶部,并确保它出现在输出中。