我正在尝试替换bmp图像中的颜色。我尝试将unsigned char变量直接等于某个值...就像
unsigned char oldr=255, oldg=255, oldb=0
这很好用。
但现在我想把这种颜色作为用户的输入。
当我使用cin流时,它需要255个三个字符,因此直接获取unsigned char的输入不起作用。
我试图将输入转换为整数,然后将类型转换为char ...
但这不起作用。我试图打印字符,有时,这些字符对于ASCII表来说很好。有时只显示空格。但是不要在位图中工作。
unsigned int inewr, inewg, inewb, ioldr, ioldg, ioldb // Creating Integers;
cout << "Enter R - G - B of Color to Replace: ";
cin >> ioldr >> ioldg >> ioldb; // Taking Integers of Old Color From User
cout << "Enter R - G - B of New: ";
cin >> inewr >> inewg >> inewb; // Taking Integers of New Color From User
// Type casting to char
unsigned char newr=inewr, newg=inewg, newb=inewb, oldr=ioldr, oldg=ioldr, oldb=ioldb;
cout << newr << " " << newg << " " << newb << endl; // Printing out characters
cout << oldr << " " << oldg << " " << oldb << endl;`
然后检查颜色并写入文件......
for (int j=0; j<height; j++) {
for (int i=0; i<width*3; i+=3) {
b = mainarray[i][j];
g = mainarray[i+1][j];
r = mainarray[i+2][j];
if ( r==oldr && g==oldg && b==oldb) {
fout.write((char*) &newb, 1);
fout.write((char*) &newg, 1);
fout.write((char*) &newr, 1);
} else {
fout.write((char*) &b, 1);
fout.write((char*) &g, 1);
fout.write((char*) &r, 1);
}
}
}
注意:我没有告诉你的代码中的数组和所有其他内容都没问题... 只是在类型铸造中存在问题。正如我所说,把oldr = 255的工作非常精细...... 我也没有使用任何库。它适用于24位位图图像
答案 0 :(得分:0)
您输入字符时输入问题会出错。简单cin >> my_unsigned_char
工作正常:用户输入255,该值存储在my_unsigned_char
中。显而易见的问题是......
cout << newr << " " << newg << " " << newb << endl; // Printing out characters
当值为unsigned_char
时,这会看到像255这样的值,并将它们作为单个字符发送到终端,而不是将数值显示为表示十进制各个数字的一系列字符,即“2”,然后'5',然后'5'。
总之,您可以直接输入unsigned char
,但如果您想要读取输入的数值,则应在输出时转换为(int)
:
std::cout << static_cast<int>(my_unsigned_char) << '\n';
答案 1 :(得分:0)
首先:我在代码中看到一些错误:
缺少&#34;;&#34;在ioldb之后
ImmutableList.copyOf(Streams.generate(Foo::new).limit(n).iterator());
&#34; oldg = ioldr&#34;必须是&#34; oldg = ioldg&#34;
unsigned int inewr, inewg, inewb, ioldr, ioldg, ioldb // Creating Integers;
还有更多&#34;`&#34;最后。
// Type casting to char
unsigned char newr=inewr, newg=inewg, newb=inewb, oldr=ioldr, oldg=ioldr, oldb=ioldb;
如果你想改变自己的价值,我认为你需要像下面这样说明,它更清楚:
cout << oldr << " " << oldg << " " << oldb << endl;`
你能否详细了解关于&#34;不能在位图&#34;中工作的错误,我认为fout必须由&#34; std :: ofstream :: binary&#34初始化;