概述
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 类型中进行处理,避免了多次读取文件的开销。
拓展
要按比例扩大填充图像并根据标签的长边或短边来进行调整,您可以使用以下代码修改您的现有代码:文章来源:https://www.toymoban.com/news/detail-436264.html
// 提取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));
}
这段代码将会根据标签的大小和图像的宽高比,选择较小的比例进行扩大,以确保图像能够填充好标签的长边或者短边。然后,它会将调整后的图像显示在标签上。文章来源地址https://www.toymoban.com/news/detail-436264.html
到了这里,关于QT图像处理类QImage常见使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!