简述

QImageReader类为从文件或设备读取图像提供了一个独立的接口。

读取图像最常用的方法是通过构造QImage和QPixmap,或通过调用QImage::load()和QPixmap::load()。QImageReader是一个专业读取图像的类,可以有更多的控制,例如,可以通过调用setScaledSize()读取图像成特定的大小,通过调用setClipRect()可以选择一个剪辑矩形,有效地只加载图像的一部分。取决于底层支持的图片格式,这可以节省内存,加快加载图片。

常用接口

公共函数

  • void setFileName(const QString & fileName)

    为fileName设置文件名。在内部,QImageReader将创建一个QFile,以只读模式( QIODevice::ReadOnly)打开它,并使用此文件写入图像。

  • void setFormat(const QByteArray & format)

    设置写入图像时的格式,格式不区分大小写。

QImageReader reader;
reader.setFormat("png");
// 同reader.setFormat("PNG");
  • QStringList textKeys() const

    返回此图片的所有keys。可以通过使用text()列出了这些key对应的文本。

  • QString text(const QString & key) const

    返回与key对应的文本。

  • bool supportsOption(QImageIOHandler::ImageOption option) const

    如果reader支持选项option,返回true;否则返回false。

    不同的图像格式支持不同的选项。调用此函数,可以确定当前格式是否支持一个特定的选项。例如:PNG格式允许嵌入文字到图像的元数据(见text())。

QImageReader reader(":/image.png");
if (reader.supportsOption(QImageIOHandler::Size))
qDebug() << "Size:" << reader.size();
  • void setQuality(int quality)

    设置图像格式的质量。

    quality的取值范围依赖于图像格式。例如:JPEG格式支持从0(低视觉质量,高压缩率)到100(高视觉质量,低压缩率)范围。

  • bool supportsAnimation() const

    如果图像格式支持动画,则返回true;否则,返回false。

  • int loopCount() const

    对于支持动画的图像格式,返回动画循环的次数。如果返回-1,意味着动画应永远循环下去,或者发生了错误。如果出现错误, canRead() 将返回false。

  • int nextImageDelay() const

    对于支持动画的图像格式,返回下一帧动画等待的毫秒数;如果不支持动画,则返回0;如果发生错误,返回-1。

  • int imageCount() const

    对于支持动画的图像格式,返回动画图像的总数;如果不支持动画,则返回0;如果发生错误,返回-1。

  • int currentImageNumber() const

    对于支持动画的图像格式,返回当前帧的序号;如果不支持动画,则返回0;如果发生错误,返回-1。

  • bool jumpToImage(int imageNumber)

    对于支持动画的图像格式,将跳到顺序号为imageNumber的图像,如果成功返回true,如果相应的图像没找到则返回false。

    接下来调用read()将尝试读取这个图像。

  • bool jumpToNextImage()

    对于支持动画的图像格式,跳到当前图像的下一个图像处,如果成功返回true,如果动画没有下一个图像则返回false。

  • bool canRead() const

    如果QImageReader可以读取图像(即:图像格式支持,同时设备也包含有效数据)调用canRead() 时会返回true

  • bool read(QImage * image)

    从设备读取图像,必须指向QImage图像。成功返回true;否则,返回false。

如果图像格式和大小和将要读取的图像数据一样,这个函数可能不需要在读取之前分配一个新图像。正因为如此,它可以比其它read() 重载函数(需要构建新图像)更快,尤其是读取具有相同的格式和大小的多个图像时。

QImage icon(64, 64, QImage::Format_RGB32);
QImageReader reader("icon_64x64.bmp");
if (reader.read(&icon)) {
// 显示图标
}
  • ImageReaderError error() const

    返回上次发生的错误 - 错误类型。

QImageReader::ImageReaderError枚举值:

常量 描述
QImageReader::FileNotFoundError 1 QImageReader使用了一个文件名,而对应的文件不存在。或文件名中不含有扩展名(比如.png)、或存在Qt不支持的扩展名。
QImageReader::DeviceError 2 QImageReader读取图像数据时遇到设备错误,详细请查看设备问题。
QImageReader::UnsupportedFormatError 3 Qt不支持的请求图像格式。
QImageReader::InvalidDataError 4 图像数据无效,并且QImageReader无法从图像中读取。可能是图像文件被损坏。
QImageReader::UnknownError 0 未知错误。如果调用read()后得到这个值,最有可能是 QImageReader的一个Bug。

