zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt之QImageReader

Qt
2023-09-11 14:19:16 时间

读取图像最常用的方法是通过构造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();

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() 重载函数(需要构建新图像)更快,尤其是读取具有相同的格式和大小的多个图像时。


QImageReader使用了一个文件名,而对应的文件不存在。或文件名中不含有扩展名(比如.png)、或存在Qt不支持的扩展名。
QByteArray imageFormat = QImageReader::imageFormat("AuthorLogo.jpeg");

QList QByteArray imageFormats = QImageReader::supportedImageFormats();

QList QByteArray mimeTypes = QImageReader::supportedMimeTypes();

信息如下:


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")
strValue = reader.text(strKey).toLocal8Bit(); qDebug() QString("key : %1 value : %2").arg(strKey).arg(strValue); // 获取错误信息 QImageReader::ImageReaderError error = reader.error(); QString strError = reader.errorString(); qDebug() "Last Error : " strError; }

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


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; }

输出信息如下:


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


QTimeLine 类提供了用于控制动画的时间轴,通常用于通过定期调用一个槽函数来动画一个 GUI 控件。 相信了解动画的人对帧应该不陌生,可以把一个动画想象成由很多张静态画面组成,而每一个画面就是一帧图像。每隔一定时间间隔就显示一帧图像,当该间隔较短时,人眼就感觉不出来了,觉得看到的是连续的影像。
QFuture 允许线程与一个或多个结果同步,这些结果将在稍后的时间点准备就绪,该结果可以是具有默认构造函数和拷贝构造函数的任何类型。如果一个结果在调用 result()、resultAt() 或 results() 函数时不可用,QFutur
QThreadPool 管理和循环使用单独的 QThread 对象,以帮助程序减少创建线程的成本。每个 Qt 应用程序都有一个全局 QThre
QLocalServer可以接受来自本地socket的连接。通过调用listen(),让server监听来自特定key的连接。 调用nextPendingConnection()来接受一个挂起(等待)的连接作为一个已连接的QLocalSocket。函数返一个QLocalSocket指针,可以被
QPropertyAnimation以Qt属性做差值,作为属性值存储在QVariants中,该类继承自QVariantAnimation,并支持基类相同的元类型动画。 声明属性的类必须是一个QObject,为了能够让属性可以用做动画效果,必须提供一个setter(这样,QPropertyAnimatio