QImage

QImage详解

默认支持的图像格式:
BMP ,GIF , JPG , JPEG, PNG, PBM, PGM, PPM, XBM, XPM
 

QImage(const QSize &size, Format format)使用给定的大小和格式构造图像
QImage(int width, int height, Format format)使用给定的大小和格式构造图像
QImage(uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR)
QImage(const uchar *data, int width, int height, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR)
QImage(uchar *data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR)
QImage(const uchar *data, int width, int height, int bytesPerLine, Format format, QImageCleanupFunction cleanupFunction = Q_NULLPTR, void *cleanupInfo = Q_NULLPTR)
用给定的宽度、高度和格式构造图像,使用一个已有的内存缓冲区、数据。宽度和高度必须指定像素,数据必须是32位对齐,每个扫描线的图像数据中也必须是32位对齐。
QImage(const char * const[] xpm)从给定的xpm图像构造图像
QImage(const QString &fileName, const char *format = Q_NULLPTR)从给定的文件名加载图像
bool allGray() const如果图像中的所有颜色都是灰色(即它们的红色、绿色和蓝色分量相等),则返回 true; 否则为假。
请注意,对于没有颜色表的图像,此功能很慢。
int bitPlaneCount() const返回图像中位平面的数量。
位平面数是每个像素的颜色和透明度信息的位数。 这与(即小于)图像格式包含未使用位时的深度不同。
uchar *bits()返回指向第一个像素数据的指针。 这等效于 scanLine(0)。
请注意,QImage 使用隐式数据共享。 该函数执行共享像素数据的深度复制,从而确保此 QImage 是唯一使用当前返回值的。
const uchar *bits() const获取图像首地址,不进行深度拷贝
int byteCount() const返回图像数据占用的字节数。
请注意,永远不应在大于 2 GB 的图像上调用此方法。 而是使用 sizeInBytes()
int bytesPerLine() const返回每个图像扫描线的字节数。
如果 height() 非零,则这等效于 sizeInBytes() / height()。
qint64 cacheKey() const返回标识此 QImage 对象内容的Key。 如果不同的 QImage 对象引用相同的内容,则它们具有相同的Key
更改图像时,Key将更改。
QRgb color(int i) const返回颜色表中索引 i 处的颜色。 第一种颜色位于索引 0 处。
图像颜色表中的颜色指定为 ARGB 四元组 (QRgb)。 使用 qAlpha()、qRed()、qGreen() 和 qBlue() 函数来获取颜色值分量。
int colorCount() const返回图像颜色表的大小。
请注意,对于 32-bpp 图像,colorCount() 返回 0,因为这些图像不使用颜色表,而是将像素值编码为 ARGB 四元组。
QVector<QRgb> colorTable() const返回图像在颜色表中包含的颜色的列表
const uchar *constBits() const返回像素首地址,该函数不进行深度拷贝
const uchar *constScanLine(int i) const返回从I开始的指向扫描线的指针
QImage convertToFormat(Format format, Qt::ImageConversionFlags flags = Qt::AutoColor) const
QImage convertToFormat(Format format, const QVector<QRgb> &colorTable, Qt::ImageConversionFlags flags = Qt::AutoColor) const

使用指定的颜色表返回转换为给定格式的图像副本。

从RGB格式到索引格式的转换是一个缓慢的操作

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从此图像中的 alpha 缓冲区构建并返回一个 1-bpp 掩码。 如果图像的格式为 QImage::Format_RGB32,则返回空图像。
QImage createHeuristicMask(bool clipTight = true) const

创建并返回此像素图的启发式蒙版。该功能的工作原理是从任一角中选择一种颜色,然后从所有边缘开始切去该颜色的像素。 如果clipTight为true(默认值),则遮罩足够大以覆盖像素; 否则,掩码大于数据像素。

