【Qt源码笔记】 QImage 源码探究过程中的记忆碎片
在公司曾经做有关图片的一个新项目。当时仔细研究了一下QImage的源码,将一些碎片化的东西记录在了某个平台上,如今翻出来了,感觉这些内容还可以再细化细化,有时间的话,详细整理,先将以前的碎片在此记录下来。
所有的创建都由内部的
QImageData类的create方法实现。即使传入const char*,但是在创建时依然会被转为 非 const ,而在create中改为使用只读标志。QImageData类中出现了一种叫位域的东西,可以指定这个东西占几位:uint a:1;在
QImage拷贝构造时,如果QImage绑定了QPaintDevice或者是内部的QImageData标记了锁,则会复制一份全新的QImage;否则两个QImage共享一个QImageData。值得注意的是,Qt中用到的swap是标准库的。QImage中对于set或者是返回 非 const 的函数中使用detach()来实现写时拷贝QImage中的高质量抖动用的是 Floyd-SteinBerg 算法QImage中的setText()可以将字符串以 UTF-8 编码储存到图片里,但是并非所有的图片格式都支持,需要用QImageWriter去检查一下格式是否支持才可以使用。QImage中的bitPlaneCount()可以用来判断图片的有效位,因为类似 RGB32 这种,实际上它的有效位只有24位QPixmap中的load()是有缓存的,内部用QPixmapCache实现缓存。用下边的 key 做索引。自己也可以使用QPixmapCache根据实际需要做缓存。QString key = QLatin1String("qt_pixmap") % info.absoluteFilePath() % HexString<uint>(info.lastModified().toTime_t()) % HexString<quint64>(info.size()) % HexString<uint>(data ? data->pixelType() : QPlatformPixmap::PixmapType);QPixmap中scaled()用的就是QImage那一套缩放方法QBitmap实际上是QPixmap的二次封装QImageRead本质上是一个包装了接口的类。在读图片的时候会将Qt支持的图片格式全都尝试一遍,包括 imageformat 下的插件。优先寻找最可能匹配的格式( format 这个参数)。找到后拿到这个格式的 handler 。每一个格式本身都会实现作为 handler 的必要接口,以供QImageReader方法调用。
