C ++使用3D动态数组和向量

时间:2010-10-10 22:22:02

标签: c++ 3d dynamic-arrays

我是C ++的新手并且对它感到有点沮丧。下面,在pixelsVector中,我将每个像素RGB浮点值存储在Pixel中并想要转储 使用pixelsArray的字节数组的所有值,以便我可以输出到图像文件。高度和宽度指的是图像尺寸。下面的代码工作正常,但我需要指定 pixelArray在运行时的大小,因为它可能并不总是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);

建议?

2 个答案:

答案 0 :(得分:1)

你可以使用Boost.MultiArray插入向量的向量,它允许你使用.data()方法访问底层内存。

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

答案 1 :(得分:1)

从上一个代码段开始:

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

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

...

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

据推测,此向量与下面的pixels相同?

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

无论如何,为了在一个有效的操作中输出这些字节,你需要将字节连续存储在内存中。因此向量矢量向量出来了。使用单个向量(C ++保证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)您在文件中想要什么?

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

- Alf