【问题标题】:Reading image data (R,G, & B pixel) into 2D arrays in C++在 C++ 中将图像数据(R、G 和 B 像素)读入二维数组
【发布时间】:2013-10-14 20:31:51
【问题描述】:

我能够很好地读取图像的头文件,但是我无法将红色通道的第一个数据值(例如 206)放入二维数组 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 位值,因此红色、绿色和蓝色是像素类型,并且是 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 &gt;&gt; 会一直读到它碰到空白,但我错了。我也尝试使用fin.read((char *) &amp; image.redgray[iii][jjj],sizeof(pixel));,但结果相同。

数据可以是这样的形式:

1 2
3 4 5
6 7 8 9

我不确定如何处理“\n”。

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

【问题讨论】:

    标签: c++ arrays image multidimensional-array


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,它是一个文本文件,我应该更清楚。哇,我发誓我之前尝试过类似的东西!非常感谢您快速简洁的回答。我尝试为你投票,但我没有足够的声誉。
    【解决方案2】:

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

    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
    

    【讨论】:

    • 我选择了上面的答案,因为它可以快速解决我的问题,但谢谢。出于好奇,结构数组比包含数组的结构有什么优势?
    • @user2856909:这在一定程度上取决于您对数据的处理方式,但是(例如)如果您决定复制一些像素,它可以让您将整个像素复制为 pixels[x1][y1] = pixels[x2[y2]; red[x1][y1] = red[x2][y2]; green[x1][y1] = green[x2][y2]; blue[x1][y1]=blue[x2][y2];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多