C ++, как разобрать файл ppm? - PullRequest
       58

C ++, как разобрать файл ppm?

0 голосов
/ 17 февраля 2020

Я пытаюсь разобрать файл ppm.

Значение c таково: http://netpbm.sourceforge.net/doc/ppm.html

Пример:


P3
# feep.ppm
4 4
15
 0  0  0    0  0  0    0  0  0   15  0 15
 0  0  0    0 15  7    0  0  0    0  0  0
 0  0  0    0  0  0    0 15  7    0  0  0
15  0 15    0  0  0    0  0  0    0  0  0

Вещество после «15» - это rgb значения всех пикселей в данном изображении.

Я пробовал это до сих пор:




void read_and_draw_ppm_file() {
    ifstream infile;
    infile.open(TEXTURE_FILE.c_str());
    string line;
    int count = 0;
    while (getline(infile, line) && count < 4) {
        count++;
    }


    char c;

    int red = -1, green = -1, blue = -1;
    int rgb_count = 0;
    for (int i = 0; i < TEXTURE_WIDTH; i++) {
        for (int j = 0; j < TEXTURE_HEIGHT; j++) {


              infile >> c;


            if (rgb_count == 0) {
                if (red != -1 && blue != -1 && green != -1) {
                    cout << red<<endl;
                    cout << green<<endl;
                    cout << blue<<endl;


                    uint32_t colour = (255 << 24) + (int(red) << 16) + (int(green) << 8) + int(blue);
                    window.setPixelColour(i, j, colour);

                     red = -1;
                    blue = -1;
                    green = -1;
                }
                red = (int) (unsigned char) c;
                rgb_count++;

            } else if (rgb_count == 1) {
                green = (int) (unsigned char) c;
                rgb_count++;
            } else if (rgb_count == 2) {
                blue = (int) (unsigned char) c;
                rgb_count = 0;
            }
        }

    }
    infile.close();
}



Идея состоит в том, чтобы в основном извлечь триплеты по 3 байта, а затем преобразовать каждый в rgb соответственно.

Проблема в том, что когда я отображаю изображение на экране, оно не совсем такое, каким оно должно быть.

Где я ошибаюсь?

Исходное изображение:

enter image description here

Рендеринг изображения enter image description here изображение:

1 Ответ

1 голос
/ 18 февраля 2020

Вы читаете значение для red, затем увеличиваете j. Затем вы читаете green и увеличиваете j. Затем вы читаете blue, сохраняете значение в пикселях и увеличиваете j.

Таким образом, вы записываете свои значения с интервалом в 3 строки.

...