织梦CMS - 轻松建站从此开始!

罗索

YUV422 转24位 BMP

jackyhwei 发布于 2011-07-20 09:53 点击:次 
由于做实验得到是YUV422文件,需要将其换成BMP,网上搜索不到现成的程序,于是写了个YUV422改成BMP的程序,是针对planar存储格式(UYVY)的YUV422转换成BMP格式的。
TAG:

由于做实验得到是YUV422文件,需要将其换成BMP,网上搜索不到现成的程序,于是写了个YUV422改成BMP的程序,是针对planar存储格式(UYVY)的YUV422转换成BMP格式的。

需要注意的是:bmp文件的数据存储方式是从左下角开始的,所以在作转换时,需要将行颠倒才能看到正常的转换

代码如下:

UYVY2BMP.h

 

  1. class CUYVY2BMP 
  2. public
  3.  
  4. CUYVY2BMP(int width, int height); 
  5. ~CUYVY2BMP(); 
  6. int GetHeight(); 
  7. int GetWidth(); 
  8. BOOL WriteBMPFile(LPSTR BMPFilename, BYTE *pRGBBuf, int iBitCount); 
  9. BOOL UYVY2BMP(BYTE* pDst, BYTE *pSrc); 
  10.  
  11. private
  12. void MakeConversionTable(); 
  13. int m_nHeight; 
  14. int m_nWidth; 
  15. }; 
  16.  
  17. typedef struct tagTABLE_UYVY2RGB 
  18. unsigned short YtoR[256]; 
  19. unsigned short YtoG[256]; 
  20. unsigned short YtoB[256]; 
  21. unsigned short UtoG[256]; 
  22. unsigned short UtoB[256]; 
  23. unsigned short VtoR[256]; 
  24. unsigned short VtoG[256]; 
  25. }TABLE_UYVY2RGB; 
  26.  
  27. TABLE_UYVY2RGB table_UYVY2rgb; 

 

