QImage图片处理详解

2023-10-23 07:44
文章标签 详解 图片 处理 qimage

本文主要是介绍QImage图片处理详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 图像格式支持
  • 2. 加载和保存图像
    • 2.1 QImaeg加载图像
    • 2.2 QImaeg保存图像
    • 2.3QImage 加载和保存图像的实例
  • 3 QImage图像大小和缩放
    • 3.1 获取图像大小
    • 3.2 缩放图像
    • 3.3 QImage 图像大小和缩放的实例
  • 4 QtImage图像旋转和裁剪
    • 4.1 旋转图像
    • 4.2 裁剪图像
    • 4.3 QImage 旋转和裁剪的实例
  • 5. Qt图像滤镜
    • 5.1 模糊滤镜
    • 5.2 亮度调整
    • 5.3 对比度调整
    • 5.4 Qt 图像滤镜的实例

在Qt中,图片处理是一个重要的领域,它包括加载、保存、缩放、旋转、裁剪、滤镜等操作。

1. 图像格式支持

Qt支持多种图像格式,包括PNG、JPEG、BMP、GIF等。Qt中的QImage类提供了对这些图像格式的支持,你可以使用QImage加载和保存不同格式的图像。
以下是Qt默认支持的图像格式列表:

  1. BMP(.bmp): Windows位图格式。
  2. GIF(.gif): 图形交换格式,支持动画。
  3. JPG/JPEG(.jpg, .jpeg): 联合照片专家小组(Joint Photographic Experts Group)格式。
  4. PNG(.png): 可移植网络图形格式,支持无损压缩。
  5. PBM(.pbm): Portable Bitmap格式,一种简单的二进制图像格式。
  6. PGM(.pgm): Portable Graymap格式,一种灰度图像格式。
  7. PPM(.ppm): Portable Pixmap格式,一种彩色图像格式。
  8. XBM(.xbm): X BitMap格式,一种用于X窗口系统的位图格式。
  9. XPM(.xpm): X PixMap格式,一种用于X窗口系统的彩色图像格式。

除了以上格式,Qt还支持以下一些特殊格式:

  • Mac PICT(.pct): Macintosh PICT图像格式。
  • TGA(.tga): Truevision Targa图像格式。
  • TIFF(.tiff): 标记图像文件格式。
  • WBMP(.wbmp): 无线位图格式,用于移动设备。

请注意,具体的支持格式取决于Qt的编译配置。在编译Qt时,你可以选择启用或禁用特定的图像格式支持。如果你需要支持某个特定的图像格式,确保在编译Qt时启用了相应的支持选项。

2. 加载和保存图像

2.1 QImaeg加载图像

使用 QImage 的构造函数或 load() 函数可以从文件、内存或设备加载图像。你可以传递图像文件的路径给构造函数,或者使用 load() 函数加载图像文件。

QImage image("path/to/image.png"); // 从文件加载
// 或者
QImage image;
image.load("path/to/image.png"); // 从文件加载

2.2 QImaeg保存图像

使用 save() 函数可以将 QImage 保存为文件。你可以指定文件名以及图像格式(如 PNG、JPEG 等)。

image.save("output/path/image.png"); // 保存为PNG格式
// 或者
image.save("output/path/image.jpg", "JPEG"); // 保存为JPEG格式

2.3QImage 加载和保存图像的实例

以下是一个简单的实例,演示了如何使用 QImage 加载图像并将其保存为不同的格式。

#include <QImage>
#include <QDebug>int main() {// 加载图像QImage image("path/to/input.png");// 检查图像是否成功加载if (image.isNull()) {qDebug() << "Failed to load image.";return 1;}// 保存图像为不同格式if (image.save("path/to/output.png")) {qDebug() << "Image saved as PNG.";} else {qDebug() << "Failed to save image as PNG.";}if (image.save("path/to/output.jpg", "JPEG")) {qDebug() << "Image saved as JPEG.";} else {qDebug() << "Failed to save image as JPEG.";}if (image.save("path/to/output.bmp", "BMP")) {qDebug() << "Image saved as BMP.";} else {qDebug() << "Failed to save image as BMP.";}return 0;
}

在这个例子中,首先加载了一个图像文件(假设路径为 “path/to/input.png”),然后将其保存为不同格式的文件。save() 函数的第二个参数可以指定保存的图像格式,如 “PNG”、“JPEG”、“BMP” 等。根据你的需要,可以选择适当的格式。在实际应用中,请替换实际的文件路径和格式。

3 QImage图像大小和缩放

3.1 获取图像大小

使用 size() 函数可以获取图像的大小,返回一个 QSize 对象,其中包含图像的宽度和高度。

QSize imageSize = image.size();
int width = imageSize.width();
int height = imageSize.height();

3.2 缩放图像

使用 scaled() 函数可以对图像进行缩放。该函数接受目标宽度和高度作为参数,返回一个新的 QImage 对象,表示缩放后的图像。你也可以选择使用不同的缩放模式,如保持宽高比例或拉伸到指定大小。

