Qt使用QImage保存成JPG(PNG)图像到本地

article/2025/10/19 5:38:20

一、QImage类简介

  1. QImage提供了一个与硬件无关的图像表示方法,允许直接访问像素数据,可用作绘图设备。
  2. QImage类支持QImage::Format、enum描述的多种图像格式。包括8-bit, 32-bit 和alpha混合图像
  3. QImage 提供很多可以用于获取图像信息和进行图像变换的函数。
  4. QImage继承自QPaintDevice,可以使用QPainter直接绘制到图像上。
  5. Qt提供了QImage、QPixmap、QBitmap和QPicture四种处理图像数据的类。
  • QImage类主要用于I/O和直接逐像素访问、操作;
  • QPixmap主要用于在屏幕中显示图像;
  • QBitmap只是一个继承QPixmap的便捷类,确保深度为1bit;
  • QPicture是一个可以记录和响应QPainter类命令的画图设备。

二、QImage类详解

1、读写图像

QImage提供了几种加载图像文件的方法:可以在构造QImage对象时加载文件,也可以在后面使用load()或loadFromData()函数加载。 QImage还提供静态fromData()函数,从给定数据构造QImage。

当pimage(一个QImage变量)中已经载入图片数据后,可调用save()进行保存。pimage.save(pictrureName, “JPG”, 100);对于这三个参数,解释如下:
1.pictrureName为图片文件的路径,比如:"img/hml.jpg",需要注意的是路径必须要有权限读写;
2."JPG"为图片的格式,注意不需要带".";
3.100指的是图片的质量因数,范围必须在0到100之内或-1,指定0以获取小型压缩文件,指定100表示大型未压缩文件,使用-1(默认值)使用默认设置。

2、图像信息

如size、width、height、dotsPerMeterX、dotsPerMeterY、pixel、text、depth

3、像素赋值操作

1).32-bit图像

用qRgb或qRgba方法设置一个颜色值,再用sexPixel将相应像素设置为相应颜色

2).8-bit和1-bit二值图像

每一个像素的值是color table List中的一个索引,因此像素的值只能被改成一个在color table List中已经定义的值。如果想往color table List中加入新的值,可以用setColor方法。

4、图像格式

  • QImage中的每一个像素由一个整数表示,这个整数的大小取决于不同的图像格式。
  • 8-bit图像的每一个像素的值是color table List中的一个索引,32-bit每一个像素拥有一个自己的rgb值(RGB、ARGB、premultiplied ARGB)
  • 图像的格式可以用format方法得到,convertToFormat方法可以用来将一种格式的图像转换为另外一种,allGray和isGrayscale方法可以用来检查一个彩色图像是否可以被安全转换为灰度图像。

5、图像变换

mirrored、scaled、rgbSwapped、scaledToWidth、scaledToHeight、transformed等

三、相关例子

将本地视频解码成为RGB像素数据,每25帧保存一张图片到本地

1、实现效果:

2、核心代码:

    int count = 0;while(av_read_frame(formatContent,pkt) == 0)//成功读到了数据,一帧一帧读{/*AVPacket->AVStream,要判断读到的每一帧的码流数据是不是视频流*/if(pkt->stream_index == videoType){int got_picture_ptr = -1;AVFrame *picture = av_frame_alloc();//保存原始RGB数据//读到一帧是视频流就进行解码的动作,解码得到RGB保存在AVFrame结构体里avcodec_decode_video2(codec,picture,&got_picture_ptr,pkt);if(got_picture_ptr != 0){//把解码得到的损坏的像素数据剔除(存到pictureRGB中)sws_scale(swsContent,picture->data,picture->linesize,0,picture->height,pictureRGB->data,pictureRGB->linesize);count++;if(count % 25 == 0)//每25帧保存一张图{uchar* transData = (unsigned char*)pictureRGB->data[0];//格式装换QImage desImage = QImage(transData,codec->width,codec->height,QImage::Format_RGB32,nullptr,nullptr); //图片保存在当前目录下的pictures中desImage.save(QString("./pictures/rgbPicture%1.png").arg(count-25),"PNG", 100);}}}//每次都存在同一块内存空间里,要清空上一次的操作av_packet_unref(pkt);//不是free}

例子源码下载链接:

Qt基于FFmpeg解码本地视频生成RGB数据_hml111666的博客-CSDN博客
 


http://chatgpt.dhexx.cn/article/nktQQcwI.shtml

相关文章

QImage

一、描述 QImage 类提供了一种独立于硬件的图像表示,允许直接访问像素数据,并且可以用作绘图设备。 QImage 是为 I/O 和直接像素访问和操作而设计和优化的, 因为 QImage 是 QPaintDevice 的子类,所以 QPainter 可用于直接在图像…

图像处理 QImage

在Qt中有四种处理图像的方法: QImage :使用I/O ,可以对像素进行处理QPixmap:主要用在屏幕的显示QBitmap: QPixmap的子类,处理颜色深度,只能显示黑白两种颜色,用于遮罩QPicture&…

QImage的用法

QImage提供了几种加载图像文件的方法: (1)构造QImage对象 Image myImage1 QImage(filename); 根据文件名打开图像 支持的图片格式是: (2)QImage(uchar *data, int width, int height, Format format …) 用…

QImage使用说明

