Nur falls jemand über dieses Problem kommt (und auch nicht schrecklich mit Hashing Dinge erlebt, vor allem so etwas wie ein Bild), hier ist eine sehr einfache Lösung, die ich für Hashing QPixmaps verwendet und in einer Lookup-Eingabe Tabelle für einen späteren Vergleich:
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;
}
Hier ist die Hash-Funktion selbst (man kann es in einen qint64 Hash haben, wenn Sie weniger Kollisionen wünschen). Wie Sie sehen können, wandle ich die Pixmap in ein QImage um und gehe einfach durch die Dimensionen und führe einen einfachen Hash für jedes Pixel aus und gebe das Endergebnis zurück. Es gibt viele Möglichkeiten, diese Implementierung zu verbessern (siehe die anderen Antworten auf diese Frage), aber das ist der grundlegende Kern dessen, was zu tun ist.
Das OP erwähnte, wie er diese Hashing-Funktion verwenden würde, um dann eine Nachschlagetabelle für den späteren Vergleich von Bildern zu erstellen. Dies würde eine sehr einfache Lookup-Funktion zur Initialisierung erfordern - etwa so:
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...
}
Ich bin mit einem QMap hier genannt imageTable, die als solche in der Klasse deklariert werden müssen:
QMap<qint32, QString> imageTable;
Wenn Sie schließlich ein Bild mit den Bildern in Ihrer Nachschlagetabelle vergleichen wollen (zB: "Welches Bild, aus den Bildern, die ich kenne, ist dieses bestimmte Bild?"), Rufen Sie einfach die Hashing-Funktion auf Das Bild (von dem ich annehme, dass es auch eine QPixmap sein wird) und der Return QString-Wert wird es dir ermöglichen, das herauszufinden. So etwas würde funktionieren:
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.
}
Das ist es. Ich hoffe, dass dies jemandem hilft - es hätte mir etwas Zeit erspart, obwohl ich glücklich war, die Erfahrung zu haben, es herauszufinden.
Tippfehler im Titel (wie kann was ist ...) :) – claf