Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 图像编辑器和矢量尺寸C++;_C++_Vector_Rows - Fatal编程技术网

C++ 图像编辑器和矢量尺寸C++;

C++ 图像编辑器和矢量尺寸C++;,c++,vector,rows,C++,Vector,Rows,我正在使用向量制作一个基本的图像编辑器,我试图得到一个如下所示的矩阵,一个4乘4的矩阵,但每个插槽包含3个值(RGB值) 到目前为止,我已经能够用这段代码得到一个矩阵(我想…) int行; int列; fin>>行; fin>>列; 矢量图像尺寸(行); 对于(int i=0;i>行; fin>>列; 矢量图像尺寸(行); 对于(int i=0;i

我正在使用向量制作一个基本的图像编辑器,我试图得到一个如下所示的矩阵,一个4乘4的矩阵,但每个插槽包含3个值(RGB值)

到目前为止,我已经能够用这段代码得到一个矩阵(我想…)

int行;
int列;
fin>>行;
fin>>列;
矢量图像尺寸(行);
对于(int i=0;i

这只是为了创建一个充满0的矩阵。如何使每个插槽包含如示例所示的三个RGB值?最后,我必须使用什么复杂的循环才能更改每个插槽中的各个值,例如将0 0转换为1550 255?

在使用基本整数类型时。考虑存储一些更复杂的RGB类:

class RGB {
private:
   std::unit8_t r, g, b;
public:
   RGB() {}
   RGB(int r, int g, int b) : r(r), g(g), b(b){ }
}
可以使用以下方法构造简单的对象:

rgb = RGB(255,255,255);
之后,可以将对象存储在向量中

int rows;
int columns;
fin >> rows;
fin >> columns;
vector<vector<RGB> > image_dimensions(rows);
for (int i = 0; i < rows; i++)
   image_dimensions[i].resize(columns);
int行;
int列;
fin>>行;
fin>>列;
矢量图像尺寸(行);
对于(int i=0;i
与您的示例不同的是,向量可以存储来自类RGB的对象。如果您愿意,现在可以遍历向量:

for (int i = 0; i < columns; i++)
   for (int i = 0; i < rows; i++)
       image_dimensions[i][j] = RGB(0,0,0);
for(int i=0;i
编辑: 根据评论,最好不要浪费空间,使用uint8类型。因此,不再需要验证。 你可以用一个平面向量来计算二维索引。如果您使用大型矩阵,这将生成更有效的解决方案

编辑2: 不创建新类的第二种可能的解决方案是使用std tuple类:

std::tuple<std::unit8_t, std::unit8_t, std::unit8_t > rgb(0,0,0);
std::元组rgb(0,0,0);
在这种情况下,向量必须存储这种元组。 更多元组信息:


顺便说一下:创建一个小类或结构应该不会打扰您

将int替换为rgb(其中rgb:
struct rgb{std::uint8_t r,g,b;}
),并读入每个rgb元素的每个组件。(您可以使用8位,因为您的范围是0-255)等等。我很困惑。我要替换什么int来获取RGB值???不能使用OpenCV?这应该会有很大帮助。提供一个默认的ctor,您就不需要第二个double for循环了。使用uint8,您不需要验证方法(wtv读取值时应验证输入是否正确)。一旦这样做了,setter就变得无用了(RGB基本上没有不变量,所以它不需要getter和setter)。现在,您已经节省了空间,如果您需要在任何地方填充rgb纹理,您只需memcopy即可,因为您的格式很可能是正确的(如果使用ints,则不需要)。其他细微的挑剔,可能最好使用平面向量并模拟2d索引,而不是向量向量,但是因为这是OPs代码,所以我很感激这个提示,但是如果需要的话,我会尽量避免构建另一个类。不管怎样,不必做RBG结构,我就可以用C++来做了,我已经可以说我更喜欢java了…这种语言的语法令人抓狂。
for (int i = 0; i < columns; i++)
   for (int i = 0; i < rows; i++)
       image_dimensions[i][j] = RGB(0,0,0);
std::tuple<std::unit8_t, std::unit8_t, std::unit8_t > rgb(0,0,0);