前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Qt源码笔记】 QImage 源码探究过程中的记忆碎片

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

作者头像
Harper
发布2021-07-27 10:12:37
9910
发布2021-07-27 10:12:37
举报

在公司曾经做有关图片的一个新项目。当时仔细研究了一下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);

QPixmapscaled()用的就是QImage那一套缩放方法

QBitmap实际上是QPixmap的二次封装

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档