誰かがこの問題に遭遇した場合に備えて (特に画像のようなものをハッシュするのにあまり経験がありません)、QPixmap をハッシュし、後で比較するためにそれらをルックアップ テーブルに入力するために使用した非常に単純なソリューションを次に示します。
qint32 HashClass::hashPixmap(QPixmap pix)
{
QImage image = pix.toImage();
qint32 hash = 0;
for(int y = 0; y < image.height(); y++)
{
for(int x = 0; x < image.width(); x++)
{
QRgb pixel = image.pixel(x,y);
hash += pixel;
hash += (hash << 10);
hash ^= (hash >> 6);
}
}
return hash;
}
これはハッシュ関数自体です (衝突を減らしたい場合は、qint64 にハッシュすることができます)。ご覧のとおり、pixmap を QImage に変換し、その次元をたどり、各ピクセルに対して一度に 1 つずつ非常に単純なハッシュを実行し、最終結果を返します。この実装を改善する方法はたくさんありますが (この質問に対する他の回答を参照してください)、これが何をする必要があるかの基本的な要点です。
OPは、このハッシュ関数を使用して、後で画像を比較するためのルックアップテーブルを作成する方法について言及しました. これには、次のような非常に単純なルックアップ初期化関数が必要です。
void HashClass::initializeImageLookupTable()
{
imageTable.insert(hashPixmap(QPixmap(":/Image_Path1.png")), "ImageKey1");
imageTable.insert(hashPixmap(QPixmap(":/Image_Path2.png")), "ImageKey2");
imageTable.insert(hashPixmap(QPixmap(":/Image_Path3.png")), "ImageKey2");
// Etc...
}
ここでは、クラスで宣言する必要がある imageTable という QMap を使用しています。
QMap<qint32, QString> imageTable;
そして最後に、ルックアップ テーブル内の画像と画像を比較したい場合 (つまり、「私が知っている画像のうち、この特定の画像は何ですか?」)、ハッシュ関数を呼び出すだけです。画像(QPixmapでもあると想定しています)と戻りQString値により、それを理解できます。次のようなものが機能します。
void HashClass::compareImage(const QPixmap& pixmap)
{
QString value = imageTable[hashPixmap(pixmap)];
// Do whatever needs to be done with the QString value and pixmap after this point.
}
それでおしまい。これが誰かの役に立てば幸いです。時間を節約できたはずですが、それを理解する経験ができてうれしかったです。