【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
根据实际需要做缓存。1
2
3
4
5QString 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
方法调用。