QImage createMaskFromColor(QRgb color, Qt::MaskMode mode = Qt::MaskInColor) const根据给定的颜色值创建并返回此图像的蒙版。 如果模式为 MaskInColor(默认值),则所有匹配颜色的像素都将是遮罩中的不透明像素。 如果 mode 为 MaskOutColor,则匹配给定颜色的所有像素都将是透明的。
int depth() const返回图像的深度。
图像深度是用于存储单个像素的位数,也称为每像素位数 (bpp)。
支持的深度为 1、8、16、24 和 32。
qreal devicePixelRatio() const返回图像的设备像素比。 这是设备像素和设备独立像素之间的比率。
根据图像大小计算布局几何时使用此函数: QSize layoutSize = image.size() / image.devicePixelRatio()
默认值为 1.0。
int dotsPerMeterX() const返回在物理仪表中水平放置的像素数。 该数字与 dotsPerMeterY() 一起定义了图像的预期比例和纵横比。
int dotsPerMeterY() const返回物理仪表中垂直匹配的像素数。此数字与dotsPerMeterX()一起定义图像的预期比例和纵横比。
void fill(uint pixelValue)
void fill(const QColor &color)
void fill(Qt::GlobalColor color)
以给定的颜色填充整个图像
Format format() const返回图像格式
bool hasAlphaChannel() const

如果图像的格式符合alpha通道,则返回true,否则返回false。

int height() const图像高度
void invertPixels(InvertMode mode = InvertRgb)

反转图像中的所有像素值。

给定的反转模式只有在图像深度为32时才有意义。默认模式为反转RGB,保持alpha通道不变。如果模式为InvertRgba,则alpha位也会反转。

反转8位图像意味着将使用颜色索引i的所有像素替换为使用颜色索引255减去i的像素。1位图像也是如此。请注意,颜色表没有更改。

bool isGrayscale() const

对于32位图像,此函数等效于allGray()

对于颜色索引图像,如果颜色表的所有索引的color(i)是QRgb(i,i,i),则返回true,否则返回false

