1.简介
QImageReader
是用于读取图像文件的类。它提供了读取不同图像格式的功能,包括但不限于 PNG、JPEG、BMP 等。QImageReader
可以用于文件,也可以用于任何 QIODevice
,如 QByteArray
,这使得它非常灵活。
QImageReader
是一个专门用于从文件或设备读取图像数据的工具,提供了更多的读取控制和错误处理功能。
主要特点:
- 格式支持:
QImageReader
可以自动检测图像格式,也可以通过设置格式来指定读取特定类型的图像。 - 读取控制: 可以通过指定大小、缩放选项和跳过图像的一部分来控制读取过程。
- 错误处理: 提供了错误处理机制,可以捕获和处理读取过程中的错误。
- 元数据支持: 可以读取图像的元数据,如大小、格式、分辨率等信息。
2.常用接口介绍
canRead()
:判断是否能够读取图像。read()
:读取图像数据,并返回一个QImage
对象。scaledSize()
:获取图像的缩放大小。setScaledSize()
:设置图像的缩放大小。size()
:获取图像的原始大小。imageCount()
:获取图像的帧数(对于多帧图像如 GIF)。currentImageNumber()
:获取当前读取的图像帧编号。jumpToImage()
:跳转到指定的图像帧。supportsAnimation()
:判断是否支持动画格式。setAutoTransform()
:设置是否自动应用变换(如旋转)。error()
:获取读取过程中的错误信息。errorString()
:获取错误的字符串描述。
QImageReader::ImageReaderError枚举值:
- QImageReader::FileNotFoundError:QImageReader使用了一个文件名,而对应的文件不存在。或文件名中不含有扩展名(比如.png)、或存在Qt不支持的扩展名。
- QImageReader::DeviceError:QImageReader读取图像数据时遇到设备错误,详细请查看设备问题。
- QImageReader::UnsupportedFormatError:Qt不支持的请求图像格式。
- QImageReader::InvalidDataError:图像数据无效,并且QImageReader无法从图像中读取。可能是图像文件被损坏。
- QImageReader::UnknownError:未知错误。如果调用read()后得到这个值,最有可能是 QImageReader的一个Bug。
3.QImageReader和QImage区别
QImage
是一个图像数据的容器,提供了图像的加载、保存和操作功能,QImage
可以直接从文件、二进制数据或者另一个QImage
对象中加载图像。QImage
通常用于应用程序中直接处理图像,它是用于图形界面的绘制和图像处理操作的轻量级工具。QImageReader
是一个专门用于从文件或设备读取图像数据的工具,提供了更多的读取控制和错误处理功能,QImageReader
需要与QIODevice
(如QFile
)配合使用来读取图像。而QImageReader
更多地用于图像加载和预处理的场景。
总结来说,QImage
是一个通用的图像处理类,而 QImageReader
是一个专门的图像读取类,提供了更多的读取选项和错误处理能力。在实际应用中,根据需要选择合适的类来处理图像数据。
4.示例
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QImageReader>
#include <QDebug>
#include <QFileDialog>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Image"), "D:/", tr("Image Files (*.png *.jpg *.bmp *.jpeg)"));
if(fileName.isEmpty())
return;
QFile file(fileName);
file.open(QIODevice::ReadOnly);
QImageReader reader(&file);
if (!reader.canRead())
{
qDebug() << "Cannot read the image";
return;
}
QImage image = reader.read();
if (image.isNull())
{
qDebug() << "Failed to read the image:" << reader.errorString();
return;
}
ui->lbLeft->setPixmap(QPixmap::fromImage(image));
//===================================================
QFile file2(fileName);
file2.open(QIODevice::ReadOnly);
QImageReader reader2(&file2);
reader2.setClipRect(QRect(0,0,150,150));
//reader2.setBackgroundColor(QColor(255,0,0));
if (!reader2.canRead())
{
qDebug() << "Cannot read the image";
return;
}
QImage image2 = reader2.read();
if (image2.isNull())
{
qDebug() << "Failed to read the image:" << reader2.errorString();
return;
}
ui->lbRight->setPixmap(QPixmap::fromImage(image2));
}
**注意:setBackgroundColor这里不生效,**仅在某些情况下有效。例如,当读取具有透明度的图像并将其转换为不包含透明度信息的格式时。