将整数转换为位图颜色RGB值C ++

时间:2016-06-08 01:14:22

标签: c++ bitmap rgb

我正在尝试替换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位位图图像

2 个答案:

答案 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初始化;