QImageIOHandler Class

QImageIOHandler 类定义了 Qt 中所有图像格式的通用图像 I/O 接口。更多

头文件: #include <QImageIOHandler>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

注意:该类中的所有函数都是可重入的

公共类型

enum ImageOption { Size, ClipRect, ScaledSize, ScaledClipRect, Description, …, ImageTransformation }
enum Transformation { TransformationNone, TransformationMirror, TransformationFlip, TransformationRotate180, TransformationRotate90, …, TransformationRotate270 }
flags Transformations

公共函数

QImageIOHandler()
virtual ~QImageIOHandler()
virtual bool canRead() const = 0
virtual int currentImageNumber() const
virtual QRect currentImageRect() const
QIODevice *device() const
QByteArray format() const
virtual int imageCount() const
virtual bool jumpToImage(int imageNumber)
virtual bool jumpToNextImage()
virtual int loopCount() const
virtual int nextImageDelay() const
virtual QVariant option(QImageIOHandler::ImageOption option) const
virtual bool read(QImage *image) = 0
void setDevice(QIODevice *device)
void setFormat(const QByteArray &format)
void setFormat(const QByteArray &format) const
virtual void setOption(QImageIOHandler::ImageOption option, const QVariant &value)
virtual bool supportsOption(QImageIOHandler::ImageOption option) const
virtual bool write(const QImage &image)

静态公共成员

(since 6.0) bool allocateImage(QSize size, QImage::Format format, QImage *image)

详细说明

Qt 通过QImageReaderQImageWriter 使用 QImageIOHandler 来读写图像。您也可以派生该类,使用 Qt 的插件机制编写自己的图像格式处理程序。

