【问题标题】:C++ Converting a float to an unsigned char?C ++将浮点数转换为无符号字符?
【发布时间】:2011-04-23 08:46:15
【问题描述】:

我是 C++ 新手,在谷歌上搜索了一下,我认为 sprintf 可以完成这项工作,但编译时出现错误,无法在 unsigned charchar 之间进行转换。我需要一个无符号字符,因为我要打印到图像文件 (0-255 RGB)。

unsigned char*** pixels = new unsigned char**[SIZE];
vector<float> pixelColors;

...

sprintf(pixels[i][j][k], "%.4g", pixelColors.at(k));

(pixelColors 的大小为 3,“k”指的是“for loop”变量)

【问题讨论】:

  • 您想将浮点数转换为字符串吗?还是要打印浮点值的二进制表示?
  • 我编辑了我的主要帖子。我有一个无符号字符的 3D 动态数组,并且想要存储每个浮点数的字节值。
  • 等等,你的意思是你要把图像数据发送到打印机吗?如果是这样,那么您将不得不查找 CUPS(通用 Unix 打印系统)或 windows 等效项。
  • 正如其他人所说 - 浮动的范围是多少?是 0.0 到 1.0,还是其他?您将需要将浮点范围缩放到无符号字符范围。
  • @Frank 不,只是一个图像文件。 @Jeff 从 0-255

标签: c++ floating-point unsigned-char


【解决方案1】:

我猜浮点数在 0.0 ... 1.0 的范围内,那么你可以这样做:

float redf = 0.5f;
unsigned char reduc = redf * 255;

变量 reduc 现在是 128。


编辑:完整示例,以 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;

}

我希望这对你有帮助。你可以阅读Netpbm format on wikipedia


EDIT2:图像输出为明文。
结果是这样的:
(很小,不是吗?将第 16 行编辑为 512x512 之类的)

而实际的输出是这样的:

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 

【讨论】:

  • 如果float值的范围不同,函数中需要改什么?
【解决方案2】:

不确定,您的确切要求是什么 [因为您没有按照 Greg 的要求粘贴代码的 sn-p ..],下面的示例可能会解决它:

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多