UYVY2BMP.cpp

  1. // UYVY2BMP.cpp : Written by hszou 05/06/2009. 
  2. // 
  3.  
  4. #include "stdafx.h" 
  5. #include <windows.h> 
  6. #include <malloc.h> 
  7. #include "UYVY2BMP.h" 
  8.  
  9. #define clip(min, x, max) x=(x < min) ? min : (x > max) ? max : x 
  10. ////////////////////////////////////////////////////////////////////// 
  11. // Construction/Destruction 
  12. ////////////////////////////////////////////////////////////////////// 
  13. CUYVY2BMP::CUYVY2BMP(int width, int height) 
  14. m_nWidth = width; 
  15. m_nHeight = height; 
  16.  
  17. CUYVY2BMP::~CUYVY2BMP() 
  18.  
  19. ///accessor 
  20. int CUYVY2BMP::GetHeight() 
  21. return m_nHeight; 
  22.  
  23. int CUYVY2BMP::GetWidth() 
  24. return m_nWidth; 
  25.  
  26. void CUYVY2BMP::MakeConversionTable() 
  27.  
  28.  
  29. for (long j = 0; j < 256; ++j) 
  30. table_UYVY2rgb.YtoR[j] = table_UYVY2rgb.YtoG[j] 
  31. = table_UYVY2rgb.YtoB[j] = (unsigned short)(j << 7); 
  32. table_UYVY2rgb.VtoR[j] = j * 180;     //180=1.402*128 
  33. table_UYVY2rgb.VtoG[j] = j * 91; 
  34. table_UYVY2rgb.UtoG[j] = j * 44;      //0.3437 = 44/128 
  35. table_UYVY2rgb.UtoB[j] = j * 226;      //1.772 = 256/128 
  36.  
  37. BOOL CUYVY2BMP::UYVY2BMP(BYTE* pDst, BYTE *pSrc) 
  38. long m = 0; 
  39. long k = 0; 
  40. int n=m_nWidth/2; 
  41. int dec=m_nWidth*4; 
  42.  
  43. int tmpR0 = 0; 
  44. int tmpG0 = 0; 
  45. int tmpB0 = 0; 
  46. int tmpR1 = 0; 
  47. int tmpG1 = 0; 
  48. int tmpB1 = 0; 
  49. MakeConversionTable(); 
  50. k=(m_nHeight-1)*m_nWidth<<1;         //k指向最后一行 
  51. forint i=m_nHeight-1;i>-1;i--) 
  52.    
  53.    for(int j=0;j<n;j++) 
  54.    { 
  55.     tmpR0 = (table_UYVY2rgb.YtoR[pSrc[k + 1]]
  56.  + table_UYVY2rgb.VtoR[pSrc[k + 2]] - 22906) >> 7; 
  57.     tmpG0 = (table_UYVY2rgb.YtoG[pSrc[k + 1]]
  58.  - table_UYVY2rgb.VtoG[pSrc[k + 2]]
  59.  - table_UYVY2rgb.UtoG[pSrc[k + 0]] + 17264) >> 7; 
  60.     tmpB0 = (table_UYVY2rgb.YtoB[pSrc[k + 1]]
  61.  + table_UYVY2rgb.UtoB[pSrc[k + 0]] - 28928) >> 7; 
  62.     
  63.     tmpR1 = (table_UYVY2rgb.YtoR[pSrc[k + 3]]
  64.  + table_UYVY2rgb.VtoR[pSrc[k + 2]] - 22906) >> 7; 
  65.     tmpG1 = (table_UYVY2rgb.YtoG[pSrc[k + 3]]
  66.  - table_UYVY2rgb.VtoG[pSrc[k + 2]]
  67.  - table_UYVY2rgb.UtoG[pSrc[k + 0]] + 17264) >> 7; 
  68.     tmpB1 = (table_UYVY2rgb.YtoB[pSrc[k + 3]]
  69.  + table_UYVY2rgb.UtoB[pSrc[k + 0]] - 28928) >> 7; 
  70.     
  71.     clip(0, tmpR0, 255); 
  72.     clip(0, tmpG0, 255); 
  73.     clip(0, tmpB0, 255); 
  74.     clip(0, tmpR1, 255); 
  75.     clip(0, tmpG1, 255); 
  76.     clip(0, tmpB1, 255); 
  77.  
  78.     pDst[m + 0] = tmpB0;   
  79.     pDst[m + 1] = tmpG0;   
  80.     pDst[m + 2] = tmpR0;   
  81.     pDst[m + 3] = tmpB1;   
  82.     pDst[m + 4] = tmpG1;   
  83.     pDst[m + 5] = tmpR1;   
  84.     
  85.     k       +=       4;   
  86.     m       +=       6;   
  87.    }   
  88. k=k-dec; 
  89. return 1; 
  90.  
  91. BOOL CUYVY2BMP::WriteBMPFile(LPSTR BMPFilename, BYTE *pRGBBuf, int iBitCount) 
  92. long RGB_SIZE = m_nWidth * m_nHeight * 3; 
  93. if(iBitCount == 24) 
  94.    FILE *fp; 
  95.    long count=0; 
  96.    BITMAPFILEHEADER bmpHeader; 
  97.    BITMAPINFO bmpInfo; 
  98.    
  99.    if( (fp = fopen( BMPFilename, "wb")) == NULL ) 
  100.    { 
  101.     printf( "Can not create BMP file: %s\n", BMPFilename ); 
  102.     return FALSE; 
  103.    } 
  104.    
  105.    bmpHeader.bfType = 'MB'
  106.    bmpHeader.bfSize = RGB_SIZE + sizeof(BITMAPFILEHEADER)
  107.  + sizeof(BITMAPINFOHEADER); 
  108.    bmpHeader.bfReserved1 = 0; 
  109.    bmpHeader.bfReserved2 = 0; 
  110.    bmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER)
  111.  + sizeof(BITMAPINFOHEADER); 
  112.    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
  113.    bmpInfo.bmiHeader.biWidth = m_nWidth; 
  114.    bmpInfo.bmiHeader.biHeight = m_nHeight; 
  115.    bmpInfo.bmiHeader.biPlanes = 1; 
  116.    bmpInfo.bmiHeader.biBitCount = 24; 
  117.    bmpInfo.bmiHeader.biCompression = BI_RGB; 
  118.    bmpInfo.bmiHeader.biSizeImage = RGB_SIZE; 
  119.    bmpInfo.bmiHeader.biXPelsPerMeter = 0; 
  120.    bmpInfo.bmiHeader.biYPelsPerMeter = 0; 
  121.    bmpInfo.bmiHeader.biClrUsed = 0; 
  122.    bmpInfo.bmiHeader.biClrImportant = 0; 
  123.    
  124.    if ((count=fwrite(&bmpHeader, 1, sizeof(BITMAPFILEHEADER), fp))
  125.  != sizeof(BITMAPFILEHEADER)) 
  126.     printf( "write BMP file header failed: count=%d\n", count); 
  127.    
  128.    if ((count=fwrite(&(bmpInfo.bmiHeader), 1, sizeof(BITMAPINFOHEADER), fp))
  129.  != sizeof(BITMAPINFOHEADER)) 
  130.     printf( "Read BMP file info failed: count=%d\n", count); 
  131.    if ((count=fwrite(pRGBBuf, 1, RGB_SIZE, fp)) != RGB_SIZE) 
  132.     printf( "write BMP file data failed: count=%d\n", count); 
  133.    fclose(fp); 
  134.    return TRUE; 
  135. else 
  136.    return FALSE; 

调用及测试示例代码:

  1. int main(char argc, char* argv[]) 
  2. CUYVY2BMP test(352,288); 
  3.  
  4. FILE *pFYUV; 
  5.  
  6. if ((pFYUV = fopen(argv[1],"rb")) == NULL) 
  7.    return 0; 
  8.  
  9. BYTE * pSrcBuf = (BYTE *)malloc(test.GetHeight()*test.GetWidth()*2); 
  10. BYTE * pDstBuf = (BYTE *)malloc(test.GetHeight()*test.GetWidth()*3); 
  11.  
  12. fread(pSrcBuf, 1, test.GetHeight()*test.GetWidth()*2, pFYUV); 
  13.  
  14. test.UYVY2BMP(pDstBuf, pSrcBuf); 
  15.  
  16. test.WriteBMPFile(argv[2], pDstBuf, 24); 
  17.  
  18. return 0; 

 

(ecice)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201107/14730.html]
本文出处:hi.baidu.com/ecice 作者:ecice
顶一下
(3)
100%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容