// 缩放为指定的宽度和高度
QImage scaledImage = image.scaled(100, 100);// 缩放并保持宽高比例
QImage aspectRatioImage = image.scaled(100, 100, Qt::KeepAspectRatio);// 拉伸到指定的宽度和高度
QImage stretchedImage = image.scaled(100, 100, Qt::IgnoreAspectRatio);

3.3 QImage 图像大小和缩放的实例

以下是一个简单的实例,演示了如何获取图像的大小并对图像进行缩放。

#include <QImage>
#include <QDebug>int main() {// 加载图像QImage image("path/to/image.png");// 检查图像是否成功加载if (image.isNull()) {qDebug() << "Failed to load image.";return 1;}// 获取图像大小QSize imageSize = image.size();int width = imageSize.width();int height = imageSize.height();qDebug() << "Original Image Size: " << width << "x" << height;// 缩放图像为指定的宽度和高度QImage scaledImage = image.scaled(50, 50);int scaledWidth = scaledImage.width();int scaledHeight = scaledImage.height();qDebug() << "Scaled Image Size: " << scaledWidth << "x" << scaledHeight;return 0;
}

在这个例子中,首先加载了一个图像文件(假设路径为 “path/to/image.png”),然后获取了原始图像的大小,并将其缩放为50x50的尺寸。请替换实际的文件路径和缩放目标尺寸。

4 QtImage图像旋转和裁剪

4.1 旋转图像

使用 transformed() 函数可以对图像进行旋转。该函数接受一个 QMatrix 对象作为参数,该对象描述了旋转的角度和其他变换信息。

QMatrix matrix;
matrix.rotate(90);  // 旋转90度
QImage rotatedImage = image.transformed(matrix);

4.2 裁剪图像

使用 copy() 函数可以对图像进行裁剪。该函数接受起始点的坐标和裁剪区域的宽度和高度作为参数。

QImage croppedImage = image.copy(x, y, width, height);

4.3 QImage 旋转和裁剪的实例

以下是一个简单的实例,演示了如何对图像进行旋转和裁剪。

#include <QImage>
#include <QMatrix>
#include <QDebug>int main() {// 加载图像QImage image("path/to/image.png");// 检查图像是否成功加载if (image.isNull()) {qDebug() << "Failed to load image.";return 1;}// 旋转图像QMatrix matrix;matrix.rotate(90);  // 旋转90度QImage rotatedImage = image.transformed(matrix);rotatedImage.save("path/to/rotated_image.png");  // 保存旋转后的图像// 裁剪图像int x = 50;int y = 50;int width = 100;int height = 100;QImage croppedImage = image.copy(x, y, width, height);croppedImage.save("path/to/cropped_image.png");  // 保存裁剪后的图像return 0;
}

在这个例子中,首先加载了一个图像文件(假设路径为 “path/to/image.png”),然后对图像进行了90度的旋转和裁剪操作,并将结果保存为新的图像文件。请替换实际的文件路径和裁剪区域的坐标、宽度、高度。

5. Qt图像滤镜

Qt提供了QImageFilter类,用于应用各种滤镜效果。滤镜可以用于图像处理,例如模糊、亮度、对比度等。以下是一些常见的滤镜效果:

5.1 模糊滤镜

  • 使用模糊滤镜可以使图像变得模糊,模糊度由滤镜的半径决定。
  QImage blurredImage = image.filter(QImage::Filter_GaussianBlur, 5);  // 半径为5的高斯模糊

5.2 亮度调整

  • 通过亮度滤镜可以调整图像的亮度,值范围通常在-100到100之间。
 QImage brightenedImage = image.filter(QImage::Filter_Brightness, 50);  // 增加50个亮度单位

5.3 对比度调整

  • 通过对比度滤镜可以调整图像的对比度,值范围通常在-100到100之间。
QImage contrastedImage = image.filter(QImage::Filter_Contrast, 20);  // 增加20个对比度单位

5.4 Qt 图像滤镜的实例

以下是一个简单的实例,演示了如何使用QImageFilter应用模糊滤镜、亮度滤镜和对比度滤镜:

#include <QImage>
#include <QDebug>int main() {// 加载图像QImage image("path/to/image.png");// 检查图像是否成功加载if (image.isNull()) {qDebug() << "Failed to load image.";return 1;}// 应用模糊滤镜QImage blurredImage = image.filter(QImage::Filter_GaussianBlur, 5);// 应用亮度滤镜QImage brightenedImage = image.filter(QImage::Filter_Brightness, 50);  // 增加50个亮度单位// 应用对比度滤镜QImage contrastedImage = image.filter(QImage::Filter_Contrast, 20);  // 增加20个对比度单位// 保存处理后的图像blurredImage.save("path/to/blurred_image.png");brightenedImage.save("path/to/brightened_image.png");contrastedImage.save("path/to/contrasted_image.png");return 0;
}

在这个例子中,首先加载了一个图像文件(假设路径为 “path/to/image.png”),然后分别应用了模糊滤镜、亮度滤镜和对比度滤镜,并将处理后的图像保存为新的文件。请替换实际的文件路径和滤镜参数值。

这篇关于QImage图片处理详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/266503

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1