在C++中将图像数据(R,G和B像素)读取到2D数组中

Reading image data (R,G, & B pixel) into 2D arrays in C++

本文关键字:像素 读取 数组 2D 图像 C++ 数据      更新时间:2023-10-16

我能够很好地读取图像的头文件,但是我无法将红色通道的第一个数据值(例如 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

而且我不确定我将如何处理""。

我搜索了信息,结果比现在更困惑。我希望有人朝着正确的方向推动,或者有人指出我的愚蠢。提前谢谢。

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

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

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

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

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