一、QImage类简介
- QImage提供了一个与硬件无关的图像表示方法,允许直接访问像素数据,可用作绘图设备。
- QImage类支持QImage::Format、enum描述的多种图像格式。包括8-bit, 32-bit 和alpha混合图像
- QImage 提供很多可以用于获取图像信息和进行图像变换的函数。
- QImage继承自QPaintDevice,可以使用QPainter直接绘制到图像上。
- 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
}
例子源码下载链接: