C++ C++;:比较if语句中的十进制值
我正在打印.bmp文件中像素的值。我的问题是,如果像素不是255(白色),那么我希望它是0(黑色) 这是完整的代码:(是的,这是来自) 这适用于24位.bmpC++ 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
#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”)放在顶部,并确保它出现在输出中。