轉載自:http://www.cnblogs.com/acloud/archive/2011/10/29/2228626.html
直接使用ffmpeg中的sws_scale雖然已經不太復雜,但每次的手動初始化等操作,畢竟不夠方便。我對這部分代碼進行了封裝。平時常見的需要處理的圖像格式無非就是YUV420和RGB24、RGB32等格式,我的封裝僅僅對它們進行。blog好像不能上傳附件,因此我沒法把ffmpeg的scale相關的靜態庫lib(靜態庫攜帶比動態庫方便^_^)等上傳了(發了一份給自己的qq郵箱留作備份了,發現這兒可以上傳附件,全部源碼也上傳一份好了)。
下面的代碼,可能需要ffmpeg的相關頭文件支持,我對它們進行了一些精簡,只需要一個頭文件"swscale.h"即可。
FFScale.h源碼如下:

/**//***************************************************************************//**//**
* 版權所有 (C)
*
* 文件名稱: FFScale.h
* 文件標識:
* 內容摘要: 使用ffmpeg中的sws_scale進行圖片格式轉換和resize的封裝類。
* 其它說明: 本模塊僅僅對常見的圖像格式進行了轉換,更多的圖像格式,請直接使用
* ffmepg中的sws_scale。
*
* 本封裝類使用方法如下:
* 1、定義一個CFFScale對象;
* 2、調用該對象的SetAttribut函數,設置輸入輸出圖像的格式和Scale算法;
* 3、調用該對象的Scale函數,進行Scale操作。
*
* 注意:本模塊假定YUV圖像格式采用的連續的內存空間進行的圖像存儲,如
* 實際情況并非如此,則本模塊不適應這種場合。
* 當前版本: V1.0
* 作 者: Cloud
* 完成日期: 2011-10-28
*******************************************************************************/
#pragma once


//Scale算法
enum SwsAlogrithm


{
SWS_SA_FAST_BILINEAR = 0x1,
SWS_SA_BILINEAR = 0x2,
SWS_SA_BICUBIC = 0x4,
SWS_SA_X = 0x8,
SWS_SA_POINT = 0x10,
SWS_SA_AREA = 0x20,
SWS_SA_BICUBLIN = 0x40,
SWS_SA_GAUSS = 0x80,
SWS_SA_SINC = 0x100,
SWS_SA_LANCZOS = 0x200,
SWS_SA_SPLINE = 0x400,
};

//視頻圖像格式
enum PicFormat


{
SWS_PF_NONE = PIX_FMT_NONE,
SWS_PF_YUV420P = PIX_FMT_YUV420P,
SWS_PF_RGB24 = PIX_FMT_RGB24,
SWS_PF_BGR24 = PIX_FMT_BGR24,
SWS_PF_ARGB = PIX_FMT_ARGB,
SWS_PF_RGBA = PIX_FMT_RGBA,
SWS_PF_ABGR = PIX_FMT_ABGR,
SWS_PF_BGRA = PIX_FMT_BGRA,
};


class CFFScale


{
public:
CFFScale(void);
~CFFScale(void);

//設置輸入輸出圖片屬性以及Scale算法
void SetAttribute(PicFormat srcFormat, PicFormat dstFormat, SwsAlogrithm enAlogrithm = SWS_SA_FAST_BILINEAR);

//Scale
BOOL Scale(
byte *pSrc, int nSrcW, int nSrcH, int nSrcPicth,
byte *pDst, int nDstW, int nDstH, int nDstPicth
);

private:

//初始化
BOOL Init();

//反初始化
void DeInit();

SwsContext* m_pSwsContext; //SWS對象
PicFormat m_srcFormat; //源像素格式
PicFormat m_dstFormat; //目標像素格式
SwsAlogrithm m_enAlogrithm; //Resize算法

int m_nSrcW, m_nSrcH; //源圖像寬高
int m_nSrcPicth; //源圖像第一行數據的長度
int m_nSrcSlice[4]; //源圖像各分量數據起始地址偏移
int m_nSrcStride[4]; //源圖像各分量一行數據的長度

int m_nDstW, m_nDstH; //目標圖像寬高
int m_nDstPicth; //目標圖像第一行數據的長度
int m_nDstSlice[4]; //目標圖像各分量數據起始地址偏移
int m_nDstStride[4]; //目標圖像各分量一行數據的長度

};
FFScale.cpp源碼如下:
#include "StdAfx.h"
#include "FFScale.h"

