所以我使用中值切割算法(样本在这里找到)将 .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,或者以某种方式将压缩图像的每个像素读入点。
我无法理解第一个循环是如何工作的。我习惯了 C#.NET,那么 fread 究竟是如何工作的,Point* 点是如何设置的?如果我打印出 points[width*height].x[0],我会从 RGB 代码中得到一个数字。但是如果我也做点[0].x[width*height],我仍然会得到一个数字。我认为这将是 points[numberOfpoints].x[0-2],x 是 RGB 的 3 个点。
有没有一种方法可以将 Point* 点设置为 jpg/png 中的每个像素,就像 fread 对 .raw 所做的那样?由于 Qt 是我第一次真正涉足 c++,这比我能理解的要复杂一些,而且我没有太多运气来寻找它究竟是如何工作的。