C++ 将浮点数转换为无符号字符?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3898817/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C++ Converting a float to an unsigned char?
提问by Steve
I'm new to C++, and doing a bit of googling I thought sprintf
would do the job, but I get an error upon compiling that I can't convert between an unsigned char
and a char
. I need an unsigned char because I am going to print to an image file (0-255 RGB).
我是 C++ 的新手,做了一些我认为sprintf
可以完成这项工作的谷歌搜索,但是在编译时出现错误,我无法在 anunsigned char
和 a之间进行转换char
。我需要一个无符号字符,因为我要打印到一个图像文件(0-255 RGB)。
unsigned char*** pixels = new unsigned char**[SIZE];
vector<float> pixelColors;
...
sprintf(pixels[i][j][k], "%.4g", pixelColors.at(k));
(pixelColors has size of 3 and 'k' refers to a 'for loop' variable)
(pixelColors 的大小为 3,“k”指的是“for 循环”变量)
回答by Frank
I'll guess that the floats are in the range 0.0 ... 1.0, then you do it like this:
我猜浮点数在 0.0 ... 1.0 范围内,然后你这样做:
float redf = 0.5f;
unsigned char reduc = redf * 255;
The variable reduc is now 128.
变量reduc 现在是128。
EDIT:complete example, outputting image in Net PPM format.
编辑:完整示例,以 Net PPM 格式输出图像。
// Usage
// program > file.ppm
#include <vector>
#include <iostream>
typedef struct
{ /* colors in range 0..1 anything else is out of gamut */
float red, green, blue;
} color;
using namespace std;
int main ( int argc, char **argv )
{
int width = 10, height = 10;
vector<color> bitmap; // This should maybe be called floatmap? ;)
// Make an image in memory as a float vector
for( int y = 0; y < height; y++ )
{
for( int x = 0; x < width; x++ )
{
color temp;
temp.red = ((float)x / width);
temp.green = 0;
temp.blue = ((float)y / height);
bitmap.push_back(temp);
}
}
// output image as an Netppm pixmap
cout << "P3" << endl << width << " " << height << endl << 255 << endl;
for( int y = 0; y < height; y++ )
{
for( int x = 0; x < width; x++ )
{
int red, green, blue;
red = (unsigned char)(bitmap[y*width+x].red * 255);
green = (unsigned char)(bitmap[y*width+x].green * 255);
blue = (unsigned char)(bitmap[y*width+x].blue * 255);
cout << red << " ";
cout << green << " ";
cout << blue << " ";
}
cout << endl;
}
return 0;
}
}
I hope this helps you. You can read about Netpbm format on wikipedia.
我希望这可以帮助你。您可以在 wikipedia 上阅读有关Netpbm 格式的信息。
EDIT2:The image output is clear text.
Result is like this:(Tiny, isn't it? edit line 16 to 512x512 or something)
EDIT2:图像输出是明文。
结果是这样的:(Tiny,不是吗?将第 16 行编辑为 512x512 之类的)
And the actual output is this:
实际输出是这样的:
P3
10 10
255
0 0 0 25 0 0 51 0 0 76 0 0 102 0 0 127 0 0 153 0 0 178 0 0 204 0 0 229 0 0
0 0 25 25 0 25 51 0 25 76 0 25 102 0 25 127 0 25 153 0 25 178 0 25 204 0 25 229 0 25
0 0 51 25 0 51 51 0 51 76 0 51 102 0 51 127 0 51 153 0 51 178 0 51 204 0 51 229 0 51
0 0 76 25 0 76 51 0 76 76 0 76 102 0 76 127 0 76 153 0 76 178 0 76 204 0 76 229 0 76
0 0 102 25 0 102 51 0 102 76 0 102 102 0 102 127 0 102 153 0 102 178 0 102 204 0 102 229 0 102
0 0 127 25 0 127 51 0 127 76 0 127 102 0 127 127 0 127 153 0 127 178 0 127 204 0 127 229 0 127
0 0 153 25 0 153 51 0 153 76 0 153 102 0 153 127 0 153 153 0 153 178 0 153 204 0 153 229 0 153
0 0 178 25 0 178 51 0 178 76 0 178 102 0 178 127 0 178 153 0 178 178 0 178 204 0 178 229 0 178
0 0 204 25 0 204 51 0 204 76 0 204 102 0 204 127 0 204 153 0 204 178 0 204 204 0 204 229 0 204
0 0 229 25 0 229 51 0 229 76 0 229 102 0 229 127 0 229 153 0 229 178 0 229 204 0 229 229 0 229
回答by Roopesh Majeti
Not sure, what is your exact requirement [ since you didnot paste a snippet of the code .. as Greg requested ], following example might resolve it :
不确定,您的确切要求是什么[因为您没有按照 Greg 的要求粘贴代码片段.. ],以下示例可能会解决它:
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
float i=1;
unsigned char c;
c = static_cast<unsigned char>(i);
cout << c << endl;
getch();
return 0;
}