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

一、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、实现效果:

Qt使用QImage保存成JPG(PNG)图像到本地_第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博客
 

你可能感兴趣的:(Qt实战,流媒体,qt,ffmpeg)