zoukankan      html  css  js  c++  java
  • Qt之QImageReader

    简述

    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一个负责写入、一个负责读取,对于图像的处理有很大的帮助,最好能够熟练地掌握。

  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/itrena/p/5938306.html
Copyright © 2011-2022 走看看