c++ - 基于缓存键的QImage比较

标签 c++ qt qimage

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/

相关文章:

c++ - QWebView::setUrl 不工作

qt - dbus 示例中名为 “car.xml” 的 “D-Bus remote controlled car example” 文件是如何生成的?

windows - QImage抖动质量

Python pymysql : How to load an image from database?

c++ - 在 C++ header 中声明数组并在 cpp 文件中定义它?

c++ - 在 for 循环中声明 vector

c++ - rust-bindgen 绑定(bind)引发 SIGSEGV

c++ - f(++i,++i) 是否未定义?

c++ - 使QWidget在点击后消失

c++ - 更新图像显示时的QImage和openmp