QT图像处理类QImage常见使用方法

概述

Qt 是一个跨平台的 C++ 库,提供了丰富的图像处理功能,可以用来实现各种图像处理任务,例如图像缩放、旋转、灰度化、二值化等。本文将介绍使用 Qt 实现图像处理的方法,并提供代码示例。

加载和保存图像

在 Qt 中,可以使用 QImage 类型来加载和保存图像,QImage 支持多种图像格式,例如 BMP、JPEG、PNG 等。下面是一个加载和保存图像的示例代码:


#include <QImage>
// 加载图像
QImage image("test.jpg");
// 保存图像
image.save("output.png");

图像缩放和旋转

在 Qt 中,可以使用 QImage 类型的 scaled 和 rotated 函数来实现图像的缩放和旋转。

#include <QImage>
// 加载图像
QImage image("test.jpg");
// 缩放图像
QImage scaledImage = image.scaled(640, 480);
// 旋转图像
QImage rotatedImage = image.rotated(90);

图像灰度化

图像灰度化是一种常用的图像处理操作,可以将图像从 RGB 彩色空间转换为灰度空间。在 Qt 中,可以使用 QImage 类型的 convertToFormat 函数来实现图像的灰度化。

QImage::convertToFormat()

QImage::convertToFormat() 是 Qt 图像处理中一个非常常用的函数,用于将一个 QImage 对象的像素格式转换为另一种格式。它的函数原型如下:


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

其中,format 参数表示目标像素格式,可以是 QImage::Format_ARGB32、QImage::Format_RGB888、QImage::Format_Grayscale8 等格式,具体支持的格式可以查看 Qt 文档。
flags 参数是可选的,表示转换时的一些选项,可以是以下值之一:

Qt::AutoColor:自动选择目标格式的颜色空间。
Qt::ColorOnly:仅转换颜色格式,不转换 alpha 通道。
Qt::MonoOnly:仅转换为单色格式。
Qt::OrderedDither:启用有序抖动算法,提高颜色质量。
Qt::DiffuseDither:启用漫反射抖动算法,提高颜色质量。
Qt::ThresholdDither:启用阈值抖动算法,提高颜色质量。

注意:convertToFormat() 函数返回一个新的 QImage 对象,表示转换后的图像。注意,转换后的图像是一个全新的对象,不会改变原来的图像对象。


#include <QImage>
// 加载图像
QImage image("test.jpg");
// 灰度化图像
QImage grayImage = image.convertToFormat(QImage::Format_Grayscale8);

图像二值化

图像二值化是将图像中的像素值转换为 0 或 255 的操作,可以用来实现图像的二值化处理。在 Qt 中,可以使用 QImage 类型的 convertToFormat 函数和 threshold 函数来实现图像的二值化。

threshold 函数

threshold 函数是图像处理中一个常用的函数,可以将图像的像素值按照阈值进行二值化处理,将大于或等于阈值的像素置为一个值,小于阈值的像素置为另一个值。在 Qt 中,QImage 类提供了 threshold() 函数来实现这个功能,其函数原型如下:


void QImage::threshold(int threshold, Qt::ThresholdMode mode = Qt::ThresholdBinary);

其中,threshold 参数表示二值化的阈值,可以是任意整数;mode 参数表示二值化的模式,可以是以下三种模式之一:

Qt::ThresholdBinary:二值化模式,将像素值大于或等于阈值的像素设置为 1,小于阈值的像素设置为 0。
Qt::ThresholdInverted:反色二值化模式,将像素值小于或等于阈值的像素设置为 1,大于阈值的像素设置为 0。
Qt::ThresholdTruncate:截断模式,将像素值大于阈值的像素设置为阈值,小于或等于阈值的像素保持不变。

注意,threshold() 函数直接修改当前 QImage 对象的像素值,而不会返回一个新的图像对象。因此,在使用该函数时,应该先对原始图像进行备份,以便在需要时恢复原始图像。


#include <QImage>
// 加载图像
QImage image("test.jpg");
// 灰度化图像
QImage grayImage = image.convertToFormat(QImage::Format_Grayscale8);
// 二值化图像
QImage binaryImage = grayImage;
binaryImage.threshold(128);

以上是使用 Qt 实现图像处理的基本方法,可以通过这些函数来实现图像的缩放、旋转、灰度化和二值化等处理。需要注意的是,在实际使用中,还需要考虑图像的格式、大小和处理效率等问题。

loadFromData 从内存加载图像

QImage 类还提供了 loadFromData 函数,可以从数据中加载图像。这个函数可以方便地将图像数据从内存中加载到 QImage 类型中进行处理,具体用法如下:

#include <QFile>
#include <QByteArray>

// 读取文件到 QByteArray 中
QFile file("test.jpg");
file.open(QIODevice::ReadOnly);
QByteArray data = file.readAll();
file.close();

// 从 QByteArray 中加载图像
QImage image;
image.loadFromData(data);

这个示例代码中,首先使用 QFile 类型的 readAll 函数读取文件数据到 QByteArray 类型中,然后使用 QImage 类型的 loadFromData 函数从 QByteArray 中加载图像。这个方法可以方便地将图像数据从内存中加载到 QImage 类型中进行处理,避免了多次读取文件的开销。

拓展

要按比例扩大填充图像并根据标签的长边或短边来进行调整,您可以使用以下代码修改您的现有代码:

// 提取JPEG图像数据
QByteArray jpegData = buffer.mid(startIndex, endIndex + endMarker.size() - startIndex);
QImage image;
if (image.loadFromData(jpegData, "JPEG")) {
    // 获取标签的宽度和高度
    int labelWidth = ui->label->width();
    int labelHeight = ui->label->height();

    // 计算图像的宽度和高度
    int imageWidth = image.width();
    int imageHeight = image.height();

    // 计算宽度和高度的比例
    double widthRatio = static_cast<double>(labelWidth) / imageWidth;
    double heightRatio = static_cast<double>(labelHeight) / imageHeight;

    // 选择较小的比例进行扩大
    double scaleFactor = qMin(widthRatio, heightRatio);

    // 根据比例调整图像的大小
    QImage scaledImage = image.scaled(imageWidth * scaleFactor, imageHeight * scaleFactor, Qt::KeepAspectRatio);

    // 在标签上显示图像
    ui->label->setPixmap(QPixmap::fromImage(scaledImage));
}

这段代码将会根据标签的大小和图像的宽高比,选择较小的比例进行扩大,以确保图像能够填充好标签的长边或者短边。然后,它会将调整后的图像显示在标签上。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值