#pragma comment(lib, "Scale/libavutil.lib")
#pragma comment(lib, "Scale/libswscale.lib")
#pragma comment(lib, "Scale/libgcc.lib")
#pragma comment(lib, "Scale/libmingwex.lib")

//構造
CFFScale::CFFScale(void)


{
m_pSwsContext = NULL;
m_srcFormat = SWS_PF_NONE;
m_dstFormat = SWS_PF_NONE;
m_enAlogrithm = SWS_SA_FAST_BILINEAR;

m_nSrcW = m_nSrcH = 0;
m_nSrcPicth = 0;
m_nDstW = m_nDstH = 0;
m_nDstPicth = 0;
for (int i=0; i<4; i++)

{
m_nSrcSlice[i] = -1;
m_nSrcStride[i] = 0;
m_nDstSlice[i] = -1;
m_nDstStride[i] = 0;
}
}

//析構
CFFScale::~CFFScale(void)


{
DeInit();
}


/**//***************************************************************************//**//**
* 函數名稱: SetAttribute
* 功能描述: 設置輸入輸出圖片屬性以及Scale算法。
* 參 數: srcFormat >> 源圖像格式;
* 參 數: dstFormat >> 目標圖像格式;
* 參 數: enAlogrithm >> Scale算法;
* 返回值:
* 其它說明:
* 修改日期 修改人 修改內容
* ------------------------------------------------------------------------------
* 2011-10-28 Cloud 創建
*******************************************************************************/
void CFFScale::SetAttribute(PicFormat srcFormat, PicFormat dstFormat, SwsAlogrithm enAlogrithm)


{
m_srcFormat = srcFormat;
m_dstFormat = dstFormat;
m_enAlogrithm = enAlogrithm;
DeInit();
}


/**//***************************************************************************//**//**
* 函數名稱: Init
* 功能描述: 初始化。
* 返回值: 執行成功返回TRUE,否則返回FALSE。
* 其它說明:
* 修改日期 修改人 修改內容
* ------------------------------------------------------------------------------
* 2011-10-28 Cloud 創建
*******************************************************************************/
BOOL CFFScale::Init()


{
//必須預先設置過輸入輸出格式
if (SWS_PF_NONE == m_srcFormat || SWS_PF_NONE == m_dstFormat)

{
return FALSE;
}

//反初始化
DeInit();

//創建sws對象
m_pSwsContext = sws_getContext(
m_nSrcW,
m_nSrcH,
(PixelFormat)m_srcFormat,
m_nDstW,
m_nDstH,
(PixelFormat)m_dstFormat,
(int)m_enAlogrithm,
NULL,
NULL,
NULL);
if (NULL == m_pSwsContext)

{
return FALSE;
}

//初始化源Slice和Stride
if (m_srcFormat == SWS_PF_YUV420P)

{
m_nSrcSlice[0] = 0;
m_nSrcSlice[1] = m_nSrcW * m_nSrcH;
m_nSrcSlice[2] = m_nSrcW * m_nSrcH * 5 / 4;
m_nSrcSlice[3] = -1;

m_nSrcStride[0] = m_nSrcW;
m_nSrcStride[1] = m_nSrcW / 2;
m_nSrcStride[2] = m_nSrcW / 2;
m_nSrcStride[3] = 0;

}
else

{
m_nSrcSlice[0] = 0;
m_nSrcSlice[1] = -1;
m_nSrcSlice[2] = -1;
m_nSrcSlice[3] = -1;

m_nSrcStride[0] = m_nSrcPicth;
m_nSrcStride[1] = 0;
m_nSrcStride[2] = 0;
m_nSrcStride[3] = 0;
}

//初始化目標Slice和Stride
if (m_dstFormat == SWS_PF_YUV420P)

{
m_nDstSlice[0] = 0;
m_nDstSlice[1] = m_nDstW * m_nDstH;
m_nDstSlice[2] = m_nDstW * m_nDstH * 5 / 4;
m_nDstSlice[3] = -1;

m_nDstStride[0] = m_nDstW;
m_nDstStride[1] = m_nDstW / 2;
m_nDstStride[2] = m_nDstW / 2;
m_nDstStride[3] = 0;

}
else

{
m_nDstSlice[0] = 0;
m_nDstSlice[1] = -1;
m_nDstSlice[2] = -1;
m_nDstSlice[3] = -1;

m_nDstStride[0] = m_nDstPicth;
m_nDstStride[1] = 0;
m_nDstStride[2] = 0;
m_nDstStride[3] = 0;
}
return TRUE;
}


