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博客

相关推荐
chordful6 分钟前
Leetcode热题100-32 最长有效括号
c++·算法·leetcode·动态规划
材料苦逼不会梦到计算机白富美17 分钟前
线性DP 区间DP C++
开发语言·c++·动态规划
java小吕布18 分钟前
Java Lambda表达式详解:函数式编程的简洁之道
java·开发语言
sukalot22 分钟前
windows C#-查询表达式基础(一)
开发语言·c#
ahadee33 分钟前
蓝桥杯每日真题 - 第12天
c++·vscode·算法·蓝桥杯
一二小选手41 分钟前
【Java Web】分页查询
java·开发语言
大G哥42 分钟前
python 数据类型----可变数据类型
linux·服务器·开发语言·前端·python
vortex51 小时前
解决 VSCode 中 C/C++ 编码乱码问题的两种方法
c语言·c++·vscode
Code成立1 小时前
《Java核心技术 卷I》用户图形界面鼠标事件
java·开发语言·计算机外设
Xiao Fei Xiangζั͡ޓއއ1 小时前
一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数
c语言·开发语言·笔记·程序人生·面试·蓝桥杯·学习方法