Qt QImageReader类介绍

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这里不生效,**仅在某些情况下有效。例如,当读取具有透明度的图像并将其转换为不包含透明度信息的格式时。

5.更多参考

libVLC 专栏介绍-CSDN博客

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍_qt opengl视频播放器-CSDN博客

QCharts -1.概述-CSDN博客

相关推荐
飞yu流星13 分钟前
c++ stl 遍历算法和查找算法
开发语言·c++·算法
苦瓜汤补钙43 分钟前
(二)QT——按钮小程序
开发语言·c++·qt·小程序
Victoria.a2 小时前
list容器(详解)
数据结构·c++·list
SomeB1oody3 小时前
【Rust自学】18.1. 能用到模式(匹配)的地方
开发语言·后端·rust
萧月霖3 小时前
Scala语言的安全开发
开发语言·后端·golang
LUCIAZZZ3 小时前
弄懂Runable,Callable,Future之间的关系
java·开发语言
MATLAB代码顾问4 小时前
MATLAB实现多种群遗传算法
开发语言·matlab
叫我DPT4 小时前
Go 中 defer 的机制
开发语言·后端·golang
幻想趾于现实5 小时前
C# 装箱和拆箱(以及 as ,is)
开发语言·c#
YxVoyager5 小时前
OpenGL学习笔记(六):Transformations 变换(变换矩阵、坐标系统、GLM库应用)
c++·笔记·图形渲染