1

我是 C++ 新手,对此感到有些沮丧。下面,在 pixelVector 中,我将每个像素 RGB 浮点值存储在 Pixel 中,并希望将所有值转储到带有 pixelArray 的字节数组中,以便可以输出到图像文件。HEIGHT 和 WIDTH 是指图像尺寸。下面的代码工作正常,但我需要在运行时指定像素数组的大小,因为它可能并不总是 500x500 图像。

// WIDTH and HEIGHT specified at run-time
vector<vector<Pixel>> pixelsVector (WIDTH, vector<Pixel> (HEIGHT));

...

unsigned char pixelsArray[500][500][3];

for (int i = 0; i < 500; i++)
{
    for (int j = 0; j < 500; j++)
    {
        // Returns RGB components
        vector<float> pixelColors = pixelArray[i][j].getColor();

        for (int k = 0; k < 3; k++)
        {
            pixels[i][j][k] = pixelColors.at(k);
        }
    }
}

// write to image file
fwrite(pixelsArray, 1, 500*500*3, file);

如果我把 HEIGHT 和 WIDTH 而不是 500 和 500 放在上面,我会得到一个错误,因为它们不是常量值。现在使用 3D 向量似乎确实有效,但 fwrite 不会将向量作为其第一个参数。我尝试使用三指针数组,但它似乎根本不起作用——也许我用错了。这里它使用了像素数组的 3D 向量:

vector<vector<Pixel>> pixelsVector (WIDTH, vector<Pixel> (HEIGHT));

...

vector< vector< vector<unsigned char> > > pixelsArray;

for (int i = 0; i < HEIGHT; i++)
{
    pixels.push_back(vector< vector<unsigned char> >());

    for (int j = 0; j < WIDTH; j++)
    {
        pixels[i].push_back(vector<unsigned char>());

        vector<float> pixelColors;
        pixelColors = pixelArray[i][j].getColor();

        for (int k = 0; k < 3; k++)
        {
            pixels[i][j][k] = pixelColors.at(k);
        }
    }
}

// Error
fwrite(pixelsArray, 1, 500*500*3, file);

建议?

4

2 回答 2

1

您可以使用 Boost.MultiArray 代替向量的向量,这使您可以使用 .data() 方法访问底层内存。

看起来您正在尝试操作图像,因此您可能需要考虑使用Boost.Gil

于 2010-10-10T22:54:41.240 回答
1

从最后的代码片段:

vector<vector<Pixel>> pixelsVector (WIDTH, vector<Pixel> (HEIGHT));

对变量使用大写名称可能会与宏发生名称冲突。在 C++ 中,所有大写名称通常都保留给宏。

...

vector< vector< vector<unsigned char> > > pixelsArray;

大概这个向量与下面所说的相同pixels

如果是这样,那么标准建议是它有助于发布真实代码。

无论如何,为了在一个有效的操作中输出这些字节,您需要将这些字节连续存储在内存中。所以一个向量的向量就出来了。使用单个向量(C++ 保证 a 的缓冲区的连续存储std::vector)。

for (int i = 0; i < HEIGHT; i++)
{
    pixels.push_back(vector< vector<unsigned char> >());

    for (int j = 0; j < WIDTH; j++)
    {
        pixels[i].push_back(vector<unsigned char>());

此时你有一个内部向量,但它是空的,大小为 0。

        vector<float> pixelColors;
        pixelColors = pixelArray[i][j].getColor();

大概pixelArray是您定义的类的实例?

        for (int k = 0; k < 3; k++)
        {
            pixels[i][j][k] = pixelColors.at(k);
        }

在这里,您尝试分配给空的最内层向量的不存在的元素。您可以提前适当调整大小,也可以push_back对每个值使用该方法。

此外,您确定这些float值是 0 到 255 范围内的整数(或更一般地说,0 到 UCHAR_MAX)而不是 0 到 1 范围内的整数吗?

也许您需要缩放这些值。

    }
}

// Error
fwrite(pixelsArray, 1, 500*500*3, file);

如果 pixelsArray是一个(非空)字节向量,那么您可以使用它&pixelsArray[0]来获取指向第一个字节的指针。

现在,我知道,以上只是剖析了一些错误,并没有直接告诉你什么是对的。:-)

但是需要更多信息来提供执行此操作的示例代码,例如(1)您的float值是什么,以及(2)您的文件中需要什么?

无论如何,希望这会有所帮助,

– 阿尔夫

于 2010-10-10T23:48:25.440 回答