基本介绍
QImage 是 Qt 框架中的一个核心类,提供了一种硬件独立的图像表示方式。它允许直接访问像素数据,并且可以用作绘制设备(paint device)。QImage 主要用于图像的 I/O 处理、像素操作和图像修改等场景。
主要特点
- 硬件独立:QImage 在所有平台上呈现一致的图像表示
- 直接像素访问:可以直接读取和修改单个像素
- 多种格式支持:支持多种图像格式(如 PNG、JPEG、BMP、GIF 等)
- 图像转换:可以进行缩放、裁剪、旋转等操作
- Alpha 通道支持:支持透明度处理
- 作为绘制设备:可以使用 QPainter 在 QImage 上绘制
与其他 Qt 图像类的区别
- QPixmap:针对屏幕显示优化,与硬件相关,不能直接访问像素数据
- QBitmap:QPixmap 的子类,只支持 1 位深度(黑白)图像
- QPicture:用于记录和回放 QPainter 命令
- QImage:适合像素操作和图像处理,与硬件无关
常用图像格式
QImage 支持多种图像格式:
- Format_RGB32:32 位 RGB 格式(0xffRRGGBB)
- Format_ARGB32:32 位 ARGB 格式(0xAARRGGBB)
- Format_ARGB32_Premultiplied:预乘 alpha 的 ARGB 格式
- Format_RGB888:24 位 RGB 格式
- Format_Grayscale8:8 位灰度格式
- 其他多种格式…
常用方法
创建和加载
// 创建空图像
QImage image(width, height, QImage::Format_ARGB32);
// 从文件加载
QImage image("path/to/image.png");
// 从原始数据创建
QImage image(data, width, height, format);
像素操作
// 获取/设置像素颜色
QRgb color = image.pixel(x, y);
image.setPixel(x, y, qRgb(r, g, b));
// 获取扫描线指针(直接内存访问)
uchar *line = image.scanLine(y);
图像转换
// 缩放
QImage scaled = image.scaled(newWidth, newHeight);
// 裁剪
QImage cropped = image.copy(x, y, width, height);
// 旋转和翻转
QImage rotated = image.transformed(QTransform().rotate(90));
QImage flipped = image.mirrored(horizontal, vertical);
保存图像
image.save("path/to/save.png", "PNG");
实际应用场景
- 图像处理和编辑:修改像素、应用滤镜、颜色调整
- 图像分析:像素级别的图像分析和处理
- 图像合成:创建新图像、组合多个图像
- 离屏渲染:在内存中绘制内容后再显示
- 图像格式转换:在不同格式间转换图像
使用示例
// 加载图像
QImage image("input.jpg");
if (image.isNull()) {
qDebug() << "无法加载图像";
return;
}
// 转换为灰度
for (int y = 0; y < image.height(); y++) {
for (int x = 0; x < image.width(); x++) {
QRgb pixel = image.pixel(x, y);
int gray = qGray(pixel);
image.setPixel(x, y, qRgb(gray, gray, gray));
}
}
// 保存修改后的图像
image.save("output_gray.jpg");
// 使用 QPainter 在图像上绘制
QPainter painter(&image);
painter.setPen(Qt::red);
painter.drawText(10, 20, "Hello QImage");
painter.end();
// 缩放图像
QImage scaledImage = image.scaled(200, 150, Qt::KeepAspectRatio);
性能考虑
- QImage 适合像素操作,但对于频繁在屏幕上显示的图像,QPixmap 通常性能更好
- 对于大量像素操作,使用
scanLine()
方法直接访问内存通常比pixel()
和setPixel()
更高效 - 如果需要在多线程中处理图像,QImage 是线程安全的,而 QPixmap 不是
以上就是 QImage 类的主要功能和用法,它是 Qt 中进行图像处理的强大工具。