我写netbpm图像的代码有什么问题?

时间:2019-01-02 20:29:40

标签: c++ binary-data pgm

我目前正在从事一个需要输出生成图像的项目。由于其简单性,我决定使用灰度netbpm format。这些图像之一是高度图。我要导出的代码如下:

#include <array>
#include <fstream>
#include <iostream>

int main(){
    constexpr unsigned LENGTH = 4;
    std::array<double, LENGTH*LENGTH> m_data = {
        0, 0, 0, 0,  
        0, 1, 1, 0,
        0, 1, 1, 0,
        0, 0, 0, 0
    };

    std::ofstream fout;
    fout.exceptions(std::ios::badbit | std::ios::failbit);
    fout.open("test.pgm", std::ios::binary);
    fout << "P5 " << LENGTH << " " << LENGTH << "\n256\n";

    for(unsigned i=0;i<LENGTH*LENGTH;++i){
        unsigned char brightness = m_data[i]*255;
        std::cout << m_data[i] << std::endl;
        fout.write(reinterpret_cast<char*>(&brightness), sizeof(unsigned char));
    }

    return 0;
}

在阅读the specification for the netbpm format on Wikipedia之后,该代码对我而言似乎是正确的。但是,当我尝试在Gimp或Clion中打开此图像时,会出现各种错误:

Non-specific error from Clion "Premature end of file" error from Gimp.

文件以扩展名pgm保存。我的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

尝试像这样编写NetPBM标头:

fout << "P5\n" << LENGTH << " " << LENGTH << "\n255\n";

原因是大多数图像读取器都会检查MAXVAL,如果该值小于或等于255,则假定每个像素为8位。如果MAXVAL超过255,则它们假定每个像素16位,因此他们会抱怨您的文件太短(因为它不提供每个像素2个字节)。