Что не так с моим кодом для записи изображений в netbpm? - PullRequest
0 голосов
/ 02 января 2019

Я сейчас работаю над проектом, который должен выводить сгенерированные изображения. Я решил использовать greyscale 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;
}

Этот код мне кажется правильным, после прочтения спецификации для формата netbpm в Википедии . Тем не менее, когда я пытаюсь открыть это изображение в Gimp или Clion, возникают различные ошибки:

Non-specific error from Clion

Файл сохраняется с расширением pgm. Что не так с моим кодом?

1 Ответ

0 голосов
/ 03 января 2019

Попробуйте написать заголовок NetPBM следующим образом:

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

Причина в том, что большинство программ чтения изображений проверяют MAXVAL и, если оно равно 255 или меньше, они принимают 8 бит на пиксель.Если MAXVAL превышает 255, они принимают 16 бит на пиксель, поэтому они будут жаловаться, что ваш файл слишком короткий (так как он не обеспечивает 2 байта на пиксель).

...