通过 fread 将 jpg/png 读入点数组中
Read a jpg/png via fread into an array of Points
所以我使用的是中值切割算法(样本在这里找到(,它将.raw图像读入点。实际读数在这里完成:中位数切割算法
medianCutPoints = new QList< QList<int>* >();
FILE * raw_in;
int numPoints = 617*800;
Point* points = (Point*)malloc(sizeof(Point) * numPoints);
raw_in = fopen("C:\Users\David\Desktop\image.raw", "rb");
for(int i = 0; i < numPoints; i++)
{
fread(&points[i], 3, 1, raw_in);
}
fclose(raw_in);
然后,通过算法生成调色板。
std::list<Point> palette =
medianCut(points, numPoints, 15);
最后,我将点存储到列表中。
for (iter = palette.begin() ; iter != palette.end(); iter++)
{
medianCutPoints->append(new QList<int>());
medianCutPoints->last()->append((int)iter->x[0]);
medianCutPoints->last()->append((int)iter->x[1]);
medianCutPoints->last()->append((int)iter->x[2]);
}
但是,这似乎仅适用于.raw,因为没有像 jpeg 或 png 那样进行压缩。如果我输入 jpg/png,颜色与应有的颜色大相径庭。这基本上让我只能想到两个选择 - 使用 jpg 和 png 库将图像解码为.raw,或者以某种方式将压缩图像的每个像素读取为 Points。
我无法理解第一个循环的工作原理。我已经习惯了 C#.NET,那么 fread 究竟是如何工作的,Point* 点是如何设置的?如果我打印出点[宽度*高度].x[0],我会从RGB代码中得到一个数字。但是如果我也做点[0].x[宽度*高度],我仍然得到一个数字。我认为这将是点[点数].x[0-2],x是RGB的3个点。
有没有办法像 fread 对.raw所做的那样,将 jpg/png 中的点*点设置为每个像素?Qt是我第一次真正接触c++,这比我能理解的要复杂一些,而且我没有太多运气去寻找它是如何工作的。
如果您使用相同的算法从 png/jpg 文件中读取,它将不起作用.png 使用无损压缩,而 jpg 使用有损压缩。其中的数据将与"原始"映像的设置方式不同。通过查看上面的算法,"原始"图像以RGB格式设置。因此,您的fread
是在每个点上读取 3 个字节。点结构存储 3 个值 x[],在本例中对应于 R(红色(、G(绿色(、B(蓝色(。
请注意,点是一个数组,因此在内存中是连续的。假设你在点结构中只有 x[3],并且width*height
没有溢出,points[0][width*height]
会给你 points[(width*height)/3][(width*height)%3]
的值。本质上,第一个和第二个下标被添加到点的内存位置。
要使用QT读取图像,您可以尝试QImageReader。它支持多种格式:http://doc.qt.io/archives/qt-4.7/qimagereader.html#supportedImageFormats
- 如何检测将文本文件读入 int 数组的新行
- 如何在C++中将文件的内容读入char16_t数组?
- 需要将测验放入C++数组中
- 在c++中读取文件时,它如何自动将字符放入字符数组,将数字放入整数变量
- 从文件中读取并将其内容放入对象数组中,然后对它们进行排序
- 将文本文件读入整数数组
- 将文本文件数据读入字符数组时提取运算符的歧义
- C 从TXT文件读取数据并将其放入2D数组中
- 将数据文件读入对象数组时出现问题
- 当 ifstream 将字符读入 2D 数组时,会出现奇怪的字符
- 如何将字符串片段读入类数组C++
- 尝试将文件读入结构数组,但 for 循环仅显示第一个索引,其余索引显示为零
- 读取四个数据文件并使用函数将它们放入结构数组的最佳方法是什么
- 将 int 放入 char 数组是否在法律上需要新的放置
- 将信息读入结构数组 c++
- C++图像处理 - 将图像文件读入 2D 数组
- 无法将文件读入字符数组(像往常一样,某些指针问题)
- C++ 如何将整数放入字符数组中
- 将带有引号和逗号的字符串文件读入字符串数组
- 视觉读取列文本数据并在C++中放入 3D 数组