1

我能够很好地读取图像的头文件,但是我无法将红色通道的第一个数据值(例如 206)放入 2D 数组ppmImage.red[0][0]中。随后是一个空白,然后是绿色通道的第一个值,依此类推。

以下是我目前正在做的事情,而不是 206 ppmImage.red[0][0],我有ppmImage.red[0][0]= 2、ppmImage.green[0][0]=0 和ppmImage.blue[0][0]=6。作为参考,这些只是 8 位值,因此红色、绿色和蓝色是像素类型,并且是unsigned char.

void readTextData(fstream &fin, struct ppmImage &image)
{
int iii, jjj;

for(iii = 0; iii < image.rows ; iii++)
{
    for(jjj = 0; jjj < image.cols; jjj++)
    {
        fin >> image.red[iii][jjj];     
        fin >> image.green[iii][jjj];
        fin >>image.blue[iii][jjj]; 
    }
}

fin.close();
}

我以为fin >>会一直读到空白处,但我错了。我也尝试过使用fin.read((char *) & image.redgray[iii][jjj],sizeof(pixel));,但最终得到了相同的结果。

数据可以采用如下形式:

1 2
3 4 5
6 7 8 9

而且我不确定如何处理'\ n'。

我搜索了信息,结果比我现在更加困惑。我会很感激朝着正确的方向轻推或有人指出我的愚蠢。提前致谢。

4

2 回答 2

0

这听起来像是一个简单的修复,您必须读取整数而不是无符号字符。由于您的图像使用 unsigned char,您只需添加一些用于读取的临时整数。

    int red, green, blue;
    fin >> red >> green >> blue; 
    image.red[iii][jjj] = red;
    image.green[iii][jjj] = green;
    image.blue[iii][jjj] = blue; 

我假设您的图像文件是文本文件,从您的描述来看似乎是这种情况。

于 2013-10-08T04:08:11.050 回答
0

如果可能的话,我会从包含数组的结构更改为结构数组:

struct pixel { 
    unsigned char red, green, blue;

    friend std::istream &operator>>(std::istream &is, pixel &p) { 
        unsigned int red, green, blue;
        is >> red >> green >> blue;
        p.red = red;
        p.green = green;
        p.blue = blue;
        return is;
    }
};

// ...

for (i = 0; i<image.cols; i++)
    for (j=0; j<image.rows; j++)
        if (!infile >> pixels[i][j])
            break; // read failed
于 2013-10-08T04:12:12.997 回答