繁体   English   中英

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

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

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

以下是我当前正在执行的操作,而不是在ppmImage.red[0][0]中显示206,而我拥有了ppmImage.red[0][0] = 2, ppmImage.green[0][0] = 0,并且ppmImage.blue[0][0] = 6。 作为参考,这些将仅是8位值,因此红色,绿色和蓝色为pixel类型,并且为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'。

我一直在寻找信息,结果比以前更加困惑。 我希望朝正确的方向轻描淡写,或者有人指出我的愚蠢。 提前致谢。

这听起来像一个简单的解决方法,您必须读取不是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; 

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM