C++ 图像编辑器和矢量尺寸C++;
我正在使用向量制作一个基本的图像编辑器,我试图得到一个如下所示的矩阵,一个4乘4的矩阵,但每个插槽包含3个值(RGB值) 到目前为止,我已经能够用这段代码得到一个矩阵(我想…)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
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);