c++;-将浮点数组转换为无符号字符数组并写入文件

c++;-将浮点数组转换为无符号字符数组并写入文件,c,arrays,file,io,C,Arrays,File,Io,我正在写一个PPM文件编写器。可以找到文件格式说明。我想以二进制格式编写文件,即P6类型 相同图像的P6二进制格式表示每个像素的每个颜色分量,每个像素有一个字节(因此每个像素有三个字节),顺序为红色、绿色、蓝色。文件较小,但颜色信息很难被人类读取 我的图像缓冲区最初是一个Vec3f数组,它位于float[3]中,因此我可以设法将Vec3f数组转换为float数组 我失败的是将浮点数组转换为无符号字符数组,以便写入.ppm文件 这是我的密码: void writePPM(char *fn, Vec

我正在写一个PPM文件编写器。可以找到文件格式说明。我想以二进制格式编写文件,即
P6
类型

相同图像的P6二进制格式表示每个像素的每个颜色分量,每个像素有一个字节(因此每个像素有三个字节),顺序为红色、绿色、蓝色。文件较小,但颜色信息很难被人类读取

我的图像缓冲区最初是一个
Vec3f
数组,它位于
float[3]
中,因此我可以设法将
Vec3f
数组转换为
float
数组

我失败的是将
浮点
数组转换为
无符号字符
数组,以便写入
.ppm
文件

这是我的密码:

void writePPM(char *fn, Vec3f *buffer, int w, int h) {
        FILE *fp = fopen(fn, "wb");
        unsigned char *char_buffer = new unsigned char[w*h*3];
        for (int i = 0; i < w*h; i+=3) {
            char_buffer[i] = (unsigned char)buffer[i].x();
            char_buffer[i+1] = (unsigned char)buffer[i].y();
            char_buffer[i+2] = (unsigned char)buffer[i].z();
        }
        fprintf(fp, "P6\n%d %d\n\255\n", w, h);
        fwrite(char_buffer, sizeof(unsigned char), w*h*3, fp);
        fclose(fp);
    }
void writePPM(char*fn,Vec3f*buffer,int w,int h){
文件*fp=fopen(fn,“wb”);
无符号字符*char_buffer=新的无符号字符[w*h*3];
对于(int i=0;i
缓冲区[i].x(),缓冲区[i].y(),缓冲区[i].z()范围从[0255]

生成的图像是完全黑色的,但宽度和高度与我的图像缓冲区匹配,因此我认为
fwrite
部分是错误的。我怎样才能修好它

我还不知道如何将
浮点
转换为
字符
char
是8位的,
float
更大,所以一定有一些数据丢失?

缓冲区索引检查

for (int i = 0; i < w*h; i+=3) {
    char_buffer[i] = (unsigned char)buffer[i/3].x();
    char_buffer[i+1] = (unsigned char)buffer[i/3].y();
    char_buffer[i+2] = (unsigned char)buffer[i/3].z();
}
for(int i=0;i
这有点猜测,但我希望指定为三个浮点的像素的每个浮点都在[0,1]范围内,0为黑色,1为白色。而我认为基于字符的像素会认为每个元素都在[0255]范围内,0为黑色,255为白色

cast
(char)someFloat
通过截断小数部分将
float
转换为
char
,因此所有像素最终都将变为黑色,或者几乎变为黑色


尝试在强制转换之前将浮点乘以255(并确保
字符
无符号),即
(无符号字符)(float*255)

C没有新的
运算符
。你确定你在用C语言编程吗?你的问题是什么?如果你将一个浮点值容纳在字符上,那么就会丢失信息。@ DeiDei实际上是一个C++项目,但我不使用C++风格I/O。<代码> x/COD>范围>代码> y>代码>代码> z<代码>值?您可能需要进行自适应。@如果文件是在
“wb”
模式下打开的,请单击此处。换行将不会转换为DOS格式。