- QString errorString() const

返回上次发生的错误 - 可读描述。

静态函数

  • QByteArray imageFormat(const QString & fileName)

    获取文件名对应的图片格式

  • QByteArray imageFormat(QIODevice * device)

    获取设备对应的图片格式

  • QList<QByteArray> supportedImageFormats()

    获取支持的图片格式

  • QList<QByteArray> supportedMimeTypes()

    获取支持的Mime类型
QByteArray imageFormat = QImageReader::imageFormat("AuthorLogo.jpeg");
QList<QByteArray> imageFormats = QImageReader::supportedImageFormats();
QList<QByteArray> mimeTypes = QImageReader::supportedMimeTypes();

信息如下:

imageFormat : "jpeg"

imageFormats : ("bmp", "cur", "dds", "gif", "icns", "ico", "jp2", "jpeg", "jpg", "mng", "pbm", "pgm", "png", "ppm", "svg", "svgz", "tga", "tif", "tiff", "wbmp", "webp", "xbm", "xpm")

mimeTypes : ("", "image/bmp", "image/gif", "image/jp2", "image/jpeg", "image/png", "image/svg+xml", "image/tiff", "image/vnd.microsoft.icon", "image/vnd.wap.wbmp", "image/webp", "image/x-dds", "image/x-icns", "image/x-mng", "image/x-portable-bitmap", "image/x-portable-graymap", "image/x-portable-pixmap", "image/x-tga", "image/x-xbitmap", "image/x-xpixmap")

示例

获取描述信息

// 读取图像
QImageReader reader;
reader.setFileName("AuthorLogo.jpeg"); if (reader.canRead())
{
// 读取图片
QImage image = reader.read(); // 获取描述信息
QStringList keys = reader.textKeys();
QString strValue("");
foreach (QString strKey, keys)
{
strValue = reader.text(strKey).toLocal8Bit();
qDebug() << QString("key : %1 value : %2").arg(strKey).arg(strValue);
}
}
else
{
// 获取错误信息
QImageReader::ImageReaderError error = reader.error();
QString strError = reader.errorString();
qDebug() << "Last Error : " << strError;
}

这时,就会从图像AuthorLogo.jpeg读取所有的描述信息:

"key : Author  value : Mr Wang"
"key : Description value : Qter"

读取动画

效果

gif源图:

每一帧:

源码

QImageReader reader;
reader.setFileName(":/Images/loading");
if (reader.supportsAnimation())
{
// 动画循环的次数
int nLoopCount = reader.loopCount();
qDebug() << QString("Loop Count : %1").arg(nLoopCount); int nCount = reader.imageCount();
for (int i = 0; i < nCount; ++i)
{
// 跳到顺序号为i的图像
bool ret = reader.jumpToImage(i);
if (reader.canRead())
{
// 读取图像
QImage image = reader.read(); // 保存图像
image.save(QString("Loading%1.jpeg").arg(i + 1)); // 下一帧动画等待的毫秒数
int nDelay = reader.nextImageDelay();
qDebug() << QString("Number %1 Delay : %2").arg(i + 2).arg(nDelay);
}
else
{
// 获取错误信息
QImageReader::ImageReaderError error = reader.error();
QString strError = reader.errorString();
qDebug() << "Last Error : " << strError;
}
}
}

输出信息如下:

"Loop Count : -1"
"Number 2 Delay : 90"
"Number 3 Delay : 90"
"Number 4 Delay : 90"
"Number 5 Delay : 90"
"Number 6 Delay : 90"
"Number 7 Delay : 90"
"Number 8 Delay : 90"
"Number 9 Delay : 90"
"Number 10 Delay : 90"
"Number 11 Delay : 90"
"Number 12 Delay : 90"
"Number 13 Delay : 90"
"Number 14 Delay : 90"
"Number 15 Delay : 90"
"Number 16 Delay : 90"
"Number 17 Delay : 90"
"Number 18 Delay : 90"
"Number 19 Delay : 90"
"Number 20 Delay : 90"

QImageWriter、QImageReader一个负责写入、一个负责读取,对于图像的处理有很大的帮助,最好能够熟练地掌握。

