我是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);
建议?
答案 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