そこで、.raw 画像をポイントに読み込むメディアン カット アルゴリズム (サンプルはこちら) を使用しています。実際の読み込みはここで行われます: Median Cut Algorithm
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]);
}
ただし、jpeg や png のように圧縮が行われないため、これは .raw でのみ機能するようです。jpg/png をフィードすると、本来あるべき色から大幅にずれてしまいます。これにより、私が考えることができる2つのオプションしか残されていません.jpgおよびpngライブラリを使用して画像を.rawにデコードするか、圧縮画像の各ピクセルをポイントに読み込みます。
最初のループがどのように機能するか理解できません。私は C#.NET に慣れていますが、fread はどのように機能し、Point* ポイントはどのように設定されているのでしょうか? points[width*height].x[0] を出力すると、RGB コードから数値が得られます。しかし、points[0].x[width*height] も実行すると、数値が得られます。これは points[numberOfpoints].x[0-2]、x は RGB の 3 つのスポットになると考えました。
fread が .raw で行っているように、jpg/png から各ピクセルに Point* ポイントを設定する方法はありますか? Qt は私の最初の C++ への本格的な冒険であるため、これは私が理解できるよりも少し複雑であり、これがどのように機能しているかを正確に調べることができませんでした。