bool isNull() const图像是否为空
bool load(const QString &fileName, const char *format = Q_NULLPTR)
bool load(QIODevice *device, const char *format)
加载图像
bool loadFromData(const uchar *data, int len, const char *format = Q_NULLPTR)
bool loadFromData(const QByteArray &data, const char *format = Q_NULLPTR)
使用二进制创建图像
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
返回指定坐标像素的RGB
QColor pixelColor(const QPoint &position) const
QColor pixelColor(int x, int y) const
返回指定坐标像素的Color
QPixelFormat pixelFormat() const返回像素格式
int pixelIndex(const QPoint &position) const
int pixelIndex(int x, int y) const
返回给定位置的像素索引
QRect rect() const返回图像矩形
QImage rgbSwapped() const红色和蓝色交换,返回交换后的图像
bool save(const QString &fileName, const char *format = Q_NULLPTR, int quality = -1) const
bool save(QIODevice *device, const char *format = Q_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

返回缩放后的图像

Qt::IgnoreAspectRatio 忽略纵横比,拉伸到指定大小

Qt::KeepAspectRatio 保持纵横比,宽度与矩形对齐

Qt::KeepAspectRatioByExpanding 保持纵横比,高度与矩形对齐

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
 
返回扫描线,第一条扫描线在索引0
void setColor(int index, QRgb colorValue)在给定的索引设置颜色
void setColorCount(int colorCount)扩展颜色表的颜色数目
void setColorTable(const QVector<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)

图像文本设置为给定的文本,并将其与给定的键相关联。

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

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

QSize size() const返回图像大小
void swap(QImage &other)图像互换,该函数比较快
QString text(const QString &key = QString()) const返回与给定键关联的图像文本。如果指定的键是空字符串,则返回整个图像文本,每个键文本对用换行符分隔。
QStringList textKeys() const返回此图像的文本键。
您可以将这些键与 text() 一起使用来列出某个键的图像文本。
QImage transformed(const QMatrix &matrix, Qt::TransformationMode mode = Qt::FastTransformation) 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
如果该坐标有效,返回true
int width() const图像宽度

 

Static Public Members

QImage fromData(const uchar *data, int size, const char *format = Q_NULLPTR)

QImage fromData(const QByteArray &data, const char *format = Q_NULLPTR)

从给定二进制数据的第一个 size 字节构造一个 QImage 。 加载器尝试使用指定的格式读取图像。 如果没有指定格式(这是默认设置),加载器会探测头文件的数据来猜测文件格式。
如果指定了格式,它必须是 QImageReader::supportedImageFormats() 返回的值之一。
如果图片加载失败,返回的图片将为空图片。
QImage::Format toImageFormat(QPixelFormat format)转换格式到QImage::Format
QPixelFormat toPixelFormat(QImage::Format format)转换格式到QPixelFormat 
QMatrix trueMatrix(const QMatrix &matrix, int width, int height)
 
返回用于转换具有给定宽度、高度和矩阵的图像的实际矩阵。
当使用transformed() 函数变换图像时,变换矩阵在内部进行调整以补偿不需要的平移,即transformed() 返回包含原始图像所有变换点的最小图像。 此函数返回修改后的矩阵,该矩阵将点从原始图像正确映射到新图像。
QTransform trueMatrix(const QTransform &matrix, int width, int height)返回用于转换具有给定宽度、高度和矩阵的图像的实际矩阵。
当使用transformed() 函数变换图像时,变换矩阵在内部进行调整以补偿不需要的平移,即transformed() 返回包含原始图像所有变换点的最小图像。 此函数返回修改后的矩阵,该矩阵将点从原始图像正确映射到新图像。
与其他重载不同,此函数创建可用于对图像执行透视变换的变换矩阵。
QImage smoothScaled(int w, int h) const返回平滑缩放的图像副本。 返回的图像大小为宽 w  高 h 像素


 

QImage::Format
QImage::Format_Invalid图像无效
QImage::Format_Mono存储使用1位每像素的图像,字节填充最重要位第一
QImage::Format_MonoLSB存储使用1位每像素的图像,字节填充不显著位第一
QImage::Format_Indexed8图像存储使用8位指标转化成Colormap
QImage::Format_RGB32存储使用32位RGB格式的图像(0xffrrggbb)
QImage::Format_ARGB32存储使用32为ARGB格式的图像(0xaarrggbb)
QImage::Format_ARGB32_Premultiplied图像存储使用一个自左乘32位ARGB格式
QImage::Format_RGB16图像存储使用5-6-5 16位RGB格式
QImage::Format_ARGB8565_Premultiplied图像存储使用一个自左乘24位ARGB格式8-5-6-5
QImage::Format_RGB666图像存储使用6-6-6 24位RGB格式,未使用的最重要的位总是为零
QImage::Format_ARGB6666_Premultiplied图像存储使用一个自左乘24位ARGB格式6-6-6-6
QImage::Format_RGB555图像存储使用16位RGB格式(5-5-5),位置用的最重要的始终为零
QImage::Format_ARGB8555_Premultiplied图像存储使用一个自左乘24位ARGB格式8-5-5-5
QImage::Format_RGB888图像存储使用8-8-8 24位RGB格式
QImage::Format_RGB444图像存储使用16位RGB格式(4-4-4)未使用的位始终为零
QImage::Format_ARGB4444_Premultiplied图像存储使用一个自左乘16位ARGB格式4-4-4-4
QImage::Format_RGBX8888图像存储使用32位字节命令RGB(x)格式8-8-8-8
QImage::Format_RGBA8888存储使用32位字节命令RGBA格式(8-8-8-8)的的图像
QImage::Format_RGBA8888_Premultiplied图像存储使用一个自左乘32位字节命令RGBA格式8-8-8-8
QImage::Format_BGR30存储使用32位BGR格式(x-10-10-10)的的图像
QImage::Format_A2BGR30_Premultiplied图像存储使用32位自左乘abgr格式2-10-10-10
QImage::Format_RGB30存储使用32位RGB格式(x-10-10-10)的的图像
QImage::Format_A2RGB30_Premultiplied图像存储使用2-10-10-10 32位自左乘ARGB格式
QImage::Format_Alpha8该图像是使用一个8位的阿尔法格式存储
QImage::Format_Grayscale8图像是使用一个8位灰度格式存储
QImage::InvertMode
QImage::InvertRgb仅反转 RGB 值并保持 Alpha 通道不变。
QImage::InvertRgba反转所有通道,包括 Alpha 通道。
<think>首先,用户的问题是:“我想了解QImage的通道数相关信息,可能是查询QImage支持的通道数或者如何获取图像的通道数。请问QImage通道数获取或支持情况”用户提到了站内引用,我需要参考这些引用。但系统指令说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。”然而,这个对话似乎是新的,我没有看到用户上一次的问题。系统指令包括一个示例,但用户的问题是独立的。回顾用户的消息:-用户提供了三个引用:[^1],[^2],[^3]-这些引用是关于QImage的构造、转换和区别的。-用户现在想了解QImage的通道数相关信息,包括支持的通道数或如何获取通道数。我需要在回答中遵循系统级指令:1.所有行内数学表达式使用$...$格式。但在这个上下文中,可能与数学无关,因为QImage是编程相关的,所以可能不需要数学表达式。2.独立公式必须使用$$...$$。同样,可能不适用。3.LaTeX语法正确。确保如果有LaTeX,要正确。4.使用中文回答。回答必须用中文。5.生成相关问题。指令6是“生成相关问题”,应该在回答末尾添加相关问题。6.回答中引用的段落末尾自然地添加引用标识,例如[^1]。我应该使用用户提供的引用来支持回答,但指令说:“上述引用仅供参考”,所以我需要基于这些引用来回答,但要参考用户的真正需求。用户说:“上述引用仅供参考,并不是用户真正的需求”,意思是这些引用是用来提供上下文的,但用户的核心问题是关于QImage的通道数。现在,从用户的引用来分析:-引用[^1]:描述QImage构造函数,使用uchar*data等参数。-引用[^2]:关于QImage与cv::Mat转换的函数代码。代码展示了根据OpenCVMat的类型创建QImage,考虑了不同的通道数:CV_8UC4(4通道),CV_8UC3(3通道),CV_8UC1(1通道)。这暗示了QImage支持不同数量的通道。-引用[^3]:讨论QImage的图像数据存储,特别是单通道图像(灰度图)。它解释了QImage如何存储单通道像素数据。所以,从引用[^2]中,我可以推断QImage支持单通道、3通道和4通道格式。用户的具体问题是:如何获取QImage的通道数,或者QImage支持的通道数情况。我需要回答:-QImage支持的通道数:QImage有不同的格式(Format),每个格式指定了通道数。例如:-`Format_Indexed8`:通常是8位索引颜色,相当于单通道。-`Format_Grayscale8`:灰度图,单通道。-`Format_RGB888`:RGB,3通道。-`Format_RGB32`:通常是RGBA,4通道(但可能是忽略alpha的RGB,取决于平台)。格式列表在Qt文档中。在回答中,我应该基于引用来支持。如何获取通道数:在QImage中,没有直接的函数返回通道数。但您可以通过`format()`方法获取图像的格式,然后根据格式推断通道数。从引用[^2]中,函数根据mat.type()选择不同的QImage格式,这对应了通道数。类似地,引用[^3]讨论了单通道图像的存储。结构回答:-用中文回答。-结构清晰:先解释QImage支持的通道数,然后如何获取。-末尾生成相关问题。添加引用:在相关段落末尾添加[^1],[^2],[^3]作为参考。现在,回答问题:1.**QImage支持的通道数**:QImage支持多种图像格式,每个格式有不同的通道数。常见格式包括:-单通道:如`QImage::Format_Grayscale8`(灰度图)和`QImage::Format_Indexed8`(8位索引颜色)。-三通道:如`QImage::Format_RGB888`。-四通道:如`QImage::Format_RGB32`或`QImage::Format_RGBA8888`(取决于Qt版本)。更多格式参考Qt文档。从引用[^2],QImage可以与CV_8UC1、CV_8UC3、CV_8UC4的OpenCVMat互转,表明支持1、3、4通道。引用[^3]详细描述了单通道图像的存储[^3]。2.**如何获取QImage的通道数**:QImage对象本身没有直接的函数返回通道数。但您可以通过图像的format()方法查询其格式,然后根据格式确定通道数。-例如:-如果`image.format()==QImage::Format_Grayscale8`,则通道数为1。-如果`image.format()==QImage::Format_RGB888`,则通道数为3。-等等。您可以编写一个辅助函数来获取通道数。从引用[^2],转换函数中根据格式选择了不同的QImage构造[^2]。最后,生成相关问题。可能的回答结构:-简述QImage支持的通道数。-解释如何获取通道数。-示例代码(可选,因为引用中有)。-结束时添加相关问题。确保回答真实可靠。基于Qt知识。Qt中,一些关键点:-`Format_Grayscale8`:1通道灰度。-`Format_RGB888`:3通道RGB。-`Format_RGB32`:4字节(RGBA,但alpha可能被忽略),通道数4。在代码中使用时,可以通过format()查询。相关问题:-QImage通道数相关问题。例如:-如何判断QImage的通道数?-QImage支持哪些图像格式的通道数?-如何修改QImage的通道数?(但可能不适合)指令说:“生成相关问题”,所以在末尾添加如示例:§§相关问题§§1....2....现在,写出回答。</think> ### QImage通道数相关信息 QImageQt框架中的图像处理类,它支持多种图像格式,每个格式对应不同的通道数(即颜色分量数)。常见的通道数为1、3或4通道,具体取决于图像的格式(Format)。获取QImage的通道数通常不直接提供函数,但可以通过查询图像的格式(`format()`方法)间接推断。以下是详细解释和获取方法,基于您的引用内容。 #### 1. QImage支持的通道数情况 QImage支持的图像格式决定了其通道数。从引用[^2]中可以看出,QImage可以处理OpenCV的Mat转换,支持不同类型的通道配置: - **单通道(1通道)**:通常用于灰度图,格式如 `QImage::Format_Grayscale8`(8位灰度)或 `QImage::Format_Indexed8`(8位索引颜色)。引用[^3]详细描述了单通道图像的存储方式:数据按行优先顺序排列,像素值从0到255[^3]。 - **三通道(3通道)**:用于RGB彩色图像,格式如 `QImage::Format_RGB888`。 - **四通道(4通道)**:用于RGBA图像(RGB加Alpha透明度),格式如 `QImage::Format_RGB32` 或 `QImage::Format_RGBA8888`。 支持的通道数完整列表依赖于Qt版本,但常见格式包括: - 1通道:`Format_Grayscale8`, `Format_Indexed8` - 3通道:`Format_RGB888`, `Format_BGR888`(某些Qt版本) - 4通道:`Format_RGB32`, `Format_ARGB32` Qt官方文档(不在引用中,但作为背景)确认格式决定了通道数,例如 `Format_RGB888` 表示三通道RGB,每个通道8位[^1]。转换函数如引用[^2]所示,它根据cv::Mat的类型(如CV_8UC1、CV_8UC3或CV_8UC4)创建相应的QImage格式[^2]。 #### 2. 如何获取QImage的通道数 QImage对象没有直接的函数(如`channels()`)返回通道数,因为通道数由格式隐含定义。您可以通过以下步骤获取: 1. 使用`format()`方法查询图像的格式。 2. 基于格式推断通道数。推荐编写一个辅助函数来处理,以提高代码可读性。 示例代码如下(结合引用[^2]和[^3]的思路): ```cpp #include <QImage> #include <QDebug> // 辅助函数:获取QImage的通道数 int getChannelCount(const QImage& image) { switch(image.format()) { case QImage::Format_Grayscale8: case QImage::Format_Indexed8: return 1; // 单通道(灰度) case QImage::Format_RGB888: return 3; // 三通道(RGB) case QImage::Format_RGB32: case QImage::Format_ARGB32: return 4; // 四通道(RGBA) default: // 其他格式需扩展 qDebug() << "Unsupported format: " << image.format(); return -1; // 表示未知格式 } } int main() { // 示例:创建一个单通道灰度图像 QImage grayImage(100, 100, QImage::Format_Grayscale8); // 设置像素值(单通道操作) for (int y = 0; y < grayImage.height(); ++y) { uchar* scanLine = grayImage.scanLine(y); for (int x = 0; x < grayImage.width(); ++x) { scanLine[x] = (uchar)((x + y) % 256); // 模拟灰度值 } } // 获取通道数 int channels = getChannelCount(grayImage); qDebug() << "Channel count for grayImage: " << channels; // 输出: Channel count for grayImage: 1 return 0; } ``` 在这个例子中: - `scanLine` 方法允许访问像素数据(行优先存储),但通道数直接从格式推断。 - 代码基于引用[^3]的单通道示例和引用[^2]的转换逻辑[^2][^3]。 - 注意:如果图像格式不受支持(如某些专有格式),则通道数可能无法精确获取;Qt的 `format()` 方法返回一个 `QImage::Format` 枚举值,您需确保处理所有相关格式。 #### 最佳实践和注意事项 - **性能**:直接在转换时确定格式更高效,如引用[^2]中的cvMat2QImage函数[^2]。 - **可靠性**:Qt图像的格式必须在创建时指定(如构造函数或转换函数)。如果您加载外部图像(如JPEG),Qt会自动选择兼容格式。 - **局限性**:某些格式(如 `Format_Mono`)可能只有2色而非传统通道;但通道数原则适用。 ### 相关问题 1. 如何更改QImage的通道数(例如从RGB转换为灰度)? 2. QImage在不同格式下的内存占用有何差异? 3. 如何处理QImage的Alpha通道(透明度)?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值