2016-06-08 191 views
0

我试图在bmp图像中替换颜色。我尝试使无符号字符变量直接等于一些值...像
unsigned char oldr=255, oldg=255, oldb=0
这工作得很好。将整数转换为位图颜色RGB值C++

但是现在我想把这种颜色作为用户的输入。 当我使用cin流时,它需要255个三个字符,所以直接输入到unsigned char不起作用。 我试图把输入到整数,然后typecast 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

cout << int(newr)<<”“<< int(newg)<<”“<

回答

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'; 
0

第一:我看到一些错误代码:

有丢失“;”后ioldb

unsigned int inewr, inewg, inewb, ioldr, ioldg, ioldb // Creating Integers; 

的 “oldg = ioldr” 必须 “oldg = ioldg”

// Type casting to char 
unsigned char newr=inewr, newg=inewg, newb=inewb, oldr=ioldr, oldg=ioldr, oldb=ioldb; 

有更多的 “`” 到底。

cout << oldr << " " << oldg << " " << oldb << endl;` 

如果你想checke你CIN的价值,我想你需要清点如下,它更清晰:

cout << static_cast<unsigned int>(newr) << " " << static_cast<unsigned int>(newg) << " " << static_cast<unsigned int>(newb) << endl; // Printing out characters 
cout << static_cast<unsigned int>(oldr) << " " << static_cast<unsigned int>(oldg) << " " << static_cast<unsigned int>(oldb) << endl; 

而且你能不能说说关于“唐”的故障详细t工作在位图中“,我认为fout必须通过”std :: ofstream :: binary“来初始化。