BGR32转RGB24快速转换算法

原创
2015/01/29 22:08
阅读数 2.5K

    

     1. 普通转换算法

/*

 *   BGRA BGRA  BGRA  BGRA  => BGA BGA BGA

 *  @pDes: BGA  BGA 

 *  @pSrc: BGRA BGRA

*/

int nFrameSize  = nWidth * nHeight * 4;

char * pDes = (char *)pMemory->lpData;

char * pSrc = (char *)pVideo;


for(int i=0;i<nHeight;i++)

{

    for(int j=0;j<nWidth;j++)

    {

                 for(int k=0;k<3;k++)

                {

                       pDes[i*nWidth*3+j*3+k] = pSrc[nFrameSize - (i+1)*nWidth*4+j*4+k];

                }

    }

}


   2. 正序快速算法

/*

 *   BGRA BGRA  BGRA  BGRA  => BGA BGA BGA

 *  @pDes: BGA  BGA 

 *  @pSrc: BGRA BGRA

*/

int nFrameSize  = nWidth * nHeight * 4;

int *pDes = (int *)pMemory->lpData;

int *pSrc = (int *)pVideo;

/*

* BGRA=>RGB24 正序快速算法

for( int i=0; i<nFrameSize>>2 - 1; i++)  // 防止内存玷污算法

{

     *pDes = *(pSrc + i); pDes = (int *)( (char *)pDes + 3 );

}

*( ( (char *)pDes ) + 0 ) = *( ( (char *)pSrc ) + 0 ); 

*( ( (char *)pDes ) + 1 ) = *( ( (char *)pSrc ) + 1 );

*( ( (char *)pDes ) + 2 ) = *( ( (char *)pSrc ) + 2 ); 

*/


   3. 倒序快速算法

/*

 *   BGRA BGRA  BGRA  BGRA  => BGA BGA BGA

 *  @pDes: BGA  BGA 

 *  @pSrc: BGRA BGRA

*/

int nFrameSize  = nWidth * nHeight * 4;

int *pDes = (int *)pMemory->lpData;

int *pSrc = (int *)pVideo;

for( int i=0; i<nHeight; i++ )

{

    pSrc = (int *)pVideo + (nHeight - i - 1) * nWidth; // nFrameSize>>2 - ( i + 1 ) * nWidth;

    for( int j=0; j<nWidth-1; j++ ) // 防止内存玷污算法

    {

    *pDes = *(pSrc + j); pDes = (int *)( (char *)pDes + 3 );

    }


    *( ( (char *)pDes ) + 0 ) = *( ( (char *)pSrc ) + 0 ); // B

    *( ( (char *)pDes ) + 1 ) = *( ( (char *)pSrc ) + 1 ); // G

    *( ( (char *)pDes ) + 2 ) = *( ( (char *)pSrc ) + 2 ); // R

    

    pDes = (int *)( (char *)pDes + 3 ); // 目的地址调整算法

}


经测试统计:快速转换算法比普通转换算法效率提高至少3倍以上。


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部