详细描述
QImage类提供独立于硬件的图像表示,允许直接访问像素数据,并可用作绘制设备。
Qt提供了四个用于处理图像数据的类:QImage、QPixmap、QBitmap和QPicture。QImage针对I/O、直接像素访问和操作进行了设计和优化,而QPixmap针对在屏幕上显示图像进行了设计和优化。QBitmap只是一个继承QPixmap的方便类,确保深度为1。最后,QPicture类是一个绘画设备,用于记录和重放QPaint命令。
由于QImage是QPaintDevice子类,QPainter可用于直接绘制图像。在QImage上使用QPaint时,可以在当前GUI线程之外的其他线程中执行绘制。相当于QImage使用不需要启动GUI线程,但是QPixmap需要启动GUI线程.
报错代码:
#include <QCoreApplication>
#include <QPixmap>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QPixmap b;b.load("/home/arv000/Desktop/2222.png");return a.exec();
}
报错信息: 因为QPixmap需要GUI线程中运行.
QPlatformPixmap: QGuiApplication required
[1] 2864 abort ./test
一下代码不报错
#include <QCoreApplication>
#include <QImage>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QImage b;b.load("/home/arv000/Desktop/2222.png");return a.exec();
}
QImage类支持格式枚举描述的几种图像格式。这些包括单色、8位、32位和alpha混合图像,这些图像在Qt4的所有版本中都可用。
QImage提供了一组函数,可用于获取有关图像的各种信息。还有几个功能可以实现图像的变换。
由于QImage类使用隐式数据共享,因此可以通过值传递QImage对象。QImage对象也可以流化和比较。
警告:不支持使用格式QImage::format_Indexed8在QImage上绘制。
读写QImage文件
QImage提供了几种加载图像文件的方法:可以在构造QImage对象时加载该文件,也可以稍后使用load()或loadFromData()函数加载该文件。
QImage还提供了静态fromData()函数,从给定数据构造一个QImage。加载映像时,文件名可以指磁盘上的实际文件,也可以指应用程序的嵌入式资源之一。有关如何在应用程序的可执行文件中嵌入图像和其他资源文件的详细信息,请参阅Qt资源系统概述。
只需调用save()函数来保存一个QImage对象。
支持的文件格式的完整列表可通过QImageReader::SupporteImage_formats()和QImageWriter::SupporteImage_formats()函数获得。新的文件格式可以作为插件添加。默认情况下,Qt支持以下格式:
Format | Description | Qt's support |
BMP | Windows Bitmap | Read/write |
GIF | Graphic Interchange Format (optional) | Read |
JPG | Joint Photographic Experts Group | Read/write |
JPEG | Joint Photographic Experts Group | Read/write |
PNG | Portable Network Graphics | Read/write |
PBM | Portable Bitmap | Read |
PGM | Portable Graymap | Read |
PPM | Portable Pixmap | Read/write |
XBM | X11 Bitmap | Read/write |
XPM | X11 Pixmap | Read/write |
像素操作
用于操纵图像像素的函数取决于图像格式。原因是单色和8位图像基于索引,使用颜色查找表,而32位图像直接存储ARGB值。有关图像格式的详细信息,请参见“图像格式”部分。
对于32位图像,可以使用setPixel()函数将给定坐标处的像素颜色更改为指定为ARGB四元体的任何其他颜色。要生成合适的QRgb值,请使用QRgb()或qRgba()函数(将默认alpha组件添加到给定的RGB值,即创建不透明颜色)。例如:
32-bit
对于8位和monchrome图像,像素值只是图像颜色表中的索引。因此,setPixel()函数只能用于将给定坐标下的像素颜色更改为图像颜色表中的预定义颜色,即它只能更改像素的索引值。要更改或向图像的颜色表添加颜色,请使用setColor()函数。
色表中的一个条目是编码为QRgb值的ARGB四元组。使用qRgb()和qRgba()函数生成一个合适的qRgb值,以便与setColor()函数一起使用。例如:
对于每个颜色通道超过8位的图像。方法setPixelColor()和pixelColor()可用于设置和获取QColor值。
QImage还提供scanLine()函数,该函数返回具有给定索引的扫描线处的像素数据指针,以及bits()函数,该函数返回第一个像素数据指针(这相当于扫描线(0))。
图像格式
QImage中存储的每个像素都由一个整数表示。整数的大小因格式而异。QImage支持格式枚举描述的几种图像格式。
单色图像使用1位索引存储到最多两种颜色的颜色表中。有两种不同类型的单色图像:大端(MSB优先)或小端(LSB优先)位序。
8位图像使用8位索引存储到颜色表中,即每像素有一个字节。颜色表是一个QVector<QRgb>,QRgb typedef相当于包含格式为0xAARRGGBB的ARGB四元组的无符号int。
32位图像没有颜色表;相反,每个像素包含一个QRgb值。有三种不同类型的32位图像分别存储RGB(即0xffRRGGBB)、ARGB和预乘ARGB值。在预乘格式中,红色、绿色和蓝色通道乘以alpha分量除以255。
可以使用format()函数检索图像的格式。使用convertToFormat()函数将图像转换为其他格式。allGray()和isGrayscale()函数用于判断彩色图像是否可以安全地转换为灰度图像。
图像变换
QImage支持许多函数来创建原始图像的转换版本的新图像:createAlphaMask()函数从该图像的alpha缓冲区生成并返回1-bpp的掩码,createHeuristicMask()函数为该图像创建并返回1-bpp的启发式掩码。后一种功能的工作原理是从一个角选择一种颜色,然后从所有边缘开始去除该颜色的像素。
Function | Description |
setDotsPerMeterX() | 通过设置物理仪表中水平适合的像素数来定义纵横比 |
setDotsPerMeterY() | 通过设置物理仪表中垂直适合的像素数来定义纵横比。 |
fill() | 用给定的像素值填充整个图像。 |
invertPixels() | 使用给定的反转模式值反转图像中的所有像素值。 |
setColorTable() | 设置用于转换颜色索引的颜色表。仅单色和8位格式。 |
setColorCount() | 调整颜色表的大小。仅单色和8位格式。 |
图片格式
QImage::Format
Constant | Value | Description |
QImage::Format_Invalid | 0 | 这个图片是无效的 |
QImage::Format_Mono | 1 | 图像以每像素1位的方式存储。字节首先用最高有效位(MSB)打包. |
QImage::Format_MonoLSB | 2 | 图像以每像素1位的方式存储。字节首先用低有效位(LSB)进行压缩。 |
QImage::Format_Indexed8 | 3 | 使用8位索引将图像存储到colormap中。 |
QImage::Format_RGB32 | 4 | 图像使用32位RGB格式(0xffRRGGBB)存储。 |
QImage::Format_ARGB32 | 5 | 图像使用32位ARGB格式(0xAARRGGBB)存储。 |
QImage::Format_ARGB32_Premultiplied | 6 | 图像使用预乘32位ARGB格式(0xAARRGGBB)存储,即红色、绿色和蓝色通道乘以alpha分量除以255。(如果RR、GG或BB的值高于alpha通道,则结果未定义。)某些操作(例如使用alpha混合的图像合成)使用预乘ARGB32比使用普通ARGB32更快。 |
QImage::Format_RGB16 | 7 | 图像使用16位RGB格式(5-6-5)存储。 |
QImage::Format_ARGB8565_Premultiplied | 8 | 图像使用预乘24位ARGB格式(8-5-6-5)存储。 |
QImage::Format_RGB666 | 9 | The image is stored using a 24-bit RGB format (6-6-6). The unused most significant bits is always zero. |
QImage::Format_ARGB6666_Premultiplied | 10 | The image is stored using a premultiplied 24-bit ARGB format (6-6-6-6). |
QImage::Format_RGB555 | 11 | The image is stored using a 16-bit RGB format (5-5-5). The unused most significant bit is always zero. |
QImage::Format_ARGB8555_Premultiplied | 12 | The image is stored using a premultiplied 24-bit ARGB format (8-5-5-5). |
QImage::Format_RGB888 | 13 | The image is stored using a 24-bit RGB format (8-8-8). |
QImage::Format_RGB444 | 14 | The image is stored using a 16-bit RGB format (4-4-4). The unused bits are always zero. |
QImage::Format_ARGB4444_Premultiplied | 15 | The image is stored using a premultiplied 16-bit ARGB format (4-4-4-4). |
QImage::Format_RGBX8888 | 16 | The image is stored using a 32-bit byte-ordered RGB(x) format (8-8-8-8). This is the same as the Format_RGBA8888 except alpha must always be 255. |
QImage::Format_RGBA8888 | 17 | The image is stored using a 32-bit byte-ordered RGBA format (8-8-8-8). Unlike ARGB32 this is a byte-ordered format, which means the 32bit encoding differs between big endian and little endian architectures, being respectively (0xRRGGBBAA) and (0xAABBGGRR). The order of the colors is the same on any architecture if read as bytes 0xRR,0xGG,0xBB,0xAA. |
QImage::Format_RGBA8888_Premultiplied | 18 | The image is stored using a premultiplied 32-bit byte-ordered RGBA format (8-8-8-8). |
QImage::Format_BGR30 | 19 | The image is stored using a 32-bit BGR format (x-10-10-10). |
QImage::Format_A2BGR30_Premultiplied | 20 | The image is stored using a 32-bit premultiplied ABGR format (2-10-10-10). |
QImage::Format_RGB30 | 21 | The image is stored using a 32-bit RGB format (x-10-10-10). |
QImage::Format_A2RGB30_Premultiplied | 22 | The image is stored using a 32-bit premultiplied ARGB format (2-10-10-10). |
QImage::Format_Alpha8 | 23 | The image is stored using an 8-bit alpha only format. |
QImage::Format_Grayscale8 | 24 | The image is stored using an 8-bit grayscale format. |