C++ 通过fread将jpg/png读入点数组

C++ 通过fread将jpg/png读入点数组,c++,qt,image-processing,point,fread,C++,Qt,Image Processing,Point,Fread,所以我使用的是中值切割算法(这里的示例),它将原始图像读入点。实际读数在此处完成: medianCutPoints=newqlist(); 文件*raw_in; int numPoints=617*800; 点*点=(点*)malloc(大小(点)*numPoints); raw_in=fopen(“C:\\Users\\David\\Desktop\\image.raw”,“rb”); 对于(int i=0;iappend(新的QList()); medianCutPoints->last()

所以我使用的是中值切割算法(这里的示例),它将原始图像读入点。实际读数在此处完成:

medianCutPoints=newqlist();
文件*raw_in;
int numPoints=617*800;
点*点=(点*)malloc(大小(点)*numPoints);
raw_in=fopen(“C:\\Users\\David\\Desktop\\image.raw”,“rb”);
对于(int i=0;i
然后,通过算法生成调色板

std::list<Point> palette =
    medianCut(points, numPoints, 15);
std::列表调色板=
中间切口(点、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]);
}
for(iter=palete.begin();iter!=palete.end();iter++)
{
medianCutPoints->append(新的QList());
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],我仍然会得到一个数字。我想这应该是点[numberOfpoints].x[0-2],x是RGB的3个点


有没有一种方法可以像fread使用.raw一样,从jpg/png为每个像素设置Point*点?QT是我第一次真正进入C++,这比我能理解的要复杂一些,我没有多少运气来寻找这个方法的有效性。p> 如果使用相同的算法读取png/jpg文件,则该算法将不起作用。png使用无损压缩,而jpg使用有损压缩。其中的数据将不同于“原始”图像的设置方式。从上面的算法来看,“原始”图像是以RGB格式设置的。因此,您的
fread
正在向每个点读取3个字节。点结构存储3个值x[],在本例中对应于R(红色)、G(绿色)、B(蓝色)

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


要使用QT读取图像,可以尝试QImageReader。它支持多种格式:

您能给我们看一下Point类吗?这可能会使事情更清楚(尤其是Frad call)。Ethan Steinberg我相信点只是C++中的一个标准类,但我可能错了。我哪里都没有定义。谢谢你的解释。因此,我假设我必须通过第三方库将非原始文件格式转换为原始格式,当前的中间剪切可以处理,或者。。。重新编写中值切割算法以处理QRBG数组或INT数组(我可以通过QImage.pixel()手动填充)?或手动检查一个QImage.pixel(),然后以某种方式“构建”一个.raw文件以供输入,怎么样?实际上我刚刚找到了答案。我计划将压缩图像中的每个像素读入一个无符号8位整数数组,然后读入点数组。我能够通过生成一个十六进制数的二进制文件样本来测试它,然后将它读入算法中,它似乎可以工作。
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]);
}