Как проверить, не хватает ли значений цвета в изображении RGB ppm - PullRequest
0 голосов
/ 20 марта 2020

Я делаю функцию, которая загружает ppm-изображение в двумерный массив, где каждый элемент массива представляет собой структуру, содержащую значения красного, зеленого и синего цветов. Помимо прочего, функция должна проверить, имеет ли файл заданные размеры изображения по высоте и ширине, достаточно ли значений цвета для заполнения массива. Модульный тест для этой проверки ошибок не выполняется и завершается с ошибкой, которая помечает нецелые значения.

Как это исправить? (Я пытаюсь проверить, не достаточно ли значений цвета в начале вложенных циклов)

bool loadImage(string filename, Pixel** image, int width, int height) {
    // checks if file can open
    ifstream fin(filename);
    if (!fin.is_open()) {
        cout << "Error: failed to open input file - " << filename << endl;
        return false;
    }


    // checking if p3
    char type[3];
    fin >> type;  // should be p3
    if (((toupper(type[0]) != 'P') && (toupper(type[0]) != 'p')) || (type[1] != '3')) {
        cout << "Error: type is " << type << " instead of P3" << endl;
        return false;
    }


    // input value does not match value in file (entered width and height not same as that of image)
    int filewidth = 0;
    int fileheight = 0;
    fin >> filewidth;
    fin >> fileheight;
    if (fin.fail()) {
        cout << "Error: read non-integer value" << endl;
        cout << "1" << endl;
        return false;
    }
    if (filewidth != width) {
        cout << "Error: input width (" << width << ") does not match value in file (" << filewidth << ")" << endl;
        return false;
    }
    if (fileheight != height) {
        cout << "Error: input height (" << height << ") does not match value in file (" << fileheight << ")" << endl;
        return false;
    }

    // get max color from preamble
    int maxColor = 0;
    fin >> maxColor;
    if (maxColor != 255) {
        cout << "Error: file is not using RGB color values" << endl;
        return false;
    }

    // get RGB color values

    int red=0;
    int green=0;
    int blue=0;
    for (int i = 0; i < height; i++) {  // switched height and width and i++ and j++ to ++i and ++j
        for (int j = 0; j < width; j++) {

            if (fin.eof()) {
                cout << "Error: not enough color values" << endl;
                return false;
            }

            fin >> ws;
            fin >> red;
            if (fin.eof()) {
                cout << "Error: not enough color values" << endl;
                return false;
            }

            fin >> ws;
            fin >> green; 
            if (fin.eof()) {
                cout << "Error: not enough color values" << endl;
                return false;
            }

            fin >> ws;
            fin >> blue;
            if (fin.eof() && i < (height -1) && j < (width -1)) { // reads eof and hasn't reached full span of file
                cout << "Error: not enough color values" << endl;
                return false;
            }


            // checking valid color range
            if (red < 0 || red > 255) {
                cout << "Error: invalid color value " << red << endl;
                return false;
            }
            if (green < 0 || green > 255) {
                cout << "Error: invalid color value " << green << endl;
                return false;
            }
            if (blue < 0 || blue > 255) {
                cout << "Error: invalid color value " << blue << endl;
                return false;
            }

            // non integer values check
            if (fin.fail()) {
                cout << "Error: read non-integer value" << endl;
                return false;
            }

            image[j][i].r = red;  
            image[j][i].g = green;
            image[j][i].b = blue;
        }
    }

    // too many color values
    fin >> red;
    if (!fin.eof()) {
        cout << "Error: too many color values" << endl;
        return false;
    }

    return true;

}

1 Ответ

0 голосов
/ 21 марта 2020

Я понял это. Это была проблема с тем, как я проверял, не было ли достаточно цветов в изображении ppm. Мне нужно было учесть тот факт, что я выходил с ошибкой, которая проверяла не целочисленные значения всякий раз, когда не хватало цветовых значений.

ниже - это просто сегмент в начале вложенных циклов, которые я изменено.

int red=0;
    int green=0;
    int blue=0;
    for (int i = 0; i < height; i++) {  
        for (int j = 0; j < width; j++) {

            if (fin.eof()) {
                cout << "Error: not enough color values" << endl;
                return false;
            }

            fin >> ws;
            fin >> red;
            if (fin.eof() && fin.fail()) { // reads eof and hasn't reached full span of file
                cout << "Error: not enough color values" << endl;
                return false;
            }

            fin >> ws;
            fin >> green; 
            if (fin.eof() && fin.fail()) { // reads eof and hasn't reached full span of file
                cout << "Error: not enough color values" << endl;
                return false;
            }

            fin >> ws;
            fin >> blue;
            if (fin.eof() && fin.fail()) { // reads eof and hasn't reached full span of file
                cout << "Error: not enough color values" << endl;
                return false;
            }
...