详细描述 QImage类提供独立于硬件的图像表示,允许直接访问像素数据,并可用作绘制设备。 Qt提供了四个用于处理图像数据的类:QImage、QPixmap、QBitmap和QPicture。QImage针对I/O、直接像素访问和操作进行了设计和优化,而QPixmap…

QImage类详解(QImage类型转换、QImage类函数及QImage像素操作)

QImage类(QImage类型转换、QImage类函数及QImage像素操作) 打开Qt帮助文档,会看到有关于QImage的描述如下:The QImage class provides a hardware-independent image representation that allows direct access to the pixel dat…

J1939 协议

J1939 协议简介 J1939协议是基于CAN 2.0B所发展的出来的,基于CAN 的物理层。主要用于commercial vehicle的通信。J1939的主要目的是制定统一的上层application诊断的信息。 J1939的最大特点是定义了PGN(Parameter Group Number). 大多数的PGN是8个字节…

SAE J1939学习笔记(三)

J1939故障代码种类 J1939 由几个不同的诊断信息: –诊断信息 1 - DM1 – 现行故障代码 –诊断信息 2 - DM2 – 非现行故障代码 –诊断信息 3 - DM3 – 清除非现行故障代码 通常地,用户会用 DM1 信息来读取现行故障码。 DM1 信息是 PGN 65226 or FECA h…

新功能发布—TSMaster如何实现J1939多帧报文收发

前言 众所周知,J1939协议是由美国汽车工程师协会(SAE)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。如今大多数车辆都通过CAN进行ECU通信。但是CAN总线仅仅是提供了通信的基础(就像是电话)&…

CAN协议 J1939

转自:http://blog.sina.com.cn/s/blog_bf97bd7e0102wl2y.html 这几天在公司看了SAE推行的 J1939标准(SAE:美国汽车工程协会),这里整理下学习要点,主要包含以下几个协议: 物理层 SAE J1939-11…

J1939协议与CAN2.0对应关系图表

SAE J1939 消息帧格式定义与CAN 2.0B帧格式对应关系 J1939应用层协议详细描述了用于J1939网络的每个参数,包括其数据长度、数据类型、分辨率、范围及参考标签,并为每个参数分配了一个编号(SPN)。由于J1939协议是以协议数据单元&am…

Python实现CAN总线J1939报文接收、发送

前言 J1939协议是由美国汽车工程师协会(SAE) (SAE协会简介)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。在许多方面,J1939标准类似于旧版J1708和J1587标准,但J1939标准协议建立在CAN(控制器区域…

J1939标准概述【小白入门】

文章目录 J1939标准概述:J1939/11物理层J1939/13板外诊断连接器J1939/21数据链路层J1939/31网络层J1939/71车辆应用层J1939/73应用层-诊断层J1939/81网络管理总结 J1939标准概述: J1939由下列子标准组成: J1939 – 串行控制和通信车辆网络…

J1939-21数据链路层多帧协议PDU解析

一、协议数据单元(PDU) P 是优先级,R 是保留位,DP 是数据页,PF 是PDU 格式,PS 是特定PDU,SA 是源地址 优先级(P):这三位仅在总线传输中用来优化消息延迟&…

CAN总线的特点及J1939协议通信原理、内容和应用

众多国际知名汽车公司早在20世纪80年代就积极致力于汽车网络技术的研究及应用。迄今已有多种网络标准,如专门用于货车和客车上的SAE的J1939、德国大众的ABUS、博世的CAN、美国商用机器的AutoCAN、ISO的VAN、马自达的PALMNET等。 在我国的轿车中已基本具有电子控制和…

IPEmotion采集J1939协议信号

一 背景 由于商用车相对于乘用车更注重实用性,功能也较单一,且具有产量小的特点,因此在设计开发时需要进行约束,以更大程度实现软硬件的复用和成本的降低,在此需求下J1939协议便随之产生了。 J1939协议是由美国汽车工…

SAE J1939协议读取车辆故障码

基于SAE J1939协议的车辆,默认开启数据广播。当有故障码时,也会按照故障码的格式进行广播。 此处基于外设主动:读取故障码个数->读取故障码->故障码解析 这个步骤来讲,如果被动接收故障码广播,如下解析也适用。 …

车用总线技术 | J1939协议实用指南与J1939数据记录方案

“没错,这是一份SAE J1939协议的简单、实用指南。”—虹科 开篇:在这篇介绍中,我们介绍了J1939协议的基本知识,其中包括PGN和SPN。因为这是一篇偏向应用的简介,所以您还将会学习到如何通过DBC文件解码J1939数据、如何…

SAE J1939协议学习笔记

引用百度百科: SAE J1939(以下简称J1939)是美国汽车工程协会(SAE)的推荐标准,用于为中重型道路车辆上电子部件间的通讯提供标准的体系结构。它由“卡车与大型客车电气与电子委员会”(Track &am…

J1939学习(二)

PDU 应用或网络层提供被同化为协议数据单元(PDU)的信息串。PDU提供了一个框架,用于组织对发送的每个CAN数据帧至关重要的信息。SAE J1939 PDU由七个字段组成:(1)P、(2)EDP、&#x…

CAN总线(J1939)速成指南【1】

本文转载在我的微信公众号:古德曼汽车工业。公众号文章都会知识星球、知乎进行转载,请有兴趣的朋友可以关注我的微信公众号 原文地址:CAN总线(J1939)速成指南【1】 很久以前当思想对CAN总线还一窍不通的时候,尝试百度搜索过非常…