0

そこで、.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++ への本格的な冒険であるため、これは私が理解できるよりも少し複雑であり、これがどのように機能しているかを正確に調べることができませんでした。

4

1 に答える 1

2

同じアルゴリズムを使用して png/jpg ファイルから読み取る場合、機能しません。png は可逆圧縮を使用し、jpg は非可逆圧縮を使用します。内部のデータは、「生の」画像の設定方法とは異なります。上記のアルゴリズムを見ると、「生の」画像は RGB 形式で設定されています。したがって、freadすべてのポイントに 3 バイトを読み込んでいます。ポイント構造体は 3 つの値 x[] を格納します。この場合、R(赤)、G(緑)、B(青) に対応します。

ポイントは配列であるため、メモリ内で連続していることに注意してください。Point 構造に x[3] しかwidth*heightなく、オーバーフローしない と仮定するとpoints[0][width*height]、 の値が得られますpoints[(width*height)/3][(width*height)%3]。基本的に、1 番目と 2 番目の添え字がポイントのメモリ位置に追加されます。

QT を使用して画像を読み取るには、QImageReader を試すことができます。多くのフォーマットをサポートしています: http://doc.qt.io/archives/qt-4.7/qimagereader.html#supportedImageFormats

于 2012-05-03T02:56:09.550 に答える