Qt中QPixmap::load图片显示的整个过程

你的OPPA 2015-01-27 05:23:51
Qt中用QPixmap::load来加载图片,加载到QPixmapCache中,然后用QPainter来画出。整个过程大概是这样的吧?我想知道再详细一点的,详细到内存、缓存区的使用。有哪位大神知道,求指点。
另外,图片数据存储在Buffer中,怎么读取出来进行显示?目前我知道的好像是Buffer中的数据复制到QPixmapCache中,然后进行显示,那么问题又来了,这个怎么复制到QPixmapCache中,又这么显示出来。
...全文
2685 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
你的OPPA 2015-01-28
  • 打赏
  • 举报
回复
引用 5 楼 dbzhang800 的回复:
所以我说你乱投医啊。 QPixmapCache 是 QPixmap的Cache,它里面是你已经构造好的QPixmap。显示当然快了,和下面的效果一样 QList<QPixmap> caches; caches << QPixmap("C:/dddd.png")<< QPixmap("E:/ddddd.bmp"); 接下来,你从QList中直接取QPixmap 和你从磁盘文件中加载并生成QPixmap,速度能一样么?问题是,你加载并将其存到QList时,该花的时候一点都不少。你在你想做的是,你准备吧加载并存入QList的步骤省略(因为你发现它很慢)??但是还想使用从QList中直接提取QPixmap的快速度??
恩,那我该如何提高效率呢?我觉得从原理上来说,只能直接从缓冲区中读取数据进行显示···
dbzhang800 2015-01-28
  • 打赏
  • 举报
回复
所以我说你乱投医啊。 QPixmapCache 是 QPixmap的Cache,它里面是你已经构造好的QPixmap。显示当然快了,和下面的效果一样 QList<QPixmap> caches; caches << QPixmap("C:/dddd.png")<< QPixmap("E:/ddddd.bmp"); 接下来,你从QList中直接取QPixmap 和你从磁盘文件中加载并生成QPixmap,速度能一样么?问题是,你加载并将其存到QList时,该花的时候一点都不少。你在你想做的是,你准备吧加载并存入QList的步骤省略(因为你发现它很慢)??但是还想使用从QList中直接提取QPixmap的快速度??
你的OPPA 2015-01-28
  • 打赏
  • 举报
回复
引用 3 楼 dbzhang800 的回复:
感觉上,你有点乱投医。 你几个问题你肯定明确吧? 1. 不管你是从文件读取(不管是用不用内存映射),还是从网络或其他方式获取,你得到的要么是打包后的png/bmp/jpg/jp2等数据,要么是dpi是8/16/24/32/ 等等的原始像素数据。 2. 你要在Qt上将上述数据显示出来,你需要使用QImage/QPixmap/QImageReader 至于QPixmapCache,从名字上看,他就简简单单的是QPixmap的cache。它和你想的接受网络数据的缓冲区,完全不是一个东西,你也无法将其混为一谈。 你最需要的是找出瓶颈,然后有针对性地去优化。
1.网络端传送过来存放到缓冲区的数据是图片数据(6512*11635*10bit) 2.因为我把图片数据复制到字节流中然后读取字节流进行显示,这样的过程会有延迟(就是从内存中读取数据花费的时间)。所以我想通过QPixmapCache或者QCache来读取,而且,我发现load加载图片到QPixmapCache中,然后进行显示是非常快的。 3.我知道前面的缓冲区和QPixmapCache是不同的,因为我无法用QPixmap/QImage/QImageReader从缓冲区中读取数据并且显示,所以我就想可不可以通过QPixmapCache来做(理由在第二点已经说明了)。
dbzhang800 2015-01-28
  • 打赏
  • 举报
回复
引用 2 楼 u011330815 的回复:
我的意思是load加载图片是把图片加载到QPixmapCache中的,对不对?然后用QPainter来画出QPixmap这个图片。 其实,我想知道的是如何把缓冲区的图片数据显示出来,因为图片比较大,读取内存中的图片数据进行显示的话会有延迟,所以只能通过缓冲区来读取数据进行显示。另外,图片数据是通过网络端传输过来保存到缓冲区中的。
感觉上,你有点乱投医。 你几个问题你肯定明确吧? 1. 不管你是从文件读取(不管是用不用内存映射),还是从网络或其他方式获取,你得到的要么是打包后的png/bmp/jpg/jp2等数据,要么是dpi是8/16/24/32/ 等等的原始像素数据。 2. 你要在Qt上将上述数据显示出来,你需要使用QImage/QPixmap/QImageReader 至于QPixmapCache,从名字上看,他就简简单单的是QPixmap的cache。它和你想的接受网络数据的缓冲区,完全不是一个东西,你也无法将其混为一谈。 你最需要的是找出瓶颈,然后有针对性地去优化。
你的OPPA 2015-01-28
  • 打赏
  • 举报
回复
引用 1 楼 dbzhang800 的回复:
没看懂你的问题,QPixmap::load() 和 QPainter以及显示什么的没任何关系啊 它不就是将一个图片文件加载进来,保存在一个QPixmap中么。至于QPixmapCache,已经属于Qt内部的优化部分了,和load() 关系也不太大,和你理解问题也没多大关系。 QPixmap是平台相关的。典型的流程就是用QImageReader加载图片文件到 QImage,而后将其转成 QPixmap。 [/code]
我的意思是load加载图片是把图片加载到QPixmapCache中的,对不对?然后用QPainter来画出QPixmap这个图片。 其实,我想知道的是如何把缓冲区的图片数据显示出来,因为图片比较大,读取内存中的图片数据进行显示的话会有延迟,所以只能通过缓冲区来读取数据进行显示。另外,图片数据是通过网络端传输过来保存到缓冲区中的。
dbzhang800 2015-01-28
  • 打赏
  • 举报
回复
没看懂你的问题,QPixmap::load() 和 QPainter以及显示什么的没任何关系啊 它不就是将一个图片文件加载进来,保存在一个QPixmap中么。至于QPixmapCache,已经属于Qt内部的优化部分了,和load() 关系也不太大,和你理解问题也没多大关系。 QPixmap是平台相关的。典型的流程就是用QImageReader加载图片文件到 QImage,而后将其转成 QPixmap。

bool QPixmap::load(const QString &fileName, const char *format, Qt::ImageConversionFlags flags)
{
    if (fileName.isEmpty())
        return false;

    QFileInfo info(fileName);
    QString key = QLatin1Literal("qt_pixmap")
                  % info.absoluteFilePath()
                  % HexString<uint>(info.lastModified().toTime_t())
                  % HexString<quint64>(info.size())
                  % HexString<uint>(data ? data->pixelType() : QPixmapData::PixmapType);

    if (QPixmapCache::find(key, *this))
        return true;

    QScopedPointer<QPixmapData> tmp(QPixmapData::create(0, 0, data ? data->type : QPixmapData::PixmapType));
    if (tmp->fromFile(fileName, format, flags)) {
        data = tmp.take();
        QPixmapCache::insert(key, *this);
        return true;
    }

    return false;
}

bool QPixmapData::fromFile(const QString &fileName, const char *format,
                           Qt::ImageConversionFlags flags)
{
    QImage image = QImageReader(fileName, format).read();
    if (image.isNull())
        return false;
    fromImage(makeBitmapCompliantIfNeeded(this, image, flags), flags);
    return !isNull();
}

16,819

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