0

所以我使用中值切割算法(样本在这里找到)将 .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++,这比我能理解的要复杂一些,而且我没有太多运气来寻找它究竟是如何工作的。

4

1 回答 1

2

如果您使用相同的算法从 png/jpg 文件中读取,它将无法正常工作。png 使用无损压缩,而 jpg 使用有损压缩。其中的数据将不同于“原始”图像的设置方式。从上面的算法来看,“原始”图像以 RGB 格式设置。因此,您fread正在将 3 个字节读入每个点。点结构存储 3 个值 x[],在这种情况下对应于 R(red)、G(green)、B(blue)。

请注意,points 是一个数组,因此在内存中是连续的。假设您在 Point 结构中只有 x[3] 并且width*height没有溢出, points[0][width*height]将为您提供points[(width*height)/3][(width*height)%3]. 本质上,第一个和第二个下标被添加到点的内存位置。

For reading images using QT, you can try QImageReader. It supports many formats: http://doc.qt.io/archives/qt-4.7/qimagereader.html#supportedImageFormats

于 2012-05-03T02:56:09.550 回答