zoukankan      html  css  js  c++  java
  • FFMpeg笔记(一) 使用FFmpeg将任意格式图片转换成任意格式图片

    void SrcToDest(char* pSrc, char* pDest,unsigned int nSrcWidth, unsigned int nSrcHeight, AVPixelFormat srcFormat,
        unsigned int nDestWidth, unsigned int nDestHeight, AVPixelFormat destFormat)
    {
        SwsContext* pConvert_ctx = NULL;
        AVFrame* pFrameIn = NULL;
        AVFrame* pFrameOut = NULL;
    
        // 分配一个AVFrame,注意必须使用avcodec_free_frame()释放
        pFrameIn = avcodec_alloc_frame();
        // 使用原始图片数据填充一个AVFrame
        avpicture_fill((AVPicture*)pFrameIn, (uint8_t*)pSrc, srcFormat, nSrcWidth, nSrcHeight);
    
        pFrameOut = avcodec_alloc_frame();
        avpicture_fill((AVPicture*)pFrameOut, (uint8_t*)pDest, destFormat, nDestWidth, nDestHeight);
        // linesize[0]是每行的字节数,需根据具体格式调整
        pFrameOut->linesize[0] = nDestWidth * 4;
    
        // 依据输入参数获取格式转换信息的结构体
        pConvert_ctx = sws_getContext(nSrcWidth, nSrcHeight, srcFormat, 
            nDestWidth, nDestHeight, destFormat, 
            SWS_FAST_BILINEAR, NULL, NULL, NULL);
        // 依据格式转换结构体,转换一帧数据
        sws_scale(pConvert_ctx, 
            pFrameIn->data, 
            pFrameIn->linesize, 
            0,
            nSrcHeight, 
            pFrameOut->data, 
            pFrameOut->linesize);
    
        // 释放内存
        avcodec_free_frame(&pFrameIn);
        avcodec_free_frame(&pFrameOut);
        sws_freeContext(pConvert_ctx);
    }

       注意转换的宽高不能搞错,否则非但不能转换正确,还有可能crash。附调试用的保存图片函数DumpImage,可以使用该函数查看原始数据是否正确或者格式转换是否成功:

    BOOL DumpBmp(const char *filename, uint8_t *pRGBBuffer, int width, int height, int bpp)  
    {  
        BITMAPFILEHEADER bmpheader;  
        BITMAPINFOHEADER bmpinfo;  
        FILE *fp = NULL;  
    
        fp = fopen(filename,"wb");  
        if( fp == NULL )  
        {  
            return FALSE;  
        }  
    
        bmpheader.bfType = ('M' <<8)|'B';  
        bmpheader.bfReserved1 = 0;  
        bmpheader.bfReserved2 = 0;  
        bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);  
        bmpheader.bfSize = bmpheader.bfOffBits + width*height*bpp/8;  
    
        bmpinfo.biSize = sizeof(BITMAPINFOHEADER);  
        bmpinfo.biWidth = width;  
        bmpinfo.biHeight = 0 - height;  
        bmpinfo.biPlanes = 1;  
        bmpinfo.biBitCount = bpp;  
        bmpinfo.biCompression = BI_RGB;  
        bmpinfo.biSizeImage = 0;  
        bmpinfo.biXPelsPerMeter = 100;  
        bmpinfo.biYPelsPerMeter = 100;  
        bmpinfo.biClrUsed = 0;  
        bmpinfo.biClrImportant = 0;  
    
        fwrite(&bmpheader,sizeof(BITMAPFILEHEADER),1,fp);  
        fwrite(&bmpinfo,sizeof(BITMAPINFOHEADER),1,fp);  
        fwrite(pRGBBuffer,width*height*bpp/8,1,fp);  
        fclose(fp);  
        fp = NULL;  
    
        return TRUE;  
    }

      char *pBmpFile = "DumpTest.bmp";
      DumpBmp(pBmpFile, (uint8_t*)&bufferVector[0],
        DEST_WIDTH_DEFAULT, DEST_HEIGHT_DEFAULT, 32);

  • 相关阅读:
    Seminar Schedule
    数学建模之Python操作csv文件
    Pandas之csv文件对列行的相关操作
    Python之文件读写(csv文件,CSV库,Pandas库)
    PATA1028 List Sorting
    19.8.9(全局变量和局部变量的作用域)
    PATA1012The Best Rank(25分)
    DEV-gridview导出Excel
    WPF文本换行
    下拉框--可多选
  • 原文地址:https://www.cnblogs.com/jiayayao/p/6505363.html
Copyright © 2011-2022 走看看