本页内容

QImage Class

QImage 类提供了一种与硬件无关的图像表示形式,允许直接访问像素数据,并可作为绘图设备使用。更多内容...

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

注意:该类中的所有函数均为可重入的。

公共类型

enum Format { Format_Invalid, Format_Mono, Format_MonoLSB, Format_Indexed8, Format_RGB32, …, Format_CMYK8888 }
enum InvertMode { InvertRgb, InvertRgba }

公共函数

QImage()
QImage(const char *const[] xpm)
QImage(const QSize &size, QImage::Format format)
QImage(const QString &fileName, const char *format = nullptr)
QImage(int width, int height, QImage::Format format)
QImage(const uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
QImage(uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
QImage(const uchar *data, int width, int height, qsizetype bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
QImage(uchar *data, int width, int height, qsizetype bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)
QImage(const QImage &image)
QImage(QImage &&other)
virtual ~QImage()
bool allGray() const
void applyColorTransform(const QColorTransform &transform)
(since 6.8) void applyColorTransform(const QColorTransform &transform, QImage::Format toFormat, Qt::ImageConversionFlags flags = Qt::AutoColor)
int bitPlaneCount() const
uchar *bits()
const uchar *bits() const
qsizetype bytesPerLine() const
qint64 cacheKey() const
QRgb color(int i) const
int colorCount() const
QColorSpace colorSpace() const
QList<QRgb> colorTable() const
(since 6.4) QImage colorTransformed(const QColorTransform &transform) const &
(since 6.8) QImage colorTransformed(const QColorTransform &transform, QImage::Format toFormat, Qt::ImageConversionFlags flags = Qt::AutoColor) const &
(since 6.4) QImage colorTransformed(const QColorTransform &transform) &&
(since 6.8) QImage colorTransformed(const QColorTransform &transform, QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&
const uchar *constBits() const
const uchar *constScanLine(int i) const
void convertTo(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor)
void convertToColorSpace(const QColorSpace &colorSpace)
(since 6.8) void convertToColorSpace(const QColorSpace &colorSpace, QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor)
QImage convertToFormat(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&
QImage convertToFormat(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) const &
QImage convertToFormat(QImage::Format format, const QList<QRgb> &colorTable, Qt::ImageConversionFlags flags = Qt::AutoColor) const
(since 6.0) QImage convertedTo(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&
(since 6.0) QImage convertedTo(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) const &
QImage convertedToColorSpace(const QColorSpace &colorSpace) const
(since 6.8) QImage convertedToColorSpace(const QColorSpace &colorSpace, QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&
(since 6.8) QImage convertedToColorSpace(const QColorSpace &colorSpace, QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) const &
QImage copy(const QRect &rectangle = QRect()) const
QImage copy(int x, int y, int width, int height) const
QImage createAlphaMask(Qt::ImageConversionFlags flags = Qt::AutoColor) const
QImage createHeuristicMask(bool clipTight = true) const
QImage createMaskFromColor(QRgb color, Qt::MaskMode mode = Qt::MaskInColor) const
int depth() const
(since 6.2) QSizeF deviceIndependentSize() const
qreal devicePixelRatio() const
int dotsPerMeterX() const
int dotsPerMeterY() const
void fill(uint pixelValue)
void fill(Qt::GlobalColor color)
void fill(const QColor &color)
(since 6.9) void flip(Qt::Orientations orient = Qt::Vertical)
(since 6.9) QImage flipped(Qt::Orientations orient = Qt::Vertical) &&
(since 6.9) QImage flipped(Qt::Orientations orient = Qt::Vertical) const &
QImage::Format format() const
bool hasAlphaChannel() const
int height() const
void invertPixels(QImage::InvertMode mode = InvertRgb)
bool isGrayscale() const
bool isNull() const
bool load(const QString &fileName, const char *format = nullptr)
bool load(QIODevice *device, const char *format)
(since 6.2) bool loadFromData(QByteArrayView data, const char *format = nullptr)
bool loadFromData(const QByteArray &data, const char *format = nullptr)
bool loadFromData(const uchar *data, int len, const char *format = nullptr)
(since 6.0, until 6.13) void mirror(bool horizontal = false, bool vertical = true)
(until 6.13) QImage mirrored(bool horizontal = false, bool vertical = true) &&
(until 6.13) QImage mirrored(bool horizontal = false, bool vertical = true) const &
QPoint offset() const
QRgb pixel(const QPoint &position) const
QRgb pixel(int x, int y) const
QColor pixelColor(const QPoint &position) const
QColor pixelColor(int x, int y) const
QPixelFormat pixelFormat() const
int pixelIndex(const QPoint &position) const
int pixelIndex(int x, int y) const
QRect rect() const
bool reinterpretAsFormat(QImage::Format format)
(since 6.0) void rgbSwap()
QImage rgbSwapped() &&
QImage rgbSwapped() const &
bool save(const QString &fileName, const char *format = nullptr, int quality = -1) const
bool save(QIODevice *device, const char *format = nullptr, int quality = -1) const
QImage scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const
QImage scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const
QImage scaledToHeight(int height, Qt::TransformationMode mode = Qt::FastTransformation) const
QImage scaledToWidth(int width, Qt::TransformationMode mode = Qt::FastTransformation) const
uchar *scanLine(int i)
const uchar *scanLine(int i) const
void setAlphaChannel(const QImage &alphaChannel)
void setColor(int index, QRgb colorValue)
void setColorCount(int colorCount)
void setColorSpace(const QColorSpace &colorSpace)
void setColorTable(const QList<QRgb> &colors)
void setDevicePixelRatio(qreal scaleFactor)
void setDotsPerMeterX(int x)
void setDotsPerMeterY(int y)
void setOffset(const QPoint &offset)
void setPixel(const QPoint &position, uint index_or_rgb)
void setPixel(int x, int y, uint index_or_rgb)
void setPixelColor(const QPoint &position, const QColor &color)
void setPixelColor(int x, int y, const QColor &color)
void setText(const QString &key, const QString &text)
QSize size() const
qsizetype sizeInBytes() const
void swap(QImage &other)
QString text(const QString &key = QString()) const
QStringList textKeys() const
CGImageRef toCGImage() const
(since 6.0) HBITMAP toHBITMAP() const
(since 6.0) HICON toHICON(const QImage &mask = {}) const
QImage transformed(const QTransform &matrix, Qt::TransformationMode mode = Qt::FastTransformation) const
bool valid(const QPoint &pos) const
bool valid(int x, int y) const
int width() const
operator QVariant() const
bool operator!=(const QImage &image) const
QImage &operator=(QImage &&other)
QImage &operator=(const QImage &image)
bool operator==(const QImage &image) const

静态公共成员

(since 6.2) QImage fromData(QByteArrayViewdata, const char*format= nullptr)
QImage fromData(const QByteArray&data, const char*format= nullptr)
QImage fromData(const uchar*data, intsize, const char*format= nullptr)
(since 6.0) QImage fromHBITMAP(HBITMAPhbitmap)
(since 6.0) QImage fromHICON(HICONicon)
QImage::Format toImageFormat(QPixelFormat格式)
QPixelFormat toPixelFormat(QImage::Format格式)
QTransform trueMatrix(const QTransform&matrix, intwidth, intheight)
QImageCleanupFunction
QDataStream &operator<<(QDataStream &stream, const QImage &image)
QDataStream &operator>>(QDataStream &stream, QImage &image)

详细说明

Qt 提供了四个用于处理图像数据的类:QImage、QPixmap 、QBitmap 和QPicture 。QImage 专为 I/O 操作以及直接访问和操作像素而设计和优化,而QPixmap 则专为在屏幕上显示图像而设计和优化。QBitmap 仅是一个继承自QPixmap 的便利类,用于确保深度为 1。 最后,QPicture 类是一个绘图设备,用于记录和重放QPainter 命令。

由于 QImage 是QPaintDevice 的子类,因此可以使用QPainter 直接在图像上绘图。在 QImage 上使用QPainter 时,绘制操作可以在与当前 GUI 线程不同的线程中进行。

QImage 类支持由Format 枚举定义的多种图像格式。其中包括单色、8 位、32 位和带 alpha 通道的图像,这些格式在所有版本的 Qt 4.x 中均可用。

QImage 提供了一组函数,可用于获取有关图像的各种信息。此外,还有若干函数可用于对图像进行变换。

由于 QImage 类采用隐式数据共享,因此 QImage 对象可以按值传递。QImage 对象还可以进行流式传输和比较。

注意:若要在 Qt 的静态构建中加载 QImage 对象,请参阅《插件使用指南》。

警告: 不支持在格式为QImage::Format_Indexed8 或QImage::Format_CMYK8888 的 QImage 上进行绘制 。

图像文件的读写

QImage 提供了多种加载图像文件的方式:可以在构造 QImage 对象时加载文件,也可以在后续使用load() 或loadFromData() 函数时加载。 QImage 还提供了静态函数fromData(),用于根据给定数据创建 QImage 对象。加载图像时,文件名既可以指向磁盘上的实际文件,也可以指向应用程序的嵌入式资源之一。有关如何将图像和其他资源文件嵌入应用程序可执行文件的详细信息,请参阅《Qt 资源系统概述》。

只需调用save()函数即可保存QImage对象。

支持的文件格式完整列表可通过QImageReader::supportedImageFormats()和QImageWriter::supportedImageFormats()函数获取。新文件格式可作为插件添加。默认情况下,Qt支持以下格式:

格式描述Qt的支持情况
BMPWindows 位图读/写
GIF图形交换格式(可选)读取
JPG联合图像专家组读/写
JPEG联合图像专家组读/写
PNG可移植网络图形读/写
PBM可移植位图读取
PGM可移植灰度图读取
PPM便携式像素图读/写
XBMX11 位图读/写
XPMX11 像素图读/写

图像信息

QImage 提供了一组函数,可用于获取有关图像的各种信息:

可用函数
几何属性size()、width()、height()、dotsPerMeterX() 和dotsPerMeterY() 函数提供有关图像大小和宽高比的信息。

rect() 函数返回图像的包围矩形。valid() 函数用于判断给定的一对坐标是否位于该矩形内。offset() 函数返回图像相对于其他图像定位时应偏移的像素数,该偏移量也可通过setOffset() 函数进行调整。

颜色通过将像素的坐标传递给pixel() 函数,可以获取该像素的颜色。pixel() 函数会返回一个QRgb 值的颜色,该值与图像格式无关。

对于单色和 8 位图像,colorCount() 和colorTable() 函数提供有关用于存储图像数据的颜色分量信息:colorTable() 函数返回图像的整个颜色表。 若要获取单个条目,请先使用pixelIndex()函数获取给定坐标对对应的像素索引,然后使用color()函数获取颜色。请注意,如果手动创建8位图像,还必须为该图像设置一个有效的颜色表。

hasAlphaChannel() 函数用于判断图像格式是否支持 alpha 通道。allGray() 和isGrayscale() 函数用于判断图像的颜色是否均为灰度色。

另请参阅Pixel Manipulation 和Image Transformations 章节。

文本text() 函数返回与给定文本键关联的图像文本。可通过textKeys() 函数获取图像的文本键。使用setText() 函数可修改图像的文本。
底层信息depth() 函数返回图像的位深度。支持的位深度包括 1 位(单色)、8 位、16 位、24 位和 32 位。bitPlaneCount() 函数用于返回实际使用的位数。更多信息请参阅Image Formats 章节。

format()、bytesPerLine() 和sizeInBytes() 函数提供了有关图像中存储数据的底层信息。

cacheKey() 函数返回一个数字,该数字可唯一标识此 QImage 对象的内容。

像素操作

用于操作图像像素的函数取决于图像格式。这是因为单色和 8 位图像基于索引并使用颜色查找表,而 32 位图像则直接存储 ARGB 值。有关图像格式的更多信息,请参阅“Image Formats ”一节。

对于 32 位图像,可以使用setPixel() 函数将给定坐标处的像素颜色更改为以 ARGB 四元组形式指定的任意其他颜色。 要生成合适的QRgb 值,请使用qRgb()函数(向给定的RGB值添加默认的alpha分量,即生成不透明颜色)或qRgba()函数。例如:

32位
3×3 像素网格,带有 ARGB 颜色值
QImage image(3, 3, QImage::Format_RGB32);
QRgb value;

value = qRgb(189, 149, 39); // 0xffbd9527
image.setPixel(1, 1, value);

value = qRgb(122, 163, 39); // 0xff7aa327
image.setPixel(0, 1, value);
image.setPixel(1, 0, value);

value = qRgb(237, 187, 51); // 0xffedba31
image.setPixel(2, 1, value);

对于8位和单色图像,像素值仅是图像色表中的一个索引。 因此,setPixel() 函数仅可用于将给定坐标处的像素颜色更改为图像色表中的预定义颜色,即它只能更改像素的索引值。若要修改图像色表或向其中添加颜色,请使用setColor() 函数。

色表中的一个条目是一个以QRgb 值编码的ARGB四元组。请使用qRgb()和qRgba()函数生成合适的QRgb 值,以便与setColor()函数配合使用。例如:

8 位
3×3像素网格,带索引颜色和颜色表
QImage image(3, 3, QImage::Format_Indexed8);
QRgb value;

value = qRgb(122, 163, 39); // 0xff7aa327
image.setColor(0, value);

value = qRgb(237, 187, 51); // 0xffedba31
image.setColor(1, value);

value = qRgb(189, 149, 39); // 0xffbd9527
image.setColor(2, value);

image.setPixel(0, 1, 0);
image.setPixel(1, 0, 0);
image.setPixel(1, 1, 2);
image.setPixel(2, 1, 1);

对于每个颜色通道超过 8 位的图像。可以使用setPixelColor() 和pixelColor() 方法来设置和获取QColor 值。

QImage 还提供了scanLine() 函数,该函数返回指向给定索引处扫描行中像素数据的指针;以及bits() 函数,该函数返回指向第一个像素数据的指针(这等同于scanLine(0) )。

图像格式

存储在 QImage 中的每个像素都由一个整数表示。该整数的大小因格式而异。QImage 支持多种图像格式,这些格式由Format 枚举定义。

单色图像通过 1 位索引存储在最多包含两种颜色的颜色表中。单色图像有两种不同的类型:大端序(MSB 在前)或小端序(LSB 在前)的位序。

8 位图像通过 8 位索引存储在颜色表中,即每个像素占用一个字节。颜色表是QList<QRgb>,而QRgb 类型定义等同于一个包含 ARGB 四元组的无符号整数,其格式为 0xAARRGGBB。

32 位图像没有颜色表;相反,每个像素都包含一个QRgb 值。 32 位图像有三种不同的类型,分别存储 RGB(即 0xffRRGGBB)、ARGB 和预乘 ARGB 值。在预乘格式中,红色、绿色和蓝色通道的值会乘以 alpha 分量除以 255 的结果。

可通过format()函数获取图像的格式。使用convertToFormat()函数将图像转换为另一种格式。allGray()和isGrayscale()函数用于判断彩色图像是否可安全地转换为灰度图像。

图像变换

QImage 提供了一系列函数,用于创建作为原始图像变换版本的新图像:createAlphaMask() 函数根据该图像的 alpha 缓冲区构建并返回一个 1-bpp 遮罩,而createHeuristicMask() 函数则为该图像创建并返回一个 1-bpp 启发式遮罩。 后一个函数的工作原理是:从图像的一个角中选取一种颜色,然后从所有边缘开始逐步去除该颜色的像素。

mirrored() 函数返回沿指定方向镜像的图像,scaled() 函数返回缩放为指定尺寸矩形的图像副本,而rgbSwapped() 函数则根据 RGB 图像构建 BGR 图像。

scaledToWidth() 和scaledToHeight() 函数返回图像的缩放副本。

transformed() 函数返回一个经过给定变换矩阵和变换模式变换后的图像副本:在内部,变换矩阵会进行调整以补偿不需要的平移,即transformed() 返回包含原始图像所有变换后点的最小图像。静态函数trueMatrix() 返回用于变换图像的实际矩阵。

此外,还有一些用于就地修改图像属性的函数:

函数描述
setDotsPerMeterX()通过设置物理一米内水平方向上可容纳的像素数来定义宽高比。
setDotsPerMeterY()通过设置物理一米内可容纳的垂直像素数来定义宽高比。
fill()将整个图像填充为给定的像素值。
invertPixels()使用给定的InvertMode 值反转图像中所有像素的值。
setColorTable()设置用于转换颜色索引的颜色表。仅限单色和8位格式。
setColorCount()调整颜色表的大小。仅适用于单色和8位格式。

另请参阅 QImageReader 、QImageWriter 、QPixmap 、QSvgRenderer 、图像合成示例以及涂鸦示例。

成员类型文档

enum QImage::Format

Qt 支持以下图像格式。请参阅表格后的说明。

常量值描述
QImage::Format_Invalid0该图像无效。
QImage::Format_Mono1图像采用每像素 1 位的存储方式。字节按最高有效位 (MSB) 在前的方式进行打包。
QImage::Format_MonoLSB2该图像以每像素 1 位的方式存储。字节按最高有效位 (MSB) 在前的方式进行打包。
QImage::Format_Indexed83该图像使用 8 位索引存储在颜色映射表中。
QImage::Format_RGB324该图像采用 32 位 RGB 格式(0xffRRGGBB)存储。
QImage::Format_ARGB325该图像采用 32 位 ARGB 格式(0xAARRGGBB)存储。
QImage::Format_ARGB32_Premultiplied6图像采用预乘 32 位 ARGB 格式(0xAARRGGBB)存储,即红色、绿色和蓝色通道值均乘以除以 255 后的 alpha 成分。 (如果 RR、GG 或 BB 的值高于 alpha 通道,则结果未定义。)某些操作(例如使用 alpha 混合进行图像合成)使用预乘 ARGB32 比使用普通 ARGB32 速度更快。
QImage::Format_RGB167图像采用 16 位 RGB 格式(5-6-5)存储。
QImage::Format_ARGB8565_Premultiplied8图像采用预乘的 24 位 ARGB 格式(8-5-6-5)存储。
QImage::Format_RGB6669图像采用 24 位 RGB 格式(6-6-6)存储。未使用的最高有效位始终为零。
QImage::Format_ARGB6666_Premultiplied10图像采用预乘 24 位 ARGB 格式(6-6-6-6)存储。
QImage::Format_RGB55511该图像采用 16 位 RGB 格式(5-5-5)存储。未使用的最高有效位始终为零。
QImage::Format_ARGB8555_Premultiplied12图像采用预乘 24 位 ARGB 格式(8-5-5-5)存储。
QImage::Format_RGB88813图像采用 24 位 RGB 格式(8-8-8)存储。
QImage::Format_RGB44414图像采用 16 位 RGB 格式(4-4-4)存储。未使用的位始终为零。
QImage::Format_ARGB4444_Premultiplied15该图像采用预乘的 16 位 ARGB 格式(4-4-4-4)存储。
QImage::Format_RGBX8888 (since Qt 5.2)16图像采用 32 位字节顺序 RGB(x) 格式(8-8-8-8)存储。这与 Format_RGBA8888 相同,但 alpha 值必须始终为 255。
QImage::Format_RGBA8888 (since Qt 5.2)17图像采用 32 位字节顺序 RGBA 格式(8-8-8-8)存储。
QImage::Format_RGBA8888_Premultiplied (since Qt 5.2)18图像采用预乘的 32 位字节顺序 RGBA 格式(8-8-8-8)存储。
QImage::Format_BGR30 (since Qt 5.4)19图像采用 32 位 BGR 格式(x-10-10-10)存储。
QImage::Format_A2BGR30_Premultiplied (since Qt 5.4)20图像采用 32 位预乘 ABGR 格式(2-10-10-10)存储。
QImage::Format_RGB30 (since Qt 5.4)21该图像采用 32 位 RGB 格式(x-10-10-10)存储。
QImage::Format_A2RGB30_Premultiplied (since Qt 5.4)22图像采用 32 位预乘 ARGB 格式(2-10-10-10)存储。
QImage::Format_Alpha8 (since Qt 5.5)23图像采用 8 位纯 Alpha 格式存储。
QImage::Format_Grayscale8 (since Qt 5.5)24图像采用 8 位灰度格式存储。
QImage::Format_Grayscale16 (since Qt 5.13)28图像采用 16 位灰度格式存储。
QImage::Format_RGBX64 (since Qt 5.12)25图像采用 64 位半字序 RGB(x) 格式(16-16-16-16)存储。这与 Format_RGBA64 相同,但 alpha 值必须始终为 65535。
QImage::Format_RGBA64 (since Qt 5.12)26图像采用 64 位半字序 RGBA 格式(16-16-16-16)存储。
QImage::Format_RGBA64_Premultiplied (since Qt 5.12)27图像采用预乘的 64 位半字序 RGBA 格式(16-16-16-16)存储。
QImage::Format_BGR888 (since Qt 5.14)29图像采用 24 位 BGR 格式存储。
QImage::Format_RGBX16FPx4 (since Qt 6.2)30图像采用四个 16 位半字浮点 RGBx 格式(16FP-16FP-16FP-16FP)存储。这与 Format_RGBA16FPx4 相同,但 alpha 值必须始终为 1.0。
QImage::Format_RGBA16FPx4 (since Qt 6.2)31图像采用四个 16 位半字浮点 RGBA 格式(16FP-16FP-16FP-16FP)存储。
QImage::Format_RGBA16FPx4_Premultiplied (since Qt 6.2)32图像采用预乘的四组 16 位半字浮点 RGBA 格式(16FP-16FP-16FP-16FP)进行存储。
QImage::Format_RGBX32FPx4 (since Qt 6.2)33图像采用四个 32 位浮点 RGBx 格式(32FP-32FP-32FP-32FP)存储。这与 Format_RGBA32FPx4 相同,只是 alpha 值必须始终为 1.0。
QImage::Format_RGBA32FPx4 (since Qt 6.2)34图像采用四组 32 位浮点 RGBA 格式(32FP-32FP-32FP-32FP)存储。
QImage::Format_RGBA32FPx4_Premultiplied (since Qt 6.2)35图像采用预乘的四路 32 位浮点 RGBA 格式(32FP-32FP-32FP-32FP)存储。
QImage::Format_CMYK8888 (since Qt 6.8)36图像采用 32 位字节顺序 CMYK 格式存储。

字节顺序格式具有QPixelFormat::typeInterpretation()值为QPixelFormat::UnsignedByte ,这意味着各个颜色分量在内存中以固定顺序存储,例如 0xRR、0xGG、0xBB、0xAA,无论平台的字节序如何。 这些格式应按单个字节读取,或者如果以较大的块读取,则应解释为QPixelFormat::BigEndian 。

注意: 不支持将图像绘制 到格式为 QImage::Format_Indexed8 或 QImage::Format_CMYK8888 的QImage 中。

注意:请避免 使用QPainter 直接渲染到大多数这些格式。渲染最好针对Format_RGB32 和Format_ARGB32_Premultiplied 格式进行优化,其次是针对Format_RGB16 、Format_RGBX8888 、Format_RGBA8888_Premultiplied 、Format_RGBX64 和Format_RGBA64_Premultiplied 格式进行优化。

另请参阅 format() 和convertToFormat()。

enum QImage::InvertMode

该枚举类型用于描述在invertPixels()函数中应如何对像素值进行反转。

常量值描述
QImage::InvertRgb0仅反转 RGB 值,保持 alpha 通道不变。
QImage::InvertRgba1反转所有通道,包括 alpha 通道。

另请参阅 invertPixels()。

成员函数文档

[noexcept] QImage::QImage()

构建一个零像。

另请参阅 isNull()。

[explicit] QImage::QImage(const char *const[] xpm)

根据给定的xpm 图像构建一个图像。

请确保该图像是一个有效的 XPM 图像。错误将被静默忽略。

请注意,通过使用一种非典型的声明方式,可以稍微压缩一下 XPM 变量:

static const char * const start_xpm[] = {
    "16 15 8 1",
    "a c #cec6bd",
    // etc.
};

额外的const 使整个定义成为只读的,这效率略高(例如,当代码位于共享库中时),并且能够随应用程序一起存储在ROM中。

QImage::QImage(const QSize &size, QImage::Format format)

根据给定的size 和format 构建一个映像。

如果无法分配内存,则返回一个null 图像。

警告:这 将创建一个数据未初始化的 QImage 对象。请在使用QPainter 进行绘制之前,先调用fill() 将图像填充为适当的像素值。

[explicit] QImage::QImage(const QString &fileName, const char *format = nullptr)

构建一个图像,并尝试从指定fileName 的文件中加载该图像。

加载器将尝试使用指定的format 读取图像。如果未指定format (这是默认情况),则会根据文件的后缀和头部信息自动检测。详情请参阅 {QImageReader::setAutoDetectImageFormat()}{QImageReader}。

如果图像加载失败,则该对象为空图像。

文件名可以指向磁盘上的实际文件,也可以指向应用程序的嵌入式资源之一。有关如何将图像和其他资源文件嵌入应用程序可执行文件的详细信息,请参阅“资源系统”概述。

另请参阅 isNull() 和Reading and Writing Image Files 。

QImage::QImage(int width, int height, QImage::Format format)

根据给定的width 、height 和format 构建一个映像。

如果无法分配内存,将返回一个null 图像。

警告:这 将创建一个数据未初始化的 QImage。请在使用QPainter 绘制图像之前,先调用fill() 将图像填充为适当的像素值。

QImage::QImage(const uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)

使用给定的width 、height 和format 构建图像,该图像使用现有的只读内存缓冲区data 。width 和height 必须以像素为单位指定,data 必须为32位对齐,且图像中每条扫描线的数据也必须为32位对齐。

在 QImage 的整个生命周期内,以及所有未被修改或未从原始缓冲区分离的副本存在期间,该缓冲区必须保持有效。图像在销毁时不会删除该缓冲区。您可以提供一个函数指针cleanupFunction 以及一个额外的指针cleanupInfo ,该函数将在最后一个副本被销毁时被调用。

如果format 采用索引颜色格式,则图像颜色表初始为空,必须在使用图像之前通过setColorCount() 或setColorTable() 对其进行充分扩展。

与接受非 const 数据缓冲区的类似 QImage 构造函数不同,此版本绝不会更改缓冲区的内容。例如,调用QImage::bits() 将返回图像的深度拷贝,而非传递给构造函数的缓冲区。这既能保持从原始数据构建 QImage 的效率,又确保原始数据不会被更改。

QImage::QImage(uchar *data, int width, int height, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)

根据给定的width 、height 和format 构建图像,该图像使用现有的内存缓冲区data 。width 和height 必须以像素为单位指定,data 必须为32位对齐,且图像中每行数据也必须为32位对齐。

在 QImage 的整个生命周期内,以及所有未被修改或以其他方式从原始缓冲区分离的副本存在期间,该缓冲区必须保持有效。图像在销毁时不会删除该缓冲区。您可以提供一个函数指针cleanupFunction 以及一个额外指针cleanupInfo ,该函数将在最后一个副本被销毁时被调用。

如果format 采用索引色彩格式,图像色彩表初始为空,必须在使用图像之前通过setColorCount() 或setColorTable() 对其进行充分扩展。

QImage::QImage(const uchar *data, int width, int height, qsizetype bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)

使用给定的width 、height 和format 构建图像,该图像使用现有的内存缓冲区data 。width 和height 必须以像素为单位指定。bytesPerLine 指定每行的字节数(步长)。

在 QImage 的整个生命周期内,以及所有未被修改或未从原始缓冲区解耦的副本存在期间,该缓冲区必须保持有效。图像在销毁时不会删除该缓冲区。您可以提供一个函数指针cleanupFunction 以及一个额外指针cleanupInfo ,当最后一个副本被销毁时,该函数将被调用。

如果format 采用索引颜色格式,则图像颜色表初始为空,必须在使用图像之前通过setColorCount() 或setColorTable() 对其进行充分扩展。

与接受非const数据缓冲区的类似 QImage 构造函数不同,此版本绝不会更改缓冲区的内容。例如,调用QImage::bits() 将返回图像的深度拷贝,而非传递给构造函数的缓冲区。这既能保持从原始数据构建 QImage 的效率,又可确保原始数据不会被更改。

QImage::QImage(uchar *data, int width, int height, qsizetype bytesPerLine, QImage::Format format, QImageCleanupFunction cleanupFunction = nullptr, void *cleanupInfo = nullptr)

使用给定的width 、height 和format 构建图像,该图像使用现有的内存缓冲区data 。width 和height 必须以像素为单位指定。bytesPerLine 指定每行的字节数(步长)。

在 QImage 及其所有未被修改或未与原始缓冲区脱离的副本的整个生命周期内,该缓冲区必须保持有效。图像在销毁时不会删除该缓冲区。您可以提供一个函数指针cleanupFunction 以及一个额外指针cleanupInfo ,当最后一个副本被销毁时,该函数将被调用。

如果format 采用索引颜色格式,则图像颜色表初始为空,必须在使用图像之前通过setColorCount() 或setColorTable() 对其进行充分扩展。

QImage::QImage(const QImage &image)

对给定的image 进行浅拷贝。

有关浅拷贝的更多信息,请参阅《隐式数据共享》文档。

另请参阅 copy()。

[noexcept] QImage::QImage(QImage &&other)

通过“Move”操作构造一个 QImage 实例,使其指向与other 所指向的同一对象。

[virtual noexcept] QImage::~QImage()

销毁图像并清理现场。

bool QImage::allGray() const

如果图像中的所有颜色均为灰色调(即其红、绿、蓝分量相等),则返回true ;否则返回false。

请注意,对于没有颜色表的图像,此函数的执行速度较慢。

另请参阅 isGrayscale()。

void QImage::applyColorTransform(const QColorTransform &transform)

对图像中的所有像素应用颜色变换transform 。

[since 6.8] void QImage::applyColorTransform(const QColorTransform &transform, QImage::Format toFormat, Qt::ImageConversionFlags flags = Qt::AutoColor)

将颜色转换transform 应用到图像中的所有像素,并将图像格式转换为toFormat 。

指定的图像转换flags 控制在格式转换过程中图像数据的处理方式。

此函数于 Qt 6.8 中引入。

int QImage::bitPlaneCount() const

返回图像中的位平面数量。

位平面数量是指每个像素的颜色和透明度信息所占的位数。当图像格式中包含未使用的位时,该数值与深度不同(即小于深度)。

另请参阅 depth()、format() 以及Image Formats 。

uchar *QImage::bits()

返回指向第一个像素数据的指针。这等同于scanLine(0)。

请注意,QImage 采用隐式数据共享。本函数会对共享的像素数据进行深度复制,从而确保此QImage 是唯一使用当前返回值的实例。

另请参阅 scanLine()、sizeInBytes() 和constBits()。

const uchar *QImage::bits() const

请注意,QImage 使用了隐式数据共享,但该函数不会对共享的像素数据进行深度复制,因为返回的数据是 const 类型。

这是一个重载函数。

qsizetype QImage::bytesPerLine() const

返回每张图像扫描线中的字节数。

如果 `height()` 的返回值不为零,则这等同于 `sizeInBytes()` / `height()`。

另请参阅 scanLine()。

qint64 QImage::cacheKey() const

返回一个标识此QImage 对象内容的数字。不同的QImage 对象只有在引用相同内容时,才可能具有相同的键。

当图像发生更改时,该键会发生变化。

QRgb QImage::color(int i) const

返回颜色表中索引为i 的颜色。第一个颜色索引为0。

图像颜色表中的颜色以 ARGB 四元组(QRgb )的形式指定。可使用qAlpha()、qRed()、qGreen() 和qBlue() 函数获取颜色值的各分量。

另请参阅 setColor()、pixelIndex() 以及Pixel Manipulation 。

int QImage::colorCount() const

返回图像的颜色表大小。

请注意,对于 32-bpp 图像,colorCount() 返回 0,因为此类图像不使用颜色表,而是将像素值编码为 ARGB 四元组。

另请参阅 setColorCount() 和Image Information 。

QColorSpace QImage::colorSpace() const

如果定义了色彩空间,则返回图像的色彩空间。

另请参阅 setColorSpace()。

QList<QRgb> QImage::colorTable() const

返回图像颜色表中包含的颜色列表;如果图像没有颜色表,则返回一个空列表

另请参阅 setColorTable()、colorCount() 和color()。

[since 6.4] QImage QImage::colorTransformed(const QColorTransform &transform) const &

返回对图像中所有像素应用transform 进行颜色变换后的图像。

注意:如果 `transform ` 的源色彩空间与该图像的格式不兼容,则返回 `QImage` 空值。如果 `transform ` 的目标色彩空间与该图像的格式不兼容,则该图像也将被转换为兼容的格式。若需更精细地控制目标像素格式的选择,请参阅此方法的三参数重载。

该函数在 Qt 6.4 中引入。

另请参阅 applyColorTransform()。

[since 6.8] QImage QImage::colorTransformed(const QColorTransform &transform, QImage::Format toFormat, Qt::ImageConversionFlags flags = Qt::AutoColor) const &

返回对图像中所有像素应用transform 进行颜色转换后的图像,返回的图像格式为toFormat 。

指定的图像转换flags 控制着在格式转换过程中图像数据的处理方式。

注意:如果 transform 的源色彩空间与该图像的格式不兼容,或者目标色彩空间与toFormat 不兼容,则返回空的QImage 。

该函数于 Qt 6.8 中引入。

另请参阅 applyColorTransform()。

[since 6.4] QImage QImage::colorTransformed(const QColorTransform &transform) &&

返回对图像中所有像素应用transform 进行变换后的图像颜色。

这是一个重载函数。

该函数在 Qt 6.4 中引入。

另请参阅 ` applyColorTransform()`。

[since 6.8] QImage QImage::colorTransformed(const QColorTransform &transform, QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&

返回对图像中所有像素应用transform 进行颜色变换后的图像。

这是一个重载函数。

该函数在 Qt 6.8 中引入。

另请参阅 applyColorTransform()。

const uchar *QImage::constBits() const

返回指向第一个像素数据的指针。

请注意,QImage 使用了隐式数据共享,但本函数不会对共享的像素数据进行深度复制,因为返回的数据是 const 类型。

另请参阅 bits() 和constScanLine()。

const uchar *QImage::constScanLine(int i) const

返回指向索引为i 的扫描行中像素数据的指针。第一条扫描行的索引为0。

扫描行数据至少按 32 位对齐。对于 64 位格式,它遵循 64 位整数的本地对齐方式(在大多数平台上为 64 位,但在 i386 平台上为 32 位)。

请注意,QImage 使用了隐式数据共享,但本函数不会对共享的像素数据进行深度复制,因为返回的数据是 const 类型。

另请参阅 scanLine() 和constBits()。

void QImage::convertTo(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor)

将图像就地转换为指定的format ,必要时会将其分离。

指定的图像转换flags 将控制转换过程中图像数据的处理方式。

另请参阅 convertedTo()。

void QImage::convertToColorSpace(const QColorSpace &colorSpace)

将图像转换为colorSpace 。

如果图像没有有效的色彩空间,该方法将不执行任何操作。

注意:如果 colorSpace 与当前格式不兼容,则图像将被转换为兼容的格式。

另请参阅 convertedToColorSpace() 和setColorSpace()。

[since 6.8] void QImage::convertToColorSpace(const QColorSpace &colorSpace, QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor)

将图像转换为colorSpace 和format 。

如果图像没有有效的色彩空间,或者色彩空间与该格式不兼容,则该方法不执行任何操作。

指定的图像转换flags 控制在格式转换过程中如何处理图像数据。

此函数在 Qt 6.8 中引入。

另请参阅 convertedToColorSpace() 和setColorSpace()。

QImage QImage::convertToFormat(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&

QImage QImage::convertToFormat(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) const &

返回给定format 中图像的副本。

指定的图像转换flags 控制在转换过程中如何处理图像数据。

另请参阅 convertTo() 和Image Formats 。

QImage QImage::convertToFormat(QImage::Format format, const QList<QRgb> &colorTable, Qt::ImageConversionFlags flags = Qt::AutoColor) const

返回一张已转换为指定format 格式的图像副本,转换时使用指定的colorTable 。

从RGB格式转换为索引格式是一项耗时的操作,将采用简单的最近色法,不进行抖动处理。

这是一个重载函数。

[since 6.0] QImage QImage::convertedTo(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&

[since 6.0] QImage QImage::convertedTo(QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) const &

返回给定format 中的图像副本。

指定的图像转换flags 控制在转换过程中如何处理图像数据。

这些函数在 Qt 6.0 中引入。

另请参见 convertTo() 和Image Formats 。

QImage QImage::convertedToColorSpace(const QColorSpace &colorSpace) const

返回转换为colorSpace 的图像。

如果图像没有有效的色彩空间,则返回一个空的QImage 。

注意:如果 colorSpace 与当前格式不兼容,返回的图像也将被转换为与之兼容的格式。若需更精细地控制返回的图像格式,请参阅该方法的三个参数重载版本。

另请参阅 convertToColorSpace() 和colorTransformed()。

[since 6.8] QImage QImage::convertedToColorSpace(const QColorSpace &colorSpace, QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) &&

[since 6.8] QImage QImage::convertedToColorSpace(const QColorSpace &colorSpace, QImage::Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) const &

返回转换为colorSpace 和format 的图像。

如果图像没有有效的色彩空间,则返回一个空的 `QImage `。

指定的图像转换flags 控制在格式转换过程中如何处理图像数据。

这些函数在 Qt 6.8 中引入。

另请参阅 colorTransformed()。

QImage QImage::copy(const QRect &rectangle = QRect()) const

将图像的子区域作为新图像返回。

返回的图像从本图像的坐标 (rectangle.x(),rectangle.y()) 处复制而来,其尺寸始终与给定的rectangle 一致。

在该图像以外的区域,像素将被设置为 0。对于 32 位 RGB 图像,这意味着黑色;对于 32 位 ARGB 图像,这意味着透明黑色;对于 8 位图像,这意味着颜色表中索引为 0 的颜色(可以是任何颜色);对于 1 位图像,这意味着Qt::color0 。

如果给定的rectangle 是空矩形,则复制整张图像。

另请参阅 QImage()。

QImage QImage::copy(int x, int y, int width, int height) const

返回的图像是从该图像的坐标 (x,y) 处复制的,且其width 和height 始终保持不变。超出该图像范围的区域,像素值将被设为0。

这是一个重载函数。

QImage QImage::createAlphaMask(Qt::ImageConversionFlags flags = Qt::AutoColor) const

根据该图像的阿尔法缓冲区构建并返回一个 1-bpp 掩码。如果图像格式为QImage::Format_RGB32 ,则返回一个空图像。

flags 参数是Qt::ImageConversionFlags 的按位或(bitwise-OR)组合,用于控制转换过程。若将flags参数设为0,则采用所有默认选项。

返回的图像采用小端字节序(即图像格式为QImage::Format_MonoLSB ),您可以使用convertToFormat()函数将其转换为大端字节序(QImage::Format_Mono )。

另请参阅 createHeuristicMask() 和Image Transformations 。

QImage QImage::createHeuristicMask(bool clipTight = true) const

为该图像创建并返回一个 1 bpp 的启发式蒙版。

该函数的工作原理是:先从四个角中选取一种颜色,然后从所有边缘开始逐步移除该颜色的像素。四个角共同决定应被遮蔽的颜色。若出现平局(这通常意味着该函数不适用于该图像),则结果为随机值。

返回的图像采用小端字节序(即图像格式为QImage::Format_MonoLSB ),您可以使用convertToFormat() 函数将其转换为大端字节序(QImage::Format_Mono )。

如果clipTight 为真(默认值),则蒙版的大小刚好足以覆盖像素;否则,蒙版会比数据像素大。

请注意,此函数会忽略 alpha 缓冲区。

另请参阅 createAlphaMask() 和Image Transformations 。

QImage QImage::createMaskFromColor(QRgb color, Qt::MaskMode mode = Qt::MaskInColor) const

根据给定的color 值,为该图像创建并返回一个蒙版。如果mode 为MaskInColor(默认值),则所有与color 匹配的像素在蒙版中均为不透明像素。如果mode 为MaskOutColor,则所有与给定颜色匹配的像素均为透明像素。

另请参阅 createAlphaMask() 和createHeuristicMask()。

int QImage::depth() const

返回图像的色深。

图像深度是指用于存储单个像素的位数,也称为每像素位数(bpp)。

支持的深度包括 1、8、16、24、32 和 64。

另请参阅 bitPlaneCount(),convertToFormat(),Image Formats 以及Image Information 。

[since 6.2] QSizeF QImage::deviceIndependentSize() const

返回图像以设备无关像素为单位的尺寸。

在用户界面尺寸计算中使用图像尺寸时,应使用此值。

该返回值等同于 image.size() / image.devicePixelRatio()。

该函数于 Qt 6.2 中引入。

qreal QImage::devicePixelRatio() const

返回图像的设备像素比。这是设备像素与设备独立像素之间的比例。

在根据图像尺寸计算布局几何形状时,请使用此函数:QSize layoutSize = image.size() / image.devicePixelRatio()

默认值为 1.0。

另请参阅 setDevicePixelRatio() 和QImageReader 。

int QImage::dotsPerMeterX() const

返回物理米内水平方向上能容纳的像素数。该数值与dotsPerMeterY() 结合使用,共同定义了图像的预期比例尺和宽高比。

另请参阅 setDotsPerMeterX() 和Image Information 。

int QImage::dotsPerMeterY() const

返回物理米内垂直方向上能容纳的像素数。该数值与dotsPerMeterX()函数结合使用,共同定义了图像的预期比例尺和宽高比。

另请参阅 setDotsPerMeterY() 和Image Information 。

void QImage::fill(uint pixelValue)

将整个图像填充为给定的pixelValue 。

如果该图像的深度为1,则仅使用最低位。如果调用fill(0)、fill(2)等,则图像将被填充为0。 若调用 fill(1)、fill(3) 等,则图像将被填充为 1。若图像深度为 8,则使用最低 8 位;若深度为 16,则使用最低 16 位。

如果图像深度高于 32 位,结果将未定义。

注意:虽然没有 相应的值获取函数,但对于索引格式,QImage::pixelIndex() 将返回相同值;对于 RGB32、ARGB32 和 ARGB32PM 格式,QImage::pixel() 将返回相同值。

另请参阅 depth() 和Image Transformations 。

void QImage::fill(Qt::GlobalColor color)

将图像填充为给定的color ,该颜色被描述为标准全局颜色。

这是一个重载函数。

void QImage::fill(const QColor &color)

将整个图像填充为给定的color 。

如果图像的深度为1,且color 等于Qt::color1 ,则图像将被填充为1;否则将被填充为0。

如果图像的深度为 8,则当color 在颜色表中存在时,图像将被填充为颜色表中与 对应的索引;否则,将填充为 0。

这是一个重载函数。

[since 6.9] void QImage::flip(Qt::Orientations orient = Qt::Vertical)

根据orient 的设置,沿水平和/或垂直方向翻转或镜像图像。

该函数在 Qt 6.9 中引入。

另请参阅 flipped(Qt::Orientations) 和Image Transformations 。

[since 6.9] QImage QImage::flipped(Qt::Orientations orient = Qt::Vertical) &&

[since 6.9] QImage QImage::flipped(Qt::Orientations orient = Qt::Vertical) const &

返回图像的翻转或镜像版本,具体是沿水平方向还是垂直方向进行镜像,取决于orient 。

请注意,原始图像不会被修改。

这些函数是在 Qt 6.9 中引入的。

另请参阅 flip(Qt::Orientations) 和Image Transformations 。

QImage::Format QImage::format() const

返回图像的格式。

另请参阅 Image Formats 。

[static, since 6.2] QImage QImage::fromData(QByteArrayView data, const char *format = nullptr)

根据给定的QByteArrayView data 构建图像。加载器将尝试使用指定的format 读取图像。如果未指定format (这是默认情况),加载器会分析数据中的头部信息以推测文件格式。

如果指定了format ,它必须是QImageReader::supportedImageFormats()函数返回的值之一。

如果图像加载失败,返回的图像将是一个空图像。

此函数在 Qt 6.2 中引入。

另请参阅 load()、save() 和Reading and Writing Image Files 。

[static] QImage QImage::fromData(const QByteArray &data, const char *format = nullptr)

根据给定的QByteArray 和data ,构建一个QImage 。

这是一个重载函数。

[static] QImage QImage::fromData(const uchar *data, int size, const char *format = nullptr)

根据给定的二进制数据data 的前size 字节,构建一个 `QImage ` 对象。

这是一个重载函数。

[static, since 6.0] QImage QImage::fromHBITMAP(HBITMAP hbitmap)

返回一个与给定的 `hbitmap` 等效的 `QImage `。

HBITMAP 不存储有关 alpha 通道的信息。

在标准情况下,会忽略 alpha 通道,并创建一个完全不透明的图像(通常为QImage::Format_RGB32 格式)。

不过,在某些情况下会使用 alpha 通道,例如应用程序图标或系统托盘图标。在这种情况下,应针对返回的图像调用reinterpretAsFormat(QImage::Format_ARGB32) 以确保格式正确。

该函数在 Qt 6.0 中引入。

另请参阅 toHBITMAP() 和reinterpretAsFormat()。

[static, since 6.0] QImage QImage::fromHICON(HICON icon)

返回一个与给定的icon 等效的QImage 。

该函数在 Qt 6.0 中引入。

另请参阅 toHICON()。

bool QImage::hasAlphaChannel() const

如果图像的格式支持阿尔法通道,则返回true ;否则返回false 。

另请参阅 Image Information 。

int QImage::height() const

返回图像的高度。

另请参阅 Image Information 。

void QImage::invertPixels(QImage::InvertMode mode = InvertRgb)

将图像中的所有像素值进行反转。

给定的反转参数mode 仅在图像深度为32时才有意义。默认的mode 为InvertRgb ,这会保持Alpha通道不变。如果mode 为InvertRgba ,则Alpha位也会被反转。

对 8 位图像进行反转,意味着将所有使用颜色索引i的像素替换为使用颜色索引 255 减去i 的像素。对于 1 位图像也是如此。请注意,颜色表不会发生改变。

如果图像具有预乘α通道,则会先将图像转换为非预乘图像格式进行反转,然后再次转换回来。

另请参阅 Image Transformations 。

bool QImage::isGrayscale() const

对于 32 位图像,该函数等同于 `allGray()`。

对于索引色图像,如果对于颜色表的所有索引,color(i) 均为QRgb(i, i, i),则该函数返回true ;否则返回false 。

另请参阅 allGray() 和Image Formats 。

bool QImage::isNull() const

如果为空图像,则返回true ;否则返回false 。

空图像的所有参数均设置为零,且未分配任何数据。

bool QImage::load(const QString &fileName, const char *format = nullptr)

从指定fileName 的文件中加载图像。如果图像加载成功,则返回true ;否则,将图像标记为无效并返回false 。

加载器将尝试使用指定的format (例如 PNG 或 JPG)读取图像。如果未指定format (这是默认情况),则会根据文件的后缀和头部信息自动检测格式。详情请参阅QImageReader::setAutoDetectImageFormat()。

文件名可以是指磁盘上的实际文件,也可以是指应用程序的嵌入式资源之一。有关如何将图像和其他资源文件嵌入应用程序可执行文件的详细信息,请参阅“资源系统”概述。

另请参阅 Reading and Writing Image Files 。

bool QImage::load(QIODevice *device, const char *format)

该函数从指定的device 读取一个 `QImage `。例如,这可用于将图片直接加载到 `QByteArray` 中。

这是一个重载函数。

[since 6.2] bool QImage::loadFromData(QByteArrayView data, const char *format = nullptr)

从指定的QByteArrayView data 加载一张图片。如果图片加载成功,则返回true ;否则,将图片标记为无效并返回false 。

加载器将尝试使用指定的format (例如 PNG 或 JPG)读取图像。如果未指定format (这是默认情况),加载器会检查文件头以推测文件格式。

该函数在 Qt 6.2 中引入。

另请参阅 Reading and Writing Image Files 。

bool QImage::loadFromData(const QByteArray &data, const char *format = nullptr)

从指定的QByteArray data 加载一张图片。

这是一个重载函数。

bool QImage::loadFromData(const uchar *data, int len, const char *format = nullptr)

从给定的二进制文件data 的前len 字节处加载一张图像。

这是一个重载函数。

[since 6.0, until 6.13] void QImage::mirror(bool horizontal = false, bool vertical = true)

该函数计划在 6.13 版本中被废弃。

请改用 flip(Qt::Orientations)。

根据horizontal 和vertical 的设置为 true 还是 false,将沿水平和/或垂直方向对图像进行镜像翻转。

该函数在 Qt 6.0 中引入。

另请参阅 mirrored() 和Image Transformations 。

[until 6.13] QImage QImage::mirrored(bool horizontal = false, bool vertical = true) &&

[until 6.13] QImage QImage::mirrored(bool horizontal = false, bool vertical = true) const &

该函数计划在 6.13 版本中被废弃。

请改用 flipped(Qt::Orientations)。

返回图像的镜像,具体是水平方向还是垂直方向的镜像,取决于 `horizontal ` 和 `vertical ` 是否设置为 true 或 false。

请注意,原始图像不会被更改。

另请参阅 mirror() 和Image Transformations 。

QPoint QImage::offset() const

返回图像相对于其他图像定位时,计划偏移的像素数。

另请参阅 setOffset() 和Image Information 。

QRgb QImage::pixel(const QPoint &position) const

返回位于指定坐标position 处的像素颜色。

如果坐标position 无效,则结果未定义。

警告: 当用于大规模像素操作时,此 函数的开销较大。若需读取大量像素,请使用constBits() 或constScanLine()。

另请参阅 setPixel()、valid()、constBits()、constScanLine() 以及Pixel Manipulation 。

QRgb QImage::pixel(int x, int y) const

返回坐标为 (x,y) 的像素颜色。

这是一个重载函数。

QColor QImage::pixelColor(const QPoint &position) const

返回位于给定坐标position 处的像素颜色,格式为QColor 。

如果坐标position 无效,则返回一个无效的QColor 。

警告: 当用于大规模像素操作时,此函数的 开销很大。如果需要读取大量像素,请使用 `constBits()` 或 `constScanLine()`。

另请参阅 setPixelColor()、setPixel()、valid()、constBits()、constScanLine() 以及Pixel Manipulation 。

QColor QImage::pixelColor(int x, int y) const

返回坐标为 (x,y) 的像素颜色,类型为QColor 。

这是一个重载函数。

[noexcept] QPixelFormat QImage::pixelFormat() const

将QImage::Format 作为QPixelFormat

int QImage::pixelIndex(const QPoint &position) const

返回给定坐标position 处的像素索引。

如果坐标position 无效,或者图像不是调色板图像(depth() > 8),则结果未定义。

另请参见 valid()、depth() 和Pixel Manipulation 。

int QImage::pixelIndex(int x, int y) const

返回坐标为 (x,y) 的像素索引。

这是一个重载函数。

QRect QImage::rect() const

返回图像的外围矩形 (0, 0,width(),height())。

另请参阅 Image Information 。

bool QImage::reinterpretAsFormat(QImage::Format format)

将图像格式更改为format ,同时不更改数据。仅在相同深度的格式之间有效。

若操作成功,则返回true 。

若已知数据仅为不透明数据,则可使用此函数将带有Alpha通道的图像转换为对应的不透明格式;或者在用新数据覆盖给定图像缓冲区之前,先更改其格式。

警告:该 函数不会检查图像数据在新格式下是否有效,只要深度兼容,仍会返回true 。对数据无效的图像进行操作的结果未定义。

警告:如果 图像未被解绑,此操作将导致数据被复制。

另请参阅 hasAlphaChannel() 和convertToFormat()。

[since 6.0] void QImage::rgbSwap()

将所有像素的红色和蓝色分量值互换,从而将 RGB 图像转换为 BGR 图像。

该函数自 Qt 6.0 起引入。

另请参阅 rgbSwapped() 和Image Transformations 。

QImage QImage::rgbSwapped() &&

QImage QImage::rgbSwapped() const &

返回一个QImage 数组,其中所有像素的红色和蓝色分量的值已被互换,从而将RGB图像转换为BGR图像。

原始的 `QImage ` 对象不会被修改。

另请参阅 rgbSwap() 和Image Transformations 。

bool QImage::save(const QString &fileName, const char *format = nullptr, int quality = -1) const

将图像保存到指定fileName 的文件中,使用给定的图像文件format 和quality 因子。如果format 为nullptr ,QImage 将通过查看fileName 的后缀来尝试猜测文件格式。

quality 参数的取值必须在 0 到 100 之间,或为 -1。指定 0 可获得较小的压缩文件,指定 100 可获得较大的未压缩文件,指定 -1(默认值)则使用默认设置。

如果图像成功保存,则返回true ;否则返回false 。

另请参阅 Reading and Writing Image Files 。

bool QImage::save(QIODevice *device, const char *format = nullptr, int quality = -1) const

该函数将一个QImage 写入指定的device 。

例如,这可用于将图像直接保存到QByteArray 中:

QImage image;
QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "PNG"); // writes image into ba in PNG format

这是一个重载函数。

QImage QImage::scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const

返回一张图像的副本,该副本已根据给定的size ,并参照给定的aspectRatioMode 和transformMode ,缩放为矩形。

示意图展示了在“保持宽高比”模式下缩放图像的三种不同方法

  • 如果aspectRatioMode 是Qt::IgnoreAspectRatio ,则图像将按size 进行缩放。
  • 如果aspectRatioMode 为Qt::KeepAspectRatio ,则将图像缩放为size 内的最大矩形,同时保持宽高比。
  • 如果aspectRatioMode 为Qt::KeepAspectRatioByExpanding ,则图像将被缩放为size 之外尽可能小的矩形,同时保持宽高比。

如果给定的 `size ` 为空,则该函数返回一个空图像。

另请参阅 isNull() 和Image Transformations 。

QImage QImage::scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const

返回一张图像的副本,该副本根据给定的width 和height ,并参照给定的aspectRatioMode 和transformMode 进行缩放,调整为矩形。

如果width 或height 中的任意一个为零或负数,则该函数返回一个空图像。

这是一个重载函数。

QImage QImage::scaledToHeight(int height, Qt::TransformationMode mode = Qt::FastTransformation) const

返回图像的缩放副本。返回的图像将使用指定的变换mode ,按给定的height 进行缩放。

该函数会自动计算图像的宽度,以保持图像的宽高比。

如果给定的height 为0或负数,则返回一个空图像。

另请参阅 Image Transformations 。

QImage QImage::scaledToWidth(int width, Qt::TransformationMode mode = Qt::FastTransformation) const

返回图像的缩放副本。返回的图像将使用指定的变换mode ,按给定的width 进行缩放。

该函数会自动计算图像的高度,以确保其宽高比保持不变。

如果给定的width 为0或负数,则返回空图像。

另请参阅 Image Transformations 。

uchar *QImage::scanLine(int i)

返回指向索引为i 的扫描行中像素数据的指针。第一条扫描行的索引为0。

扫描行数据至少按 32 位对齐。对于 64 位格式,它遵循 64 位整数的本地对齐方式(大多数平台为 64 位,但需注意 i386 平台为 32 位)。

例如,要移除图像中每个像素的绿色分量:

for (int y = 0; y < image.height(); ++y) {
    QRgb *line = reinterpret_cast<QRgb*>(image.scanLine(y));
    for (int x = 0; x < image.width(); ++x) {
        QRgb &rgb = line[x];
        rgb = qRgba(qRed(rgb), qGreen(0), qBlue(rgb), qAlpha(rgb));
    }
}

警告:若 访问 32-bpp 图像数据,请将返回的指针强制转换为QRgb* (QRgb 的大小为 32 位),并使用该指针读写像素值。 您不能直接使用uchar* 指针,因为像素格式取决于底层平台的字节序。请使用qRed()、qGreen()、qBlue() 和qAlpha() 来访问像素。

另请参阅 bytesPerLine()、bits()、Pixel Manipulation 以及constScanLine()。

const uchar *QImage::scanLine(int i) const

这是一个重载函数。

void QImage::setAlphaChannel(const QImage &alphaChannel)

将该图像的Alpha通道设置为指定的alphaChannel 。

如果alphaChannel 是8位Alpha图像,则直接使用其Alpha值。否则,alphaChannel 将被转换为8位灰度图像,并使用像素值的亮度值。

如果图像已有Alpha通道,则将现有Alpha通道与新Alpha通道相乘。如果图像没有Alpha通道,则将其转换为具有Alpha通道的格式。

该操作类似于使用 `QPainter::CompositionMode_DestinationIn` 将 `alphaChannel ` 作为透明图像覆盖在此图像之上。

另请参阅 hasAlphaChannel()、Image Transformations 以及Image Formats 。

void QImage::setColor(int index, QRgb colorValue)

将颜色表中指定位置index 处的颜色设置为colorValue 。颜色值是一个ARGB四元组。

如果index 超出了当前颜色表的大小,则会通过setColorCount() 将其扩展。

另请参阅 color()、colorCount()、setColorTable() 以及Pixel Manipulation 。

void QImage::setColorCount(int colorCount)

将颜色表调整为包含colorCount 个条目。

如果扩展了颜色表,所有多余的颜色都将被设置为透明(即qRgba(0, 0, 0, 0))。

使用该图像时,颜色表必须足够大,以容纳图像中所有像素/索引值的条目,否则结果未定义。

另请参阅 colorCount()、colorTable()、setColor() 以及Image Transformations 。

void QImage::setColorSpace(const QColorSpace &colorSpace)

将图像色彩空间设置为colorSpace ,且不对图像数据进行任何转换。

另请参阅 colorSpace()。

void QImage::setColorTable(const QList<QRgb> &colors)

将用于将颜色索引转换为QRgb 值的颜色表设置为指定的colors 。

使用该图像时,颜色表的大小必须足够大,以包含图像中所有像素/索引值的条目,否则结果未定义。

另请参阅 colorTable()、setColor() 和Image Transformations 。

void QImage::setDevicePixelRatio(qreal scaleFactor)

设置图像的设备像素比。这是图像像素与设备独立像素之间的比例。

默认的设备像素比(scaleFactor )为 1.0。将其设置为其他值会产生以下两个影响:

在图像上打开的 QPainters 将被缩放。例如,如果在比例为 2.0 的情况下对 200x200 的图像进行绘制,则实际(与设备无关的)绘制边界将为 100x100。

Qt 中基于图像尺寸计算布局几何形状的代码路径会将该比例纳入考量:QSize layoutSize = image.size() / image.devicePixelRatio() 这带来的最终效果是,图像将作为高DPI图像显示,而非大尺寸图像(参见Drawing High Resolution Versions of Pixmaps and Images )。

另请参阅 devicePixelRatio() 和deviceIndependentSize()。

void QImage::setDotsPerMeterX(int x)

将物理米内水平方向能容纳的像素数设置为x 。

该数值与dotsPerMeterY()配合使用,共同定义了图像的预期比例和宽高比,并决定了QPainter 在图像上绘制图形时的缩放比例。当图像在其他绘制设备上渲染时,此设置不会改变其比例或宽高比。

另请参阅 dotsPerMeterX() 和Image Information 。

void QImage::setDotsPerMeterY(int y)

将物理米内垂直方向上能容纳的像素数设置为y 。

该数值与 `dotsPerMeterX()` 配合使用,共同定义了图像的预期缩放比例和宽高比,并决定了 `QPainter ` 在图像上绘制图形时的缩放比例。当图像在其他绘制设备上渲染时,此设置不会改变其缩放比例或宽高比。

另请参阅 dotsPerMeterY() 和Image Information 。

void QImage::setOffset(const QPoint &offset)

将图像相对于其他图像定位时的偏移像素数设置为offset 。

另请参阅 offset() 和Image Information 。

void QImage::setPixel(const QPoint &position, uint index_or_rgb)

将指定坐标position 处的像素索引或颜色设置为index_or_rgb 。

如果图像格式为单色或调色板模式,则给定的index_or_rgb 值必须是图像颜色表中的索引;否则,该参数必须为QRgb 值。

如果position 不是图像中的有效坐标对,或者在单色和调色板图像的情况下index_or_rgb >=colorCount(),则结果未定义。

警告: 由于该函数 内部调用了detach() 函数,因此计算成本较高;如果性能是主要考虑因素,建议使用scanLine() 或bits() 直接访问像素数据。

另请参阅 pixel() 和Pixel Manipulation 。

void QImage::setPixel(int x, int y, uint index_or_rgb)

将坐标为 (x,y) 的像素索引或颜色设置为index_or_rgb 。

这是一个重载函数。

void QImage::setPixelColor(const QPoint &position, const QColor &color)

将指定坐标position 处的颜色设置为color 。

如果position 不是图像中的有效坐标对,或者图像格式为单色或调色板图像,则结果未定义。

警告: 由于此函数 内部调用了detach() 函数,因此计算成本较高;如果关注性能,建议使用scanLine()或bits()直接访问像素数据。

另请参阅 pixelColor()、pixel()、bits()、scanLine() 以及Pixel Manipulation 。

void QImage::setPixelColor(int x, int y, const QColor &color)

将坐标为 (x,y) 的像素颜色设置为color 。

这是一个重载函数。

void QImage::setText(const QString &key, const QString &text)

将图像文本设置为给定的text ,并将其与给定的key 关联起来。

如果您只想存储一个文本块(即“注释”或仅为描述),可以传入一个空键,或者使用“Description”这样的通用键。

当您调用save()或QImageWriter::write()时,图像文本会被嵌入到图像数据中。

并非所有图像格式都支持嵌入文本。你可以通过调用QImageWriter::supportsOption()来判断特定图像或格式是否支持嵌入文本。以下是一个示例:

    QImageWriter writer;
    writer.setFormat("png");
    if(writer.supportsOption(QImageIOHandler::Description))
        qDebug() << "Png supports embedded text";

您可以使用QImageWriter::supportedImageFormats() 来查看可用的图像格式。

另请参阅 text() 和textKeys()。

QSize QImage::size() const

返回图像的大小,即其width()和height()的值。

另请参阅 Image Information 和deviceIndependentSize()。

qsizetype QImage::sizeInBytes() const

返回图像数据的大小(以字节为单位)。

另请参阅 bytesPerLine()、bits() 以及Image Information 。

[noexcept] void QImage::swap(QImage &other)

将此图片与other 互换。此操作非常快,且从不会失败。

QString QImage::text(const QString &key = QString()) const

返回与给定的key 关联的图像文本。如果指定的key 为空字符串,则返回整个图像文本,其中每个键-值对由换行符分隔。

另请参阅 setText() 和textKeys()。

QStringList QImage::textKeys() const

返回该图片的文本键。

您可以将这些键与 `text()` 函数配合使用,以列出特定键对应的图像文本。

另请参阅 text()。

CGImageRef QImage::toCGImage() const

创建一个等同于此QImage 的CGImage ,并返回一个CGImageRef 句柄。

返回的 CGImageRef 参与QImage 的隐式共享,并持有对QImage 数据的引用。CGImage 是不可变的,且永远不会与QImage 分离。向QImage 写入数据时,将按常规方式与之分离。

该函数执行速度快,且不会复制或转换图像数据。

如果图像格式无法转换,将返回一个空的 CGImageRef。此时,该函数的用户可以先将QImage 转换为受支持的格式,例如Format_ARGB32_Premultiplied 。

如果图像未设置色彩空间,则生成的 CGImageRef 色彩空间将设置为 sRGB 色彩空间。

[since 6.0] HBITMAP QImage::toHBITMAP() const

创建一个与QImage 等效的HBITMAP 对象。

返回HBITMAP 句柄。

使用后释放HBITMAP 数据是调用者的责任。

若要与标准 GDI 调用(例如BitBlt() )一起使用,图像应采用QImage::Format_RGB32 格式。

当将生成的 HBITMAP 用于AlphaBlend() GDI 函数时,图像应采用QImage::Format_ARGB32_Premultiplied 格式(使用convertToFormat())。

当将生成的 HBITMAP 用作应用程序图标或系统托盘图标时,图像应采用QImage::Format_ARGB32 格式。

该函数在 Qt 6.0 中引入。

另请参阅 fromHBITMAP() 和convertToFormat()。

[since 6.0] HICON QImage::toHICON(const QImage &mask = {}) const

创建一个与QPixmap 等效的HICON 对象,并应用掩码mask 。

如果mask 不为空,则其格式必须为QImage::Format_Mono 。返回HICON 句柄。

使用后释放HICON 数据是调用者的责任。

该函数在 Qt 6.0 中引入。

另请参阅 fromHICON()。

[static noexcept] QImage::Format QImage::toImageFormat(QPixelFormat format)

将format 转换为一个QImage::Format

[static noexcept] QPixelFormat QImage::toPixelFormat(QImage::Format format)

将format 转换为一个QPixelFormat

QImage QImage::transformed(const QTransform &matrix, Qt::TransformationMode mode = Qt::FastTransformation) const

返回一张图像的副本,该副本已使用给定的变换matrix 和变换mode 进行变换。

返回的图像通常与原始图像具有相同的 {图像格式}{格式}。 但是,复杂的变换可能会导致生成的图像中,并非所有像素都由原始图像的变换像素覆盖。在这种情况下,这些背景像素将被赋予透明颜色值,并且变换后的图像将被赋予带 alpha 通道的格式,即使原始图像本身没有该通道。

matrix 变换会在内部进行调整,以补偿不需要的平移;即生成的图像将是包含原始图像所有变换点的最小图像。使用trueMatrix() 函数可获取用于图像变换的实际矩阵。

与其他重载版本不同,该函数可用于对图像执行透视变换。

另请参见 trueMatrix() 和Image Transformations 。

[static] QTransform QImage::trueMatrix(const QTransform &matrix, int width, int height)

返回用于对图像进行变换的实际矩阵,该变换由给定的width 、height 和matrix 定义。

使用transformed()函数对图像进行变换时,系统会内部调整变换矩阵以补偿不需要的平移,即transformed()返回包含原始图像所有变换点且面积最小的图像。本函数返回经过修改的矩阵,该矩阵能将原始图像中的点正确映射到新图像中。

与其他重载不同,该函数生成的变换矩阵可用于对图像执行透视变换。

另请参阅 transformed() 和Image Transformations 。

bool QImage::valid(const QPoint &pos) const

如果pos 是图像内的有效坐标对,则返回true ;否则返回false 。

另请参阅 rect() 和QRect::contains()。

bool QImage::valid(int x, int y) const

如果QPoint (x ,y )是图像内的有效坐标对,则返回true ;否则返回false 。

这是一个重载函数。

int QImage::width() const

返回图像的宽度。

另请参阅 Image Information 。

QImage::operator QVariant() const

将图像作为QVariant 返回。

bool QImage::operator!=(const QImage &image) const

如果该图像与给定的image 内容不同,则返回true ;否则返回false 。

该比较可能较慢,除非存在明显差异(例如宽度不同),在这种情况下该函数将快速返回结果。

另请参阅 operator=()。

[noexcept] QImage &QImage::operator=(QImage &&other)

将other 分配给此QImage 实例。

QImage &QImage::operator=(const QImage &image)

将给定image 的浅拷贝分配给此图像,并返回对此图像的引用。

有关浅拷贝的更多信息,请参阅《隐式数据共享》文档。

另请参阅 copy()和QImage()。

bool QImage::operator==(const QImage &image) const

如果该图像与给定的image 内容相同,则返回true ;否则返回false 。

该比较可能比较耗时,除非存在明显差异(例如尺寸或格式不同),这种情况下函数将快速返回结果。

另请参阅 operator=()。

相关的非成员函数

QImageCleanupFunction

一个具有以下签名的函数,可用于实现基本的图像内存管理:

void myImageCleanupHandler(void *info);

QDataStream &operator<<(QDataStream &stream, const QImage &image)

将给定的image 作为PNG图像写入给定的stream ;如果流的版本为1,则作为BMP图像写入。请注意,将流写入文件不会生成有效的图像文件。

另请参阅 QImage::save() 以及《Qt 数据类型的序列化》。

QDataStream &operator>>(QDataStream &stream, QImage &image)

从指定的stream 读取图像,并将其存储到指定的image 中。

另请参阅 QImage::load() 以及《Qt 数据类型的序列化》。

© 2026 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.