/**//***************************************************************************//**//**
* 函數名稱: DeInit
* 功能描述: 反初始化。
* 返回值:
* 其它說明:
* 修改日期 修改人 修改內容
* ------------------------------------------------------------------------------
* 2011-10-28 Cloud 創建
*******************************************************************************/
void CFFScale::DeInit()


{
if (NULL != m_pSwsContext)

{
sws_freeContext(m_pSwsContext);
}
m_pSwsContext = NULL;
}


/**//***************************************************************************//**//**
* 函數名稱: Scale
* 功能描述: Scale
* 參 數: pSrc >> 源圖像內存起始地址;
* 參 數: nSrcW >> 源圖像寬度;
* 參 數: nSrcH >> 源圖像高度;
* 參 數: nSrcPicth >> 源圖像每行數據的長度(YUV格式的該值不被采納);
* 參 數: pDst << 目標圖像內存起始地址;
* 參 數: nDstW >> 目標圖像寬度;
* 參 數: nDstH >> 目標圖像高度;
* 參 數: nDstPicth >> 目標圖像每行數據的長度(YUV格式的該值不被采納);
* 返回值: 執行成功返回TRUE,否則返回FALSE。
* 其它說明:
* 修改日期 修改人 修改內容
* ------------------------------------------------------------------------------
* 2011-10-28 Cloud 創建
*******************************************************************************/
BOOL CFFScale::Scale(byte *pSrc, int nSrcW, int nSrcH, int nSrcPicth, byte *pDst, int nDstW, int nDstH, int nDstPicth)


{
//如果任何參數發生變化,則需要重新初始化
if (nSrcW != m_nSrcW || nSrcH != m_nSrcH || m_nSrcPicth != m_nSrcPicth
|| nDstW != m_nDstW || nDstH != m_nDstH || m_nDstPicth != m_nDstPicth)

{
m_nSrcW = nSrcW;
m_nSrcH = nSrcH;
m_nSrcPicth = nSrcPicth;
m_nDstW = nDstW;
m_nDstH = nDstH;
m_nDstPicth = nDstPicth;
DeInit();
}

//如果未能成功初始化,返回失敗
if (NULL == m_pSwsContext && !Init())

{
return FALSE;
}

//真正的Scale操作
byte *srcSlice[4], *dstSlice[4];
for (int i=0; i<4; i++)

{
srcSlice[i] = m_nSrcSlice[i] < 0 ? NULL : (pSrc + m_nSrcSlice[i]);
dstSlice[i] = m_nDstSlice[i] < 0 ? NULL : (pDst + m_nDstSlice[i]);
}
return sws_scale
(
m_pSwsContext,
srcSlice,
m_nSrcStride,
0,
m_nSrcH,
dstSlice,
m_nDstStride
) == m_nSrcH;
}