QImage 类详解

基本介绍

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");

实际应用场景

  1. 图像处理和编辑:修改像素、应用滤镜、颜色调整
  2. 图像分析:像素级别的图像分析和处理
  3. 图像合成:创建新图像、组合多个图像
  4. 离屏渲染:在内存中绘制内容后再显示
  5. 图像格式转换:在不同格式间转换图像

使用示例

// 加载图像
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 中进行图像处理的强大工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七贤岭↻双花红棍↺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值