QImage 的 CacheKey 方法返回的不是真正的图像的普通散列。有谁知道高 32 位是什么意思?比较两个图像时我真的可以忽略它们吗? (只比较低32位?)
仅供说明,此代码多次读取同一图像(但将它们存储在不同的 QImage 对象中):
printf("%llx\n",QImage("image.png").cacheKey());
printf("%llx\n",QImage("image.png").cacheKey());
printf("%llx\n",QImage("image.png").cacheKey());
返回这个?
144300000002
144400000002
144500000002
还是这个? (好像高 32 位取决于当前内存位置)
140800000002
140900000002
140a00000002
最佳答案
不,您不能使用 cacheKey
的任何部分比较图像内容,它的存在只是为了确保图像自上次 cacheKey
以来没有发生变化。取值。它标识缓冲区并在 QImage
的任何非常量函数时发生变化。叫做。
但是作为cacheKey
的名称属性暗示,您可以将其用作 QCache<qint64, QByteArray>
的键您将存储图像的实际哈希值的位置,您只会使用 QCryptographicHash
重新计算该哈希值仅当图像已更改时(= 仅当它不在缓存中时)。
还有 QImage
不使用像 QPixmap
这样的缓存用于读取图像,因此读取同一个图像文件 3 次将分配 3 个不同的缓冲区,每次使用不同的 cacheKey
.为避免每次都计算哈希值,您应该查看 QPixmap::load
的源代码。功能。
关于c++ - 基于缓存键的QImage比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18405890/