博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
YUV转RGB的相关函数
阅读量:2383 次
发布时间:2019-05-10

本文共 2392 字,大约阅读时间需要 7 分钟。

YUV RGB 转换的函数很有帮助的。

转:

 

[java]
  1. 1.  static void ccvt_420p_rgb565(int width, int height, const unsigned char *src, __u16 *dst)    
  2. 2.  {    
  3. 3.  int line, col, linewidth;    
  4. 4.  int y, u, v, yy, vr, ug, vg, ub;    
  5. 5.  int r, g, b;    
  6. 6.  const unsigned char *py, *pu, *pv;    
  7. 7.      
  8. 8.  linewidth = width >> 1;    
  9. 9.  py = src;    
  10. 10. pu = py + (width * height);    
  11. 11. pv = pu + (width * height) / 4;    
  12. 12.     
  13. 13. y = *py++;    
  14. 14. yy = y << 8;    
  15. 15. u = *pu - 128;    
  16. 16. ug =   88 * u;    
  17. 17. ub = 454 * u;    
  18. 18. v = *pv - 128;    
  19. 19. vg = 183 * v;    
  20. 20. vr = 359 * v;    
  21. 21.     
  22. 22for (line = 0; line < height; line++) {    
  23. 23.    for (col = 0; col < width; col++) {    
  24. 24.     r = (yy +      vr) >> 8;    
  25. 25.     g = (yy - ug - vg) >> 8;    
  26. 26.     b = (yy + ub     ) >> 8;    
  27. 27.     
  28. 28.     if (r < 0)   r = 0;    
  29. 29.     if (r > 255) r = 255;    
  30. 30.     if (g < 0)   g = 0;    
  31. 31.     if (g > 255) g = 255;    
  32. 32.     if (b < 0)   b = 0;    
  33. 33.     if (b > 255) b = 255;    
  34. 34.    *dst++ = (((__u16)r>>3)<<11) | (((__u16)g>>2)<<5) | (((__u16)b>>3)<<0);    
  35. 35.       
  36. 36.     y = *py++;    
  37. 37.     yy = y << 8;    
  38. 38.     if (col & 1) {    
  39. 39.      pu++;    
  40. 40.      pv++;    
  41. 41.     
  42. 42.      u = *pu - 128;    
  43. 43.      ug =   88 * u;    
  44. 44.      ub = 454 * u;    
  45. 45.      v = *pv - 128;    
  46. 46.      vg = 183 * v;    
  47. 47.      vr = 359 * v;    
  48. 48.     }    
  49. 49.    } /* ..for col */    
  50. 50.    if ((line & 1) == 0) { // even line: rewind    
  51. 51.     pu -= linewidth;    
  52. 52.     pv -= linewidth;    
  53. 53.    }    
  54. 54. } /* ..for line */    
  55. 55. }    
 

YUV422 ---->>RGB565的

[java]
  1. #define YCbCrtoR(Y,Cb,Cr) (1000*Y + 1371*(Cr-128))/1000    
  2. #define YCbCrtoG(Y,Cb,Cr) (1000*Y - 336*(Cb-128) - 698*(Cr-128))/1000    
  3. #define YCbCrtoB(Y,Cb,Cr) (1000*Y + 1732*(Cb-128))/1000    
  4. #define min(x1, x2)   (((x1)<(x2))?(x1):(x2))    
  5.     
  6. __u32 Conv_YCbCr_Rgb(__u8 y0, __u8 y1, __u8 cb0, __u8 cr0)    
  7. {    
  8. // bit order is    
  9. // YCbCr = [Cr0 Y1 Cb0 Y0], RGB=[R1,G1,B1,R0,G0,B0].    
  10.     
  11. int r0, g0, b0, r1, g1, b1;    
  12. __u16 rgb0, rgb1;    
  13. __u32 rgb;    
  14.     
  15. #if 1 // 4 frames/s @192MHz, 12MHz ; 6 frames/s @450MHz, 12MHz    
  16. r0 = YCbCrtoR(y0, cb0, cr0);    
  17. g0 = YCbCrtoG(y0, cb0, cr0);    
  18. b0 = YCbCrtoB(y0, cb0, cr0);    
  19. r1 = YCbCrtoR(y1, cb0, cr0);    
  20. g1 = YCbCrtoG(y1, cb0, cr0);    
  21. b1 = YCbCrtoB(y1, cb0, cr0);    
  22. #endif    
  23.     
  24. if (r0>255 ) r0 = 255;    
  25. if (r0<0) r0 = 0;    
  26. if (g0>255 ) g0 = 255;    
  27. if (g0<0) g0 = 0;    
  28. if (b0>255 ) b0 = 255;    
  29. if (b0<0) b0 = 0;    
  30.     
  31. if (r1>255 ) r1 = 255;    
  32. if (r1<0) r1 = 0;    
  33. if (g1>255 ) g1 = 255;    
  34. if (g1<0) g1 = 0;    
  35. if (b1>255 ) b1 = 255;    
  36. if (b1<0) b1 = 0;    
  37.     
  38. // 5:6:5 16bit format    
  39. rgb0 = (((__u16)r0>>3)<<11) | (((__u16)g0>>2)<<5) | (((__u16)b0>>3)<<0); //RGB565.    
  40. rgb1 = (((__u16)r1>>3)<<11) | (((__u16)g1>>2)<<5) | (((__u16)b1>>3)<<0); //RGB565.    
  41.     
  42. rgb = (rgb1<<16) | rgb0;    
  43.     
  44. return(rgb);    
  45. }   

转载地址:http://cnuab.baihongyu.com/

你可能感兴趣的文章
罗马数字与阿拉伯数字的相互转化
查看>>
3Sum
查看>>
Next Permutation
查看>>
sys文件系统
查看>>
Mysql常用命令大全
查看>>
Linux内核中C编程生僻用法(GNU C)
查看>>
辞职后五险一金怎么处理?
查看>>
几种开源的TCP/IP协议栈对比
查看>>
C语言之断言
查看>>
程序员技术练级攻略
查看>>
#define
查看>>
C语言之if...else PK switch...case
查看>>
关于SVN方面的问题
查看>>
深入理解C语言
查看>>
编程成就:开发人员如何升级
查看>>
如何防止代码腐烂
查看>>
va_start va_end 的使用和原理
查看>>
Linux 中的零拷贝技术,第 2 部分
查看>>
零拷贝技术的研究与实现
查看>>
零拷贝与 sendfile
查看>>