调用setDevice() 可为处理程序分配设备,调用setFormat() 可为其分配格式。一个 QImageIOHandler 可支持多种图像格式。canRead true (如果能从设备中读取图像,read() 和write() 将返回 true。

QImageIOHandler 还通过函数loopCount(),imageCount(),nextImageDelay() 和currentImageNumber() 支持动画格式。

为了确定图像处理器支持哪些选项,Qt XML 将调用supportsOption() 和setOption() 。如果您能为ImageOption 枚举中的任何选项提供支持,请确保重新实现这些函数。

要编写自己的图像处理器,至少必须重新实现canRead() 和read() 。然后创建一个可以创建处理程序的QImageIOPlugin 。最后,安装您的插件,QImageReaderQImageWriter 将自动加载插件并开始使用。

另请参阅 QImageIOPluginQImageReaderQImageWriter

成员类型文档

enum QImageIOHandler::ImageOption

该枚举描述了QImageIOHandler 支持的不同选项。有些选项用于查询图像的属性,有些则用于切换图像的写入方式。

常量描述
QImageIOHandler::Size0图像的原始尺寸。支持此选项的处理程序应从图像元数据中读取图像的大小,并从option() 返回该大小作为QSize
QImageIOHandler::ClipRect1剪辑矩形或 ROI(感兴趣区域)。支持该选项的处理程序在应用任何其他转换之前,预计只会从read() 中的原始图像中读取所提供的QRect 区域。
QImageIOHandler::ScaledSize4图像的缩放尺寸。支持此选项的处理程序应在应用任何剪切矩形变换 (ClipRect) 后,将图像缩放至所提供的大小(QSize )。如果处理程序不支持该选项,QImageReader 将在读取图像后执行缩放。
QImageIOHandler::ScaledClipRect3缩放后的图像剪辑矩形(或 ROI,感兴趣区域)。支持此选项的处理程序将在应用任何缩放(ScaleSize)或常规剪切(ClipRect)后应用所提供的剪切矩形(QRect )。如果处理程序不支持该选项,QImageReader 将在读取图像后应用缩放剪切矩形。
QImageIOHandler::Description2图像描述。某些图像格式(如 GIF 和 PNG)允许在图像数据中嵌入文本或注释(如用于存储版权信息)。QImageIOHandler 会以一个QString 的形式返回文本,其中键和值之间用": "分隔,键-值对之间用两个换行符(\n\n)分隔。例如,"Title:Sunset\n/Author:Jim Smith\nSarah Jones/n/n"。在单个块中存储文本的格式可以使用 "Description "作为关键字。
QImageIOHandler::CompressionRatio5图像数据的压缩率。支持该选项的处理程序在写入时会根据该选项的值(int)设置压缩率。
QImageIOHandler::Gamma6图像的伽马值。支持此选项的处理程序在写入图像时,应根据此选项(浮点数)的值设置图像的伽玛等级。
QImageIOHandler::Quality7图像质量级别。支持此选项的处理程序在写入图像时应根据此选项(int)的值设置图像质量级别。
QImageIOHandler::Name8图像名称。支持此选项的处理程序应从图像元数据中读取名称并以QString 的形式返回,或者在写入图像时将名称存储在图像元数据中。
QImageIOHandler::SubType9图像的子类型。支持该选项的处理程序可以使用子类型值来帮助读写图像。例如,PPM 处理程序的子类型值可能是 "ppm "或 "ppmraw"。
QImageIOHandler::IncrementalReading10支持该选项的处理程序将分几次读取图像,就像读取动画一样。QImageReader 将把图像作为动画处理。
QImageIOHandler::Endianness11图像的字节序。某些图像格式可以 BigEndian 或 LittleEndian 方式存储。支持 Endianness 的处理程序会使用此选项的值来决定图像的存储方式。
QImageIOHandler::Animation12支持动画的图像格式会在supportsOption() 中返回该值的 true,否则会返回 false。
QImageIOHandler::BackgroundColor13某些图像格式允许指定背景颜色。支持 BackgroundColor 的处理程序在读取图像时会将背景颜色初始化为该选项(QColor )。
QImageIOHandler::ImageFormat14处理程序返回的图像数据格式。可以是QImage::Format 中列出的任何格式。
QImageIOHandler::SupportedSubTypes15支持不同保存变体的图像格式应在此选项中返回支持的变体名称列表(QList<QByteArray>)。
QImageIOHandler::OptimizedWrite16支持此选项的处理程序应在写入时打开优化标记。
QImageIOHandler::ProgressiveScanWrite17支持此选项的处理程序应将图像写成逐行扫描图像。
QImageIOHandler::ImageTransformation18支持此选项的处理程序可以读取图像的转换元数据。支持此选项的处理程序本身不应应用转换。

枚举 QImageIOHandler::Transformation
flags QImageIOHandler::Transformations

此枚举描述了某些图像格式(通常通过 EXIF)支持的不同变换或方向。

常量说明
QImageIOHandler::TransformationNone0不应用任何变换。
QImageIOHandler::TransformationMirror1水平镜像图像。
QImageIOHandler::TransformationFlip2垂直镜像图像。
QImageIOHandler::TransformationRotate180TransformationMirror | TransformationFlip将图像旋转 180 度。这与水平和垂直镜像相同。
QImageIOHandler::TransformationRotate904将图像旋转 90 度。
QImageIOHandler::TransformationMirrorAndRotate90TransformationMirror | TransformationRotate90水平镜像图像,然后旋转 90 度。
QImageIOHandler::TransformationFlipAndRotate90TransformationFlip | TransformationRotate90垂直镜像图像,然后旋转 90 度。
QImageIOHandler::TransformationRotate270TransformationRotate180 | TransformationRotate90将图像旋转 270 度。这等同于水平和垂直镜像,然后旋转 90 度。

变换类型是QFlags<Transformation> 的类型定义。它存储变换值的 OR 组合。

另请参阅 QImageReader::transformation(),QImageReader::setAutoTransform() 和QImageWriter::setTransformation()。

成员函数文档

QImageIOHandler::QImageIOHandler()

构造一个 QImageIOHandler 对象。

[virtual noexcept] QImageIOHandler::~QImageIOHandler()

销毁QImageIOHandler 对象。

[static, since 6.0] bool QImageIOHandler::allocateImage(QSize size, QImage::Format format, QImage *image)

这是子类中读取函数的便捷方法。如果所需的分配超出了当前的分配限制,图像格式处理程序必须拒绝加载图像。此函数检查参数和限制,如果有效且需要,则进行分配。成功返回后,image 将是给定的sizeformat 的一个有效、分离的QImage

此函数在 Qt 6.0 中引入。

另请参阅 QImageReader::allocationLimit()。

[pure virtual] bool QImageIOHandler::canRead() const

如果可以从设备读取图像,则返回true (即支持图像格式、可以从设备读取图像且初始头信息表明可以读取图像);否则返回false

重新实现 canRead() 时,请确保 I/O 设备 (device()) 保持原始状态(例如,使用 peek() 而不是read())。

另请参阅 read() 和QIODevice::peek()。

[virtual] int QImageIOHandler::currentImageNumber() const

对于支持动画的图像格式,该函数返回动画中当前图像的序列号。如果在任何图像read() 之前调用此函数,则返回-1。序列中第一幅图像的编号为 0。

如果图像格式不支持动画,则返回 0。

另请参见 read()。

[virtual] QRect QImageIOHandler::currentImageRect() const

返回当前图像的矩形。如果没有为图像定义矩形,则返回空 QRect()。

此函数对动画非常有用,因为动画一次只能更新帧的一部分。

QIODevice *QImageIOHandler::device() const

返回当前分配给QImageIOHandler 的设备。如果没有分配设备,则返回nullptr

另请参阅 setDevice() 。

QByteArray QImageIOHandler::format() const

返回当前分配给QImageIOHandler 的格式。如果没有分配格式,则返回空字符串。

另请参阅 setFormat()。

[virtual] int QImageIOHandler::imageCount() const

对于支持动画的图像格式,此函数将返回动画中的图像数。如果图像格式不支持动画,或无法确定图像数目,则返回 0。

默认实现是,如果canRead() 返回true ,则返回 1;否则返回 0。

[virtual] bool QImageIOHandler::jumpToImage(int imageNumber)

对于支持动画的图像格式,该函数将跳转到序列号为imageNumber 的图像。下一次调用read() 时,将尝试读取该图像。

默认实现什么也不做,而是返回false

[virtual] bool QImageIOHandler::jumpToNextImage()

对于支持动画的图像格式,该函数会跳转到下一张图像。

默认实现不做任何操作,并返回false

[virtual] int QImageIOHandler::loopCount() const

对于支持动画的图像格式,该函数将返回动画循环的次数。如果图像格式不支持动画,则返回 0。

[virtual] int QImageIOHandler::nextImageDelay() const

对于支持动画的图像格式,该函数将返回读取下一幅图像前的等待毫秒数。如果图像格式不支持动画,则返回 0。

[virtual] QVariant QImageIOHandler::option(QImageIOHandler::ImageOption option) const

返回分配给option 的值,即QVariant 。值的类型取决于选项。例如,option(Size) 返回QSize 变体。

另请参阅 setOption() 和supportsOption()。

[pure virtual] bool QImageIOHandler::read(QImage *image)

从设备读取图像,并将其存储在image 中。如果成功读取图像,则返回true ;否则返回 false。

对于支持增量加载的图像格式和动画格式,图像处理程序可以假定image 指向上一帧。

另请参阅 canRead() 。

void QImageIOHandler::setDevice(QIODevice *device)

QImageIOHandler 的设备设置为device 。图像处理程序在读写图像时将使用该设备。

设备只能设置一次,并且必须在调用canRead(),read(),write() 等命令前设置。如果需要读取多个文件,请构建相应的QImageIOHandler 子类的多个实例。

另请参阅 device()。

void QImageIOHandler::setFormat(const QByteArray &format)

QImageIOHandler 的格式设置为format 。该格式对支持多种图像格式的处理程序最有用。

另请参阅 format() 。

void QImageIOHandler::setFormat(const QByteArray &format) const

QImageIOHandler 的格式设置为format 。该格式对支持多种图像格式的处理程序最有用。

该函数声明为常量,因此可以从canRead() 中调用。

另请参阅 format()。

[virtual] void QImageIOHandler::setOption(QImageIOHandler::ImageOption option, const QVariant &value)

value 设置选项option 的值。

另请参阅 option() 和ImageOption

[virtual] bool QImageIOHandler::supportsOption(QImageIOHandler::ImageOption option) const

如果QImageIOHandler 支持option 选项,则返回true ;否则返回false 。例如,如果QImageIOHandler 支持Size 选项,则 supportsOption(Size) 必须返回 true。

另请参阅 setOption() 和option()。

[virtual] bool QImageIOHandler::write(const QImage &image)

将图像image 写入指定的设备。成功时返回true ,否则返回false

默认实现不做任何操作,仅返回false

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.