Qt之QImageReader的更多相关文章

  1. 《Qt 实战一二三》

    简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的 ...

  2. Qt QImageReader 相似乎有bug

    Qt 版本号 5.4.1 (VS2010) 近期在做一个小程序,事实上非常easy,就是打开一个gif 动画.能够静态显示当中随意一帧图像.Qt 中有一个QImageReader 类.用这个类理论上说 ...

  3. Qt如何读取ico文件中的image(使用QImageReader和QIcon)

    ico文件是一个容器,内部可以装载许多个image,我们可以通过QIcon的pixmap方法来获取需要的image QPixmap pixmap ( const QSize & size, M ...

  4. Qt Load and Save Image Dialog 加载图片对话框

    在Qt中,我们想要通过对话框来打开某一个图片,可以通过使用QFileDialog来快速实现,参见以下代码: QString fileName = QFileDialog::getOpenFileNam ...

  5. 每日一笔记之2:QT之坐标系统:

    以前一直多单片机开发,也没怎么使用过大的显示器,第一次学习,备忘: QT画图系统. 绘图,通过QPainter类实现. Qt的绘图系统对底层函数进行了良好的封装,使得在屏幕和设备的绘图功能可能使用相同 ...

  6. Qt 学习之路:线程总结

    前面我们已经详细介绍过有关线程的一些值得注意的事项.现在我们开始对线程做一些总结. 有关线程,你可以做的是: 在QThread子类添加信号.这是绝对安全的,并且也是正确的(前面我们已经详细介绍过,发送 ...

  7. Qt经典—线程、事件与Qobject(耳目一新)

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  8. 将vim作为QT开发的IDE

    转载请注明链接与作者huihui1988 用了一段时间的vim,喜欢上了这种简洁高效的编辑器.恰逢正在学习QT中,于是将vim变成了开发QT的工具.以下是具体配置. 一.语法高亮支持: 1.打开VIM ...

  9. Image editing techniques and algorithms using Qt

    费了好半天劲先翻译这一点.还有好多地方不明白.先弄明白这一点.继续以后的翻译. 这一篇文章我们将讨论不同的技术和算法来修改图像使用Qt.但是在这之前我们继续你必须知道一些原则处理图片. 这里主要有两种 ...

随机推荐

  1. [国家集训队2009]小Z的袜子

    题目:洛谷P1494.BZOJ2038. 题目大意:给你一列袜子的颜色,每次要你求从区间$[L,R]$内随机选两个袜子颜色相同的概率.解题思路:首先,对于某个特定区间$[L,R]$,它的概率是$\fr ...

  2. 递归树处理,配合vue的vueTreeselect组件使用

    在项目中经常会使用到tree,并且需要对递归树进行操作. 在vue项目中,使用vue-treeselect插件(https://vue-treeselect.js.org/) 使用中遇到的问题: 1. ...

  3. Tire树总结(模板+例题)

    题目来自<算法竞赛设计指南> Tire树是一种可以快速查找字符串的数据结构 模板 #include<cstdio> #include<algorithm> #inc ...

  4. LeetCode 11. Container With Most Water 单调队列

    题意 Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai ...

  5. 前后端分离开发,跨域访问的apche设置

    1,如何让Apache支持跨域访问呢? 步骤: 修改httpd.conf,windows中对应的目录是:C:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf 把 ...

  6. ActiveMQ学习总结(4)——业界消息队列简介

    最近开发公司的短信平台,要用到消息队列,之前用的是亚马逊的SQS,考虑到后续业务发展,对消息推送的高并发要求,公司决定采用RabbitMQ来替换.借此机会开始熟悉各种MQ产品,下面先给大家简介下业界常 ...

  7. MyBatis学习总结(5)——实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  8. SQL SERVER-常用命令2

    1.创建新表 create table mytest ( id int primary key identity(1,1),--主键,自动+1 name varchar(20) unique notn ...

  9. cogs 304. [NOI2001] 方程的解数(meet in the middle)

    304. [NOI2001] 方程的解数 ★★☆   输入文件:equation1.in   输出文件:equation1.out   简单对比时间限制:3 s   内存限制:64 MB 问题描述 已 ...

  10. Yocto tips (19): Yocto SDK Toolchian的使用

    在使用之前须要先source env,导入各种环境变量(注意将路径变更成你自己的): source ../qt5_sdk/environment-setup-cortexa9hf-vfp-neon-p ...