【Qt源码笔记】 QImage 源码探究过程中的记忆碎片

在公司曾经做有关图片的一个新项目。当时仔细研究了一下QImage的源码,将一些碎片化的东西记录在了某个平台上,如今翻出来了,感觉这些内容还可以再细化细化,有时间的话,详细整理,先将以前的碎片在此记录下来。

  1. 所有的创建都由内部的QImageData类的create方法实现。即使传入const char* ,但是在创建时依然会被转为 非 const ,而在create中改为使用只读标志。

  2. QImageData 类中出现了一种叫位域的东西,可以指定这个东西占几位:uint a:1;

  3. QImage 拷贝构造时,如果 QImage 绑定了 QPaintDevice 或者是内部的 QImageData 标记了锁,则会复制一份全新的 QImage ;否则两个 QImage 共享一个QImageData。值得注意的是,Qt中用到的swap是标准库的。

  4. QImage中对于set或者是返回 非 const 的函数中使用detach()来实现写时拷贝

  5. QImage中的高质量抖动用的是 Floyd-SteinBerg 算法

  6. QImage中的setText()可以将字符串以 UTF-8 编码储存到图片里,但是并非所有的图片格式都支持,需要用QImageWriter去检查一下格式是否支持才可以使用。

  7. QImage中的bitPlaneCount()可以用来判断图片的有效位,因为类似 RGB32 这种,实际上它的有效位只有24位

  8. QPixmap中的load()是有缓存的,内部用QPixmapCache实现缓存。用下边的 key 做索引。自己也可以使用QPixmapCache根据实际需要做缓存。

    1
    2
    3
    4
    5
    QString key = QLatin1String("qt_pixmap")
    % info.absoluteFilePath()
    % HexString<uint>(info.lastModified().toTime_t())
    % HexString<quint64>(info.size())
    % HexString<uint>(data ? data->pixelType() : QPlatformPixmap::PixmapType);
  9. QPixmapscaled()用的就是QImage那一套缩放方法

  10. QBitmap实际上是QPixmap的二次封装

  11. QImageRead本质上是一个包装了接口的类。在读图片的时候会将Qt支持的图片格式全都尝试一遍,包括 imageformat 下的插件。优先寻找最可能匹配的格式( format 这个参数)。找到后拿到这个格式的 handler 。每一个格式本身都会实现作为 handler 的必要接口,以供QImageReader方法调用。