`
xpp02
  • 浏览: 1049266 次
社区版块
存档分类
最新评论

RGB 24和YUY2相互转换

 
阅读更多

YUY2经常用于电视制式以及许多摄像头的输出格式.而我们在处理时经常需要将其转化为RGB进行处理,这里简单介绍下YUY2(YUV)与RGB之间相互转化的关系:

http://msdn2.microsoft.com/en-us/library/ms893078.aspx

YUY2(YUV) To RGB:

C = Y - 16

D = U - 128

E = V - 128

R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)

其中 clip()为限制函数,将其取值限制在0-255之间.

RGB To YUY2(YUV):

Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128

上述两个公式在代码中的
int YUV2RGB(void* pYUV, void* pRGB, int width, int height, bool alphaYUV, bool alphaRGB);
int RGB2YUV(void* pRGB, void* pYUVX, int width, int height, bool alphaYUV, bool alphaRGB);
函数中转换。

在诸如摄像头的数据获取中,我们往往需要直接在YUY2(YUV)空间上进行一些图象处理,我们希望能够在YUY2
(YUV)进行一些RGB上可以做到的处理。这里已blending为例,将两张带有透明度的YUY2(YUV)图片进行叠加,
以达到在RGB空间进行图像合成的效果。

RGB空间进行图像叠加,通常背景(BG)是不透明的,而前景(FG)是带有透明度的。在RGB空间,可以简单表示为:
Rdest = Rfg*alpha + Rbg*(1-alpha);
Gdest = Gfg*alpha + Gbg*(1-alpha);
Bdest = Bfg*alpha + Bbg*(1-alpha);
// Rdest、Gdest、Bdest 为最终合成后的像素值

考虑到
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
我们可以推导出

(Ydest-16)<<8 = ((Yfg-16)<<8)*alpha + ((Ybg-16)<<8)*(1-alpha);
(Udest-128)<<8 = ((Ufg-128)<<8)*alpha + ((Ubg-128)<<8)*(1-alpha);
(Vdest-128)<<8 = ((Vfg-128)<<8)*alpha + ((Vbg-128)<<8)*(1-alpha);

从而可以得到
Ydest = (Yfg-16)*alpha + (Ybg-16)*(1-alpha) + 16;
Udest = (Ufg-128)*alpha + (Ubg-128)*(1-alpha) + 128;
Vdest = (Vfg-128)*alpha + (Vbg-128)*(1-alpha) + 128;

这个叠加过程在函数
int YUVBlending(void* pBGYUV, void* pFGYUV, int width, int height, bool alphaBG, bool alphaFG)
中实现。

由于本文针对摄像头采集所得的数据进行处理,因此数据为YUY2格式,即4个字节来表示两个像素点的YUV信息,
排列为Y1 U1 Y2 V2, 对于像素点1为(Y1, U1, V1),像素点2为(Y2, U1, V1)。即两个像素点共用U、V信息。

这里假设带有alpha透明度的YUV格式用6个字节来表示两个像素点的YUV以及alpha信息,排列为 Y1 U1 Y2 V1 alpha1 alpha2
其中像素点1为(Y1, U1, V1, alpha1),像素点2为(Y2, U1, V1, alpha2)。其中alpha为对应点的透明度信息。

而带有alpha透明度RGB格式的图片,假设为32bits的BMP图片,每个像素点用4bytes来表示,分别为B G R alpha信息。

上述函数的具体实现为:
  1. //////////////////////////////////////////////////////////////////////////
  2. //YUV2RGB
  3. //pYUVpointtotheYUVdata
  4. //pRGBpointtotheRGBdata
  5. //widthwidthofthepicture
  6. //heightheightofthepicture
  7. //alphaYUVisthereanalphachannelinYUV
  8. //alphaRGBisthereanalphachannelinRGB
  9. //////////////////////////////////////////////////////////////////////////
  10. intYUV2RGB(void*pYUV,void*pRGB,intwidth,intheight,boolalphaYUV,boolalphaRGB)
  11. {
  12. if(NULL==pYUV)
  13. {
  14. return-1;
  15. }
  16. unsignedchar*pYUVData=(unsignedchar*)pYUV;
  17. unsignedchar*pRGBData=(unsignedchar*)pRGB;
  18. if(NULL==pRGBData)
  19. {
  20. if(alphaRGB)
  21. {
  22. pRGBData=newunsignedchar[width*height*4];
  23. }
  24. else
  25. pRGBData=newunsignedchar[width*height*3];
  26. }
  27. intY1,U1,V1,Y2,alpha1,alpha2,R1,G1,B1,R2,G2,B2;
  28. intC1,D1,E1,C2;
  29. if(alphaRGB)
  30. {
  31. if(alphaYUV)
  32. {
  33. for(inti=0;i<height;++i)
  34. {
  35. for(intj=0;j<width/2;++j)
  36. {
  37. Y1=*(pYUVData+i*width*3+j*6);
  38. U1=*(pYUVData+i*width*3+j*6+1);
  39. Y2=*(pYUVData+i*width*3+j*6+2);
  40. V1=*(pYUVData+i*width*3+j*6+3);
  41. alpha1=*(pYUVData+i*width*3+j*6+4);
  42. alpha2=*(pYUVData+i*width*3+j*6+5);
  43. C1=Y1-16;
  44. C2=Y2-16;
  45. D1=U1-128;
  46. E1=V1-128;
  47. R1=((298*C1+409*E1+128)>>8>255?255:(298*C1+409*E1+128)>>8);
  48. G1=((298*C1-100*D1-208*E1+128)>>8>255?255:(298*C1-100*D1-208*E1+128)>>8);
  49. B1=((298*C1+516*D1+128)>>8>255?255:(298*C1+516*D1+128)>>8);
  50. R2=((298*C2+409*E1+128)>>8>255?255:(298*C2+409*E1+128)>>8);
  51. G2=((298*C2-100*D1-208*E1+128)>>8>255?255:(298*C2-100*D1-208*E1+128)>>8);
  52. B2=((298*C2+516*D1+128)>>8>255?255:(298*C2+516*D1+128)>>8);
  53. *(pRGBData+(height-i-1)*width*4+j*8+2)=R1<0?0:R1;
  54. *(pRGBData+(height-i-1)*width*4+j*8+1)=G1<0?0:G1;
  55. *(pRGBData+(height-i-1)*width*4+j*8)=B1<0?0:B1;
  56. *(pRGBData+(height-i-1)*width*4+j*8+3)=alpha1;
  57. *(pRGBData+(height-i-1)*width*4+j*8+6)=R2<0?0:R2;
  58. *(pRGBData+(height-i-1)*width*4+j*8+5)=G2<0?0:G2;
  59. *(pRGBData+(height-i-1)*width*4+j*8+4)=B2<0?0:B2;
  60. *(pRGBData+(height-i-1)*width*4+j*8+7)=alpha2;
  61. }
  62. }
  63. }
  64. else
  65. {
  66. intalpha=255;
  67. for(inti=0;i<height;++i)
  68. {
  69. for(intj=0;j<width/2;++j)
  70. {
  71. Y1=*(pYUVData+i*width*2+j*4);
  72. U1=*(pYUVData+i*width*2+j*4+1);
  73. Y2=*(pYUVData+i*width*2+j*4+2);
  74. V1=*(pYUVData+i*width*2+j*4+3);
  75. C1=Y1-16;
  76. C2=Y2-16;
  77. D1=U1-128;
  78. E1=V1-128;
  79. R1=((298*C1+409*E1+128)>>8>255?255:(298*C1+409*E1+128)>>8);
  80. G1=((298*C1-100*D1-208*E1+128)>>8>255?255:(298*C1-100*D1-208*E1+128)>>8);
  81. B1=((298*C1+516*D1+128)>>8>255?255:(298*C1+516*D1+128)>>8);
  82. R2=((298*C2+409*E1+128)>>8>255?255:(298*C2+409*E1+128)>>8);
  83. G2=((298*C2-100*D1-208*E1+128)>>8>255?255:(298*C2-100*D1-208*E1+128)>>8);
  84. B2=((298*C2+516*D1+128)>>8>255?255:(298*C2+516*D1+128)>>8);
  85. *(pRGBData+(height-i-1)*width*4+j*8+2)=R1<0?0:R1;
  86. *(pRGBData+(height-i-1)*width*4+j*8+1)=G1<0?0:G1;
  87. *(pRGBData+(height-i-1)*width*4+j*8)=B1<0?0:B1;
  88. *(pRGBData+(height-i-1)*width*4+j*8+3)=alpha;
  89. *(pRGBData+(height-i-1)*width*4+j*8+6)=R2<0?0:R2;
  90. *(pRGBData+(height-i-1)*width*4+j*8+5)=G2<0?0:G2;
  91. *(pRGBData+(height-i-1)*width*4+j*8+4)=B2<0?0:B2;
  92. *(pRGBData+(height-i-1)*width*4+j*8+7)=alpha;
  93. }
  94. }
  95. }
  96. }
  97. else
  98. {
  99. if(alphaYUV)
  100. {
  101. for(inti=0;i<height;++i)
  102. {
  103. for(intj=0;j<width/2;++j)
  104. {
  105. Y1=*(pYUVData+i*width*3+j*4);
  106. U1=*(pYUVData+i*width*3+j*4+1);
  107. Y2=*(pYUVData+i*width*3+j*4+2);
  108. V1=*(pYUVData+i*width*3+j*4+3);
  109. C1=Y1-16;
  110. C2=Y2-16;
  111. D1=U1-128;
  112. E1=V1-128;
  113. R1=((298*C1+409*E1+128)>>8>255?255:(298*C1+409*E1+128)>>8);
  114. G1=((298*C1-100*D1-208*E1+128)>>8>255?255:(298*C1-100*D1-208*E1+128)>>8);
  115. B1=((298*C1+516*D1+128)>>8>255?255:(298*C1+516*D1+128)>>8);
  116. R2=((298*C2+409*E1+128)>>8>255?255:(298*C2+409*E1+128)>>8);
  117. G2=((298*C2-100*D1-208*E1+128)>>8>255?255:(298*C2-100*D1-208*E1+128)>>8);
  118. B2=((298*C2+516*D1+128)>>8>255?255:(298*C2+516*D1+128)>>8);
  119. *(pRGBData+(height-i-1)*width*3+j*6+2)=R1<0?0:R1;
  120. *(pRGBData+(height-i-1)*width*3+j*6+1)=G1<0?0:G1;
  121. *(pRGBData+(height-i-1)*width*3+j*6)=B1<0?0:B1;
  122. *(pRGBData+(height-i-1)*width*3+j*6+5)=R2<0?0:R2;
  123. *(pRGBData+(height-i-1)*width*3+j*6+4)=G2<0?0:G2;
  124. *(pRGBData+(height-i-1)*width*3+j*6+3)=B2<0?0:B2;
  125. }
  126. }
  127. }
  128. else
  129. {
  130. for(inti=0;i<height;++i)
  131. {
  132. for(intj=0;j<width/2;++j)
  133. {
  134. Y1=*(pYUVData+i*width*2+j*4);
  135. U1=*(pYUVData+i*width*2+j*4+1);
  136. Y2=*(pYUVData+i*width*2+j*4+2);
  137. V1=*(pYUVData+i*width*2+j*4+3);
  138. C1=Y1-16;
  139. C2=Y2-16;
  140. D1=U1-128;
  141. E1=V1-128;
  142. R1=((298*C1+409*E1+128)>>8>255?255:(298*C1+409*E1+128)>>8);
  143. G1=((298*C1-100*D1-208*E1+128)>>8>255?255:(298*C1-100*D1-208*E1+128)>>8);
  144. B1=((298*C1+516*D1+128)>>8>255?255:(298*C1+516*D1+128)>>8);
  145. R2=((298*C2+409*E1+128)>>8>255?255:(298*C2+409*E1+128)>>8);
  146. G2=((298*C2-100*D1-208*E1+128)>>8>255?255:(298*C2-100*D1-208*E1+128)>>8);
  147. B2=((298*C2+516*D1+128)>>8>255?255:(298*C2+516*D1+128)>>8);
  148. *(pRGBData+(height-i-1)*width*3+j*6+2)=R1<0?0:R1;
  149. *(pRGBData+(height-i-1)*width*3+j*6+1)=G1<0?0:G1;
  150. *(pRGBData+(height-i-1)*width*3+j*6)=B1<0?0:B1;
  151. *(pRGBData+(height-i-1)*width*3+j*6+5)=R2<0?0:R2;
  152. *(pRGBData+(height-i-1)*width*3+j*6+4)=G2<0?0:G2;
  153. *(pRGBData+(height-i-1)*width*3+j*6+3)=B2<0?0:B2;
  154. }
  155. }
  156. }
  157. }
  158. return0;
  159. }
  160. //////////////////////////////////////////////////////////////////////////
  161. //RGB2YUV
  162. //pRGBpointtotheRGBdata
  163. //pYUVpointtotheYUVdata
  164. //widthwidthofthepicture
  165. //heightheightofthepicture
  166. //alphaYUVisthereanalphachannelinYUV
  167. //alphaRGBisthereanalphachannelinRGB
  168. //////////////////////////////////////////////////////////////////////////
  169. intRGB2YUV(void*pRGB,void*pYUV,intwidth,intheight,boolalphaYUV,boolalphaRGB)
  170. {
  171. if(NULL==pRGB)
  172. {
  173. return-1;
  174. }
  175. unsignedchar*pRGBData=(unsignedchar*)pRGB;
  176. unsignedchar*pYUVData=(unsignedchar*)pYUV;
  177. if(NULL==pYUVData)
  178. {
  179. if(alphaYUV)
  180. {
  181. pYUVData=newunsignedchar[width*height*3];
  182. }
  183. else
  184. pYUVData=newunsignedchar[width*height*2];
  185. }
  186. intR1,G1,B1,R2,G2,B2,Y1,U1,Y2,V1;
  187. intalpha1,alpha2;
  188. if(alphaYUV)
  189. {
  190. if(alphaRGB)
  191. {
  192. for(inti=0;i<height;++i)
  193. {
  194. for(intj=0;j<width/2;++j)
  195. {
  196. B1=*(pRGBData+(height-i-1)*width*4+j*8);
  197. G1=*(pRGBData+(height-i-1)*width*4+j*8+1);
  198. R1=*(pRGBData+(height-i-1)*width*4+j*8+2);
  199. alpha1=*(pRGBData+(height-i-1)*width*4+j*8+3);
  200. B2=*(pRGBData+(height-i-1)*width*4+j*8+4);
  201. G2=*(pRGBData+(height-i-1)*width*4+j*8+5);
  202. R2=*(pRGBData+(height-i-1)*width*4+j*8+6);
  203. alpha2=*(pRGBData+(height-i-1)*width*4+j*8+7);
  204. Y1=(((66*R1+129*G1+25*B1+128)>>8)+16)>255?255:(((66*R1+129*G1+25*B1+128)>>8)+16);
  205. U1=((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128)>255?255:((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128);
  206. Y2=(((66*R2+129*G2+25*B2+128)>>8)+16)>255?255:((66*R2+129*G2+25*B2+128)>>8)+16;
  207. V1=((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128)>255?255:((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128);
  208. *(pYUVData+i*width*3+j*6)=Y1;
  209. *(pYUVData+i*width*3+j*6+1)=U1;
  210. *(pYUVData+i*width*3+j*6+2)=Y2;
  211. *(pYUVData+i*width*3+j*6+3)=V1;
  212. *(pYUVData+i*width*3+j*6+4)=alpha1;
  213. *(pYUVData+i*width*3+j*6+5)=alpha2;
  214. }
  215. }
  216. }
  217. else
  218. {
  219. unsignedcharalpha=255;
  220. for(inti=0;i<height;++i)
  221. {
  222. for(intj=0;j<width/2;++j)
  223. {
  224. B1=*(pRGBData+(height-i-1)*width*3+j*6);
  225. G1=*(pRGBData+(height-i-1)*width*3+j*6+1);
  226. R1=*(pRGBData+(height-i-1)*width*3+j*6+2);
  227. B2=*(pRGBData+(height-i-1)*width*3+j*6+3);
  228. G2=*(pRGBData+(height-i-1)*width*3+j*6+4);
  229. R2=*(pRGBData+(height-i-1)*width*3+j*6+5);
  230. Y1=((66*R1+129*G1+25*B1+128)>>8)+16;
  231. U1=((-38*R1-74*G1+112*B1+128)>>8+(-38*R2-74*G2+112*B2+128)>>8)/2+128;
  232. Y2=((66*R2+129*G2+25*B2+128)>>8)+16;
  233. V1=((112*R1-94*G1-18*B1+128)>>8+(112*R2-94*G2-18*B2+128)>>8)/2+128;
  234. Y1=(((66*R1+129*G1+25*B1+128)>>8)+16)>255?255:(((66*R1+129*G1+25*B1+128)>>8)+16);
  235. U1=((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128)>255?255:((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128);
  236. Y2=(((66*R2+129*G2+25*B2+128)>>8)+16)>255?255:((66*R2+129*G2+25*B2+128)>>8)+16;
  237. V1=((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128)>255?255:((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128);
  238. *(pYUVData+i*width*3+j*6)=Y1;
  239. *(pYUVData+i*width*3+j*6+1)=U1;
  240. *(pYUVData+i*width*3+j*6+2)=Y2;
  241. *(pYUVData+i*width*3+j*6+3)=V1;
  242. *(pYUVData+i*width*3+j*6+4)=alpha;
  243. *(pYUVData+i*width*3+j*6+5)=alpha;
  244. }
  245. }
  246. }
  247. }
  248. else
  249. {
  250. if(alphaRGB)
  251. {
  252. for(inti=0;i<height;++i)
  253. {
  254. for(intj=0;j<width/2;++j)
  255. {
  256. B1=*(pRGBData+(height-i-1)*width*4+j*8);
  257. G1=*(pRGBData+(height-i-1)*width*4+j*8+1);
  258. R1=*(pRGBData+(height-i-1)*width*4+j*8+2);
  259. B2=*(pRGBData+(height-i-1)*width*4+j*8+4);
  260. G2=*(pRGBData+(height-i-1)*width*4+j*8+5);
  261. R2=*(pRGBData+(height-i-1)*width*4+j*8+6);
  262. Y1=(((66*R1+129*G1+25*B1+128)>>8)+16)>255?255:(((66*R1+129*G1+25*B1+128)>>8)+16);
  263. U1=((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128)>255?255:((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128);
  264. Y2=(((66*R2+129*G2+25*B2+128)>>8)+16)>255?255:((66*R2+129*G2+25*B2+128)>>8)+16;
  265. V1=((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128)>255?255:((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128);
  266. *(pYUVData+i*width*2+j*4)=Y1;
  267. *(pYUVData+i*width*2+j*4+1)=U1;
  268. *(pYUVData+i*width*2+j*4+2)=Y2;
  269. *(pYUVData+i*width*2+j*4+3)=V1;
  270. }
  271. }
  272. }
  273. else
  274. {
  275. for(inti=0;i<height;++i)
  276. {
  277. for(intj=0;j<width/2;++j)
  278. {
  279. B1=*(pRGBData+(height-i-1)*width*3+j*6);
  280. G1=*(pRGBData+(height-i-1)*width*3+j*6+1);
  281. R1=*(pRGBData+(height-i-1)*width*3+j*6+2);
  282. B2=*(pRGBData+(height-i-1)*width*3+j*6+3);
  283. G2=*(pRGBData+(height-i-1)*width*3+j*6+4);
  284. R2=*(pRGBData+(height-i-1)*width*3+j*6+5);
  285. Y1=(((66*R1+129*G1+25*B1+128)>>8)+16)>255?255:(((66*R1+129*G1+25*B1+128)>>8)+16);
  286. U1=((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128)>255?255:((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128);
  287. Y2=(((66*R2+129*G2+25*B2+128)>>8)+16)>255?255:((66*R2+129*G2+25*B2+128)>>8)+16;
  288. V1=((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128)>255?255:((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128);
  289. *(pYUVData+i*width*2+j*4)=Y1;
  290. *(pYUVData+i*width*2+j*4+1)=U1;
  291. *(pYUVData+i*width*2+j*4+2)=Y2;
  292. *(pYUVData+i*width*2+j*4+3)=V1;
  293. }
  294. }
  295. }
  296. }
  297. return0;
  298. }
  299. //////////////////////////////////////////////////////////////////////////
  300. //pGBYUVpointtothebackgroundYUVdata
  301. //pFGYUVpointtotheforegroundYUVdata
  302. //widthwidthofthepicture
  303. //heightheightofthepicture
  304. //alphaBGisthereanalphachannelinbackgroundYUVdata
  305. //alphaFGisthereanalphachannelinfourgroundYUVdata
  306. //////////////////////////////////////////////////////////////////////////
  307. intYUVBlending(void*pBGYUV,void*pFGYUV,intwidth,intheight,boolalphaBG,boolalphaFG)
  308. {
  309. if(NULL==pBGYUV||NULL==pFGYUV)
  310. {
  311. return-1;
  312. }
  313. unsignedchar*pBGData=(unsignedchar*)pBGYUV;
  314. unsignedchar*pFGData=(unsignedchar*)pFGYUV;
  315. if(!alphaFG)
  316. {
  317. if(!alphaBG)
  318. {
  319. memcpy(pBGData,pFGData,width*height*2);
  320. }
  321. else
  322. {
  323. for(inti=0;i<height;++i)
  324. {
  325. for(intj=0;j<width/2;++j)
  326. {
  327. *(pBGData+i*width*2+j*4)=*(pFGData+i*width*2+j*4);
  328. *(pBGData+i*width*2+j*4+1)=*(pFGData+i*width*2+j*4+1);
  329. *(pBGData+i*width*2+j*4+2)=*(pFGData+i*width*2+j*4+2);
  330. *(pBGData+i*width*2+j*4+3)=*(pFGData+i*width*2+j*4+3);
  331. }
  332. }
  333. }
  334. }
  335. intY11,U11,V11,Y12,Y21,U21,V21,Y22;
  336. intalpha1,alpha2;
  337. if(!alphaBG)
  338. {
  339. for(inti=0;i<height;++i)
  340. {
  341. for(intj=0;j<width/2;++j)
  342. {
  343. Y11=*(pBGData+i*width*2+j*4);
  344. U11=*(pBGData+i*width*2+j*4+1);
  345. Y12=*(pBGData+i*width*2+j*4+2);
  346. V11=*(pBGData+i*width*2+j*4+3);
  347. Y21=*(pFGData+i*width*3+j*6);
  348. U21=*(pFGData+i*width*3+j*6+1);
  349. Y22=*(pFGData+i*width*3+j*6+2);
  350. V21=*(pFGData+i*width*3+j*6+3);
  351. alpha1=*(pFGData+i*width*3+j*6+4);
  352. alpha2=*(pFGData+i*width*3+j*6+5);
  353. *(pBGData+i*width*2+j*4)=(Y21-16)*alpha1/255+(Y11-16)*(255-alpha1)/255+16;
  354. *(pBGData+i*width*2+j*4+1)=((U21-128)*alpha1/255+(U11-128)*(255-alpha1)/255+(U21-128)*alpha2/255+(U11-128)*(255-alpha2)/255)/2+128;
  355. *(pBGData+i*width*2+j*4+3)=((V21-128)*alpha1/255+(V11-128)*(255-alpha1)/255+(V21-128)*alpha2/255+(V11-128)*(255-alpha2)/255)/2+128;
  356. *(pBGData+i*width*2+j*4+2)=(Y22-16)*alpha2/255+(Y12-16)*(255-alpha2)/255+16;
  357. }
  358. }
  359. }
  360. else
  361. {
  362. for(inti=0;i<height;++i)
  363. {
  364. for(intj=0;j<width/2;++j)
  365. {
  366. Y11=*(pBGData+i*width*3+j*6);
  367. U11=*(pBGData+i*width*3+j*6+1);
  368. Y12=*(pBGData+i*width*3+j*6+2);
  369. V11=*(pBGData+i*width*3+j*6+3);
  370. Y21=*(pFGData+i*width*3+j*6);
  371. U21=*(pFGData+i*width*3+j*6+1);
  372. Y22=*(pFGData+i*width*3+j*6+2);
  373. V21=*(pFGData+i*width*3+j*6+3);
  374. alpha1=*(pFGData+i*width*3+j*6+4);
  375. alpha2=*(pFGData+i*width*3+j*6+5);
  376. *(pBGData+i*width*3+j*6)=(Y21-16)*alpha1/255+(Y11-16)*(255-alpha1)/255+16;
  377. *(pBGData+i*width*3+j*6+1)=((U21-128)*alpha1/255+(U11-128)*(255-alpha1)/255+(U21-128)*alpha2/255+(U11-128)*(255-alpha2)/255)/2+128;
  378. *(pBGData+i*width*3+j*6+3)=((V21-128)*alpha1/255+(V11-128)*(255-alpha1)/255+(V21-128)*alpha2/255+(V11-128)*(255-alpha2)/255)/2+128;
  379. *(pBGData+i*width*3+j*6+2)=(Y22-16)*alpha2/255+(Y12-16)*(255-alpha2)/255+16;
  380. }
  381. }
  382. }
  383. return0;
  384. }
  1. //////////////////////////////////////////////////////////////////////////
  2. //YUV2RGB
  3. //pYUVpointtotheYUVdata
  4. //pRGBpointtotheRGBdata
  5. //widthwidthofthepicture
  6. //heightheightofthepicture
  7. //alphaYUVisthereanalphachannelinYUV
  8. //alphaRGBisthereanalphachannelinRGB
  9. //////////////////////////////////////////////////////////////////////////
  10. intYUV2RGB(void*pYUV,void*pRGB,intwidth,intheight,boolalphaYUV,boolalphaRGB)
  11. {
  12. if(NULL==pYUV)
  13. {
  14. return-1;
  15. }
  16. unsignedchar*pYUVData=(unsignedchar*)pYUV;
  17. unsignedchar*pRGBData=(unsignedchar*)pRGB;
  18. if(NULL==pRGBData)
  19. {
  20. if(alphaRGB)
  21. {
  22. pRGBData=newunsignedchar[width*height*4];
  23. }
  24. else
  25. pRGBData=newunsignedchar[width*height*3];
  26. }
  27. intY1,U1,V1,Y2,alpha1,alpha2,R1,G1,B1,R2,G2,B2;
  28. intC1,D1,E1,C2;
  29. if(alphaRGB)
  30. {
  31. if(alphaYUV)
  32. {
  33. for(inti=0;i<height;++i)
  34. {
  35. for(intj=0;j<width/2;++j)
  36. {
  37. Y1=*(pYUVData+i*width*3+j*6);
  38. U1=*(pYUVData+i*width*3+j*6+1);
  39. Y2=*(pYUVData+i*width*3+j*6+2);
  40. V1=*(pYUVData+i*width*3+j*6+3);
  41. alpha1=*(pYUVData+i*width*3+j*6+4);
  42. alpha2=*(pYUVData+i*width*3+j*6+5);
  43. C1=Y1-16;
  44. C2=Y2-16;
  45. D1=U1-128;
  46. E1=V1-128;
  47. R1=((298*C1+409*E1+128)>>8>255?255:(298*C1+409*E1+128)>>8);
  48. G1=((298*C1-100*D1-208*E1+128)>>8>255?255:(298*C1-100*D1-208*E1+128)>>8);
  49. B1=((298*C1+516*D1+128)>>8>255?255:(298*C1+516*D1+128)>>8);
  50. R2=((298*C2+409*E1+128)>>8>255?255:(298*C2+409*E1+128)>>8);
  51. G2=((298*C2-100*D1-208*E1+128)>>8>255?255:(298*C2-100*D1-208*E1+128)>>8);
  52. B2=((298*C2+516*D1+128)>>8>255?255:(298*C2+516*D1+128)>>8);
  53. *(pRGBData+(height-i-1)*width*4+j*8+2)=R1<0?0:R1;
  54. *(pRGBData+(height-i-1)*width*4+j*8+1)=G1<0?0:G1;
  55. *(pRGBData+(height-i-1)*width*4+j*8)=B1<0?0:B1;
  56. *(pRGBData+(height-i-1)*width*4+j*8+3)=alpha1;
  57. *(pRGBData+(height-i-1)*width*4+j*8+6)=R2<0?0:R2;
  58. *(pRGBData+(height-i-1)*width*4+j*8+5)=G2<0?0:G2;
  59. *(pRGBData+(height-i-1)*width*4+j*8+4)=B2<0?0:B2;
  60. *(pRGBData+(height-i-1)*width*4+j*8+7)=alpha2;
  61. }
  62. }
  63. }
  64. else
  65. {
  66. intalpha=255;
  67. for(inti=0;i<height;++i)
  68. {
  69. for(intj=0;j<width/2;++j)
  70. {
  71. Y1=*(pYUVData+i*width*2+j*4);
  72. U1=*(pYUVData+i*width*2+j*4+1);
  73. Y2=*(pYUVData+i*width*2+j*4+2);
  74. V1=*(pYUVData+i*width*2+j*4+3);
  75. C1=Y1-16;
  76. C2=Y2-16;
  77. D1=U1-128;
  78. E1=V1-128;
  79. R1=((298*C1+409*E1+128)>>8>255?255:(298*C1+409*E1+128)>>8);
  80. G1=((298*C1-100*D1-208*E1+128)>>8>255?255:(298*C1-100*D1-208*E1+128)>>8);
  81. B1=((298*C1+516*D1+128)>>8>255?255:(298*C1+516*D1+128)>>8);
  82. R2=((298*C2+409*E1+128)>>8>255?255:(298*C2+409*E1+128)>>8);
  83. G2=((298*C2-100*D1-208*E1+128)>>8>255?255:(298*C2-100*D1-208*E1+128)>>8);
  84. B2=((298*C2+516*D1+128)>>8>255?255:(298*C2+516*D1+128)>>8);
  85. *(pRGBData+(height-i-1)*width*4+j*8+2)=R1<0?0:R1;
  86. *(pRGBData+(height-i-1)*width*4+j*8+1)=G1<0?0:G1;
  87. *(pRGBData+(height-i-1)*width*4+j*8)=B1<0?0:B1;
  88. *(pRGBData+(height-i-1)*width*4+j*8+3)=alpha;
  89. *(pRGBData+(height-i-1)*width*4+j*8+6)=R2<0?0:R2;
  90. *(pRGBData+(height-i-1)*width*4+j*8+5)=G2<0?0:G2;
  91. *(pRGBData+(height-i-1)*width*4+j*8+4)=B2<0?0:B2;
  92. *(pRGBData+(height-i-1)*width*4+j*8+7)=alpha;
  93. }
  94. }
  95. }
  96. }
  97. else
  98. {
  99. if(alphaYUV)
  100. {
  101. for(inti=0;i<height;++i)
  102. {
  103. for(intj=0;j<width/2;++j)
  104. {
  105. Y1=*(pYUVData+i*width*3+j*4);
  106. U1=*(pYUVData+i*width*3+j*4+1);
  107. Y2=*(pYUVData+i*width*3+j*4+2);
  108. V1=*(pYUVData+i*width*3+j*4+3);
  109. C1=Y1-16;
  110. C2=Y2-16;
  111. D1=U1-128;
  112. E1=V1-128;
  113. R1=((298*C1+409*E1+128)>>8>255?255:(298*C1+409*E1+128)>>8);
  114. G1=((298*C1-100*D1-208*E1+128)>>8>255?255:(298*C1-100*D1-208*E1+128)>>8);
  115. B1=((298*C1+516*D1+128)>>8>255?255:(298*C1+516*D1+128)>>8);
  116. R2=((298*C2+409*E1+128)>>8>255?255:(298*C2+409*E1+128)>>8);
  117. G2=((298*C2-100*D1-208*E1+128)>>8>255?255:(298*C2-100*D1-208*E1+128)>>8);
  118. B2=((298*C2+516*D1+128)>>8>255?255:(298*C2+516*D1+128)>>8);
  119. *(pRGBData+(height-i-1)*width*3+j*6+2)=R1<0?0:R1;
  120. *(pRGBData+(height-i-1)*width*3+j*6+1)=G1<0?0:G1;
  121. *(pRGBData+(height-i-1)*width*3+j*6)=B1<0?0:B1;
  122. *(pRGBData+(height-i-1)*width*3+j*6+5)=R2<0?0:R2;
  123. *(pRGBData+(height-i-1)*width*3+j*6+4)=G2<0?0:G2;
  124. *(pRGBData+(height-i-1)*width*3+j*6+3)=B2<0?0:B2;
  125. }
  126. }
  127. }
  128. else
  129. {
  130. for(inti=0;i<height;++i)
  131. {
  132. for(intj=0;j<width/2;++j)
  133. {
  134. Y1=*(pYUVData+i*width*2+j*4);
  135. U1=*(pYUVData+i*width*2+j*4+1);
  136. Y2=*(pYUVData+i*width*2+j*4+2);
  137. V1=*(pYUVData+i*width*2+j*4+3);
  138. C1=Y1-16;
  139. C2=Y2-16;
  140. D1=U1-128;
  141. E1=V1-128;
  142. R1=((298*C1+409*E1+128)>>8>255?255:(298*C1+409*E1+128)>>8);
  143. G1=((298*C1-100*D1-208*E1+128)>>8>255?255:(298*C1-100*D1-208*E1+128)>>8);
  144. B1=((298*C1+516*D1+128)>>8>255?255:(298*C1+516*D1+128)>>8);
  145. R2=((298*C2+409*E1+128)>>8>255?255:(298*C2+409*E1+128)>>8);
  146. G2=((298*C2-100*D1-208*E1+128)>>8>255?255:(298*C2-100*D1-208*E1+128)>>8);
  147. B2=((298*C2+516*D1+128)>>8>255?255:(298*C2+516*D1+128)>>8);
  148. *(pRGBData+(height-i-1)*width*3+j*6+2)=R1<0?0:R1;
  149. *(pRGBData+(height-i-1)*width*3+j*6+1)=G1<0?0:G1;
  150. *(pRGBData+(height-i-1)*width*3+j*6)=B1<0?0:B1;
  151. *(pRGBData+(height-i-1)*width*3+j*6+5)=R2<0?0:R2;
  152. *(pRGBData+(height-i-1)*width*3+j*6+4)=G2<0?0:G2;
  153. *(pRGBData+(height-i-1)*width*3+j*6+3)=B2<0?0:B2;
  154. }
  155. }
  156. }
  157. }
  158. return0;
  159. }
  160. //////////////////////////////////////////////////////////////////////////
  161. //RGB2YUV
  162. //pRGBpointtotheRGBdata
  163. //pYUVpointtotheYUVdata
  164. //widthwidthofthepicture
  165. //heightheightofthepicture
  166. //alphaYUVisthereanalphachannelinYUV
  167. //alphaRGBisthereanalphachannelinRGB
  168. //////////////////////////////////////////////////////////////////////////
  169. intRGB2YUV(void*pRGB,void*pYUV,intwidth,intheight,boolalphaYUV,boolalphaRGB)
  170. {
  171. if(NULL==pRGB)
  172. {
  173. return-1;
  174. }
  175. unsignedchar*pRGBData=(unsignedchar*)pRGB;
  176. unsignedchar*pYUVData=(unsignedchar*)pYUV;
  177. if(NULL==pYUVData)
  178. {
  179. if(alphaYUV)
  180. {
  181. pYUVData=newunsignedchar[width*height*3];
  182. }
  183. else
  184. pYUVData=newunsignedchar[width*height*2];
  185. }
  186. intR1,G1,B1,R2,G2,B2,Y1,U1,Y2,V1;
  187. intalpha1,alpha2;
  188. if(alphaYUV)
  189. {
  190. if(alphaRGB)
  191. {
  192. for(inti=0;i<height;++i)
  193. {
  194. for(intj=0;j<width/2;++j)
  195. {
  196. B1=*(pRGBData+(height-i-1)*width*4+j*8);
  197. G1=*(pRGBData+(height-i-1)*width*4+j*8+1);
  198. R1=*(pRGBData+(height-i-1)*width*4+j*8+2);
  199. alpha1=*(pRGBData+(height-i-1)*width*4+j*8+3);
  200. B2=*(pRGBData+(height-i-1)*width*4+j*8+4);
  201. G2=*(pRGBData+(height-i-1)*width*4+j*8+5);
  202. R2=*(pRGBData+(height-i-1)*width*4+j*8+6);
  203. alpha2=*(pRGBData+(height-i-1)*width*4+j*8+7);
  204. Y1=(((66*R1+129*G1+25*B1+128)>>8)+16)>255?255:(((66*R1+129*G1+25*B1+128)>>8)+16);
  205. U1=((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128)>255?255:((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128);
  206. Y2=(((66*R2+129*G2+25*B2+128)>>8)+16)>255?255:((66*R2+129*G2+25*B2+128)>>8)+16;
  207. V1=((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128)>255?255:((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128);
  208. *(pYUVData+i*width*3+j*6)=Y1;
  209. *(pYUVData+i*width*3+j*6+1)=U1;
  210. *(pYUVData+i*width*3+j*6+2)=Y2;
  211. *(pYUVData+i*width*3+j*6+3)=V1;
  212. *(pYUVData+i*width*3+j*6+4)=alpha1;
  213. *(pYUVData+i*width*3+j*6+5)=alpha2;
  214. }
  215. }
  216. }
  217. else
  218. {
  219. unsignedcharalpha=255;
  220. for(inti=0;i<height;++i)
  221. {
  222. for(intj=0;j<width/2;++j)
  223. {
  224. B1=*(pRGBData+(height-i-1)*width*3+j*6);
  225. G1=*(pRGBData+(height-i-1)*width*3+j*6+1);
  226. R1=*(pRGBData+(height-i-1)*width*3+j*6+2);
  227. B2=*(pRGBData+(height-i-1)*width*3+j*6+3);
  228. G2=*(pRGBData+(height-i-1)*width*3+j*6+4);
  229. R2=*(pRGBData+(height-i-1)*width*3+j*6+5);
  230. Y1=((66*R1+129*G1+25*B1+128)>>8)+16;
  231. U1=((-38*R1-74*G1+112*B1+128)>>8+(-38*R2-74*G2+112*B2+128)>>8)/2+128;
  232. Y2=((66*R2+129*G2+25*B2+128)>>8)+16;
  233. V1=((112*R1-94*G1-18*B1+128)>>8+(112*R2-94*G2-18*B2+128)>>8)/2+128;
  234. Y1=(((66*R1+129*G1+25*B1+128)>>8)+16)>255?255:(((66*R1+129*G1+25*B1+128)>>8)+16);
  235. U1=((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128)>255?255:((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128);
  236. Y2=(((66*R2+129*G2+25*B2+128)>>8)+16)>255?255:((66*R2+129*G2+25*B2+128)>>8)+16;
  237. V1=((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128)>255?255:((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128);
  238. *(pYUVData+i*width*3+j*6)=Y1;
  239. *(pYUVData+i*width*3+j*6+1)=U1;
  240. *(pYUVData+i*width*3+j*6+2)=Y2;
  241. *(pYUVData+i*width*3+j*6+3)=V1;
  242. *(pYUVData+i*width*3+j*6+4)=alpha;
  243. *(pYUVData+i*width*3+j*6+5)=alpha;
  244. }
  245. }
  246. }
  247. }
  248. else
  249. {
  250. if(alphaRGB)
  251. {
  252. for(inti=0;i<height;++i)
  253. {
  254. for(intj=0;j<width/2;++j)
  255. {
  256. B1=*(pRGBData+(height-i-1)*width*4+j*8);
  257. G1=*(pRGBData+(height-i-1)*width*4+j*8+1);
  258. R1=*(pRGBData+(height-i-1)*width*4+j*8+2);
  259. B2=*(pRGBData+(height-i-1)*width*4+j*8+4);
  260. G2=*(pRGBData+(height-i-1)*width*4+j*8+5);
  261. R2=*(pRGBData+(height-i-1)*width*4+j*8+6);
  262. Y1=(((66*R1+129*G1+25*B1+128)>>8)+16)>255?255:(((66*R1+129*G1+25*B1+128)>>8)+16);
  263. U1=((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128)>255?255:((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128);
  264. Y2=(((66*R2+129*G2+25*B2+128)>>8)+16)>255?255:((66*R2+129*G2+25*B2+128)>>8)+16;
  265. V1=((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128)>255?255:((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128);
  266. *(pYUVData+i*width*2+j*4)=Y1;
  267. *(pYUVData+i*width*2+j*4+1)=U1;
  268. *(pYUVData+i*width*2+j*4+2)=Y2;
  269. *(pYUVData+i*width*2+j*4+3)=V1;
  270. }
  271. }
  272. }
  273. else
  274. {
  275. for(inti=0;i<height;++i)
  276. {
  277. for(intj=0;j<width/2;++j)
  278. {
  279. B1=*(pRGBData+(height-i-1)*width*3+j*6);
  280. G1=*(pRGBData+(height-i-1)*width*3+j*6+1);
  281. R1=*(pRGBData+(height-i-1)*width*3+j*6+2);
  282. B2=*(pRGBData+(height-i-1)*width*3+j*6+3);
  283. G2=*(pRGBData+(height-i-1)*width*3+j*6+4);
  284. R2=*(pRGBData+(height-i-1)*width*3+j*6+5);
  285. Y1=(((66*R1+129*G1+25*B1+128)>>8)+16)>255?255:(((66*R1+129*G1+25*B1+128)>>8)+16);
  286. U1=((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128)>255?255:((((-38*R1-74*G1+112*B1+128)>>8)+((-38*R2-74*G2+112*B2+128)>>8))/2+128);
  287. Y2=(((66*R2+129*G2+25*B2+128)>>8)+16)>255?255:((66*R2+129*G2+25*B2+128)>>8)+16;
  288. V1=((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128)>255?255:((((112*R1-94*G1-18*B1+128)>>8)+((112*R2-94*G2-18*B2+128)>>8))/2+128);
  289. *(pYUVData+i*width*2+j*4)=Y1;
  290. *(pYUVData+i*width*2+j*4+1)=U1;
  291. *(pYUVData+i*width*2+j*4+2)=Y2;
  292. *(pYUVData+i*width*2+j*4+3)=V1;
  293. }
  294. }
  295. }
  296. }
  297. return0;
  298. }
  299. //////////////////////////////////////////////////////////////////////////
  300. //pGBYUVpointtothebackgroundYUVdata
  301. //pFGYUVpointtotheforegroundYUVdata
  302. //widthwidthofthepicture
  303. //heightheightofthepicture
  304. //alphaBGisthereanalphachannelinbackgroundYUVdata
  305. //alphaFGisthereanalphachannelinfourgroundYUVdata
  306. //////////////////////////////////////////////////////////////////////////
  307. intYUVBlending(void*pBGYUV,void*pFGYUV,intwidth,intheight,boolalphaBG,boolalphaFG)
  308. {
  309. if(NULL==pBGYUV||NULL==pFGYUV)
  310. {
  311. return-1;
  312. }
  313. unsignedchar*pBGData=(unsignedchar*)pBGYUV;
  314. unsignedchar*pFGData=(unsignedchar*)pFGYUV;
  315. if(!alphaFG)
  316. {
  317. if(!alphaBG)
  318. {
  319. memcpy(pBGData,pFGData,width*height*2);
  320. }
  321. else
  322. {
  323. for(inti=0;i<height;++i)
  324. {
  325. for(intj=0;j<width/2;++j)
  326. {
  327. *(pBGData+i*width*2+j*4)=*(pFGData+i*width*2+j*4);
  328. *(pBGData+i*width*2+j*4+1)=*(pFGData+i*width*2+j*4+1);
  329. *(pBGData+i*width*2+j*4+2)=*(pFGData+i*width*2+j*4+2);
  330. *(pBGData+i*width*2+j*4+3)=*(pFGData+i*width*2+j*4+3);
  331. }
  332. }
  333. }
  334. }
  335. intY11,U11,V11,Y12,Y21,U21,V21,Y22;
  336. intalpha1,alpha2;
  337. if(!alphaBG)
  338. {
  339. for(inti=0;i<height;++i)
  340. {
  341. for(intj=0;j<width/2;++j)
  342. {
  343. Y11=*(pBGData+i*width*2+j*4);
  344. U11=*(pBGData+i*width*2+j*4+1);
  345. Y12=*(pBGData+i*width*2+j*4+2);
  346. V11=*(pBGData+i*width*2+j*4+3);
  347. Y21=*(pFGData+i*width*3+j*6);
  348. U21=*(pFGData+i*width*3+j*6+1);
  349. Y22=*(pFGData+i*width*3+j*6+2);
  350. V21=*(pFGData+i*width*3+j*6+3);
  351. alpha1=*(pFGData+i*width*3+j*6+4);
  352. alpha2=*(pFGData+i*width*3+j*6+5);
  353. *(pBGData+i*width*2+j*4)=(Y21-16)*alpha1/255+(Y11-16)*(255-alpha1)/255+16;
  354. *(pBGData+i*width*2+j*4+1)=((U21-128)*alpha1/255+(U11-128)*(255-alpha1)/255+(U21-128)*alpha2/255+(U11-128)*(255-alpha2)/255)/2+128;
  355. *(pBGData+i*width*2+j*4+3)=((V21-128)*alpha1/255+(V11-128)*(255-alpha1)/255+(V21-128)*alpha2/255+(V11-128)*(255-alpha2)/255)/2+128;
  356. *(pBGData+i*width*2+j*4+2)=(Y22-16)*alpha2/255+(Y12-16)*(255-alpha2)/255+16;
  357. }
  358. }
  359. }
  360. else
  361. {
  362. for(inti=0;i<height;++i)
  363. {
  364. for(intj=0;j<width/2;++j)
  365. {
  366. Y11=*(pBGData+i*width*3+j*6);
  367. U11=*(pBGData+i*width*3+j*6+1);
  368. Y12=*(pBGData+i*width*3+j*6+2);
  369. V11=*(pBGData+i*width*3+j*6+3);
  370. Y21=*(pFGData+i*width*3+j*6);
  371. U21=*(pFGData+i*width*3+j*6+1);
  372. Y22=*(pFGData+i*width*3+j*6+2);
  373. V21=*(pFGData+i*width*3+j*6+3);
  374. alpha1=*(pFGData+i*width*3+j*6+4);
  375. alpha2=*(pFGData+i*width*3+j*6+5);
  376. *(pBGData+i*width*3+j*6)=(Y21-16)*alpha1/255+(Y11-16)*(255-alpha1)/255+16;
  377. *(pBGData+i*width*3+j*6+1)=((U21-128)*alpha1/255+(U11-128)*(255-alpha1)/255+(U21-128)*alpha2/255+(U11-128)*(255-alpha2)/255)/2+128;
  378. *(pBGData+i*width*3+j*6+3)=((V21-128)*alpha1/255+(V11-128)*(255-alpha1)/255+(V21-128)*alpha2/255+(V11-128)*(255-alpha2)/255)/2+128;
  379. *(pBGData+i*width*3+j*6+2)=(Y22-16)*alpha2/255+(Y12-16)*(255-alpha2)/255+16;
  380. }
  381. }
  382. }
  383. return0;
  384. }
经测试,功能已经实现,如有错误或者不妥的地方,恳请指出。 mosesyuan at gmail dot com
分享到:
评论

相关推荐

    YUV2RGB.rar_matlab图像处理_yuv2rgb_yuv2rgb avi_yuv2rgb24_yuy2图片格式

    标签中的`yuv2rgb`和`yuy2图片格式`进一步强调了这个主题的核心,即处理YUY2格式的YUV数据并将其转换为RGB格式。`matlab图像处理`则表明这是在MATLAB环境下完成的,MATLAB提供了强大的图像处理工具箱,使得这样的...

    谈谈RGB、YUY2、YUYV、YVYU、UYVY、AYUV

    RGB和YUV之间可以通过特定的公式进行相互转换: - **RGB → YUV**: - \(Y = 0.30R + 0.59G + 0.11B\) - \(U = 0.493(B − Y)\) - \(V = 0.877(R − Y)\) - **RGB → YCbCr**: - 转换公式与RGB → YUV类似,但...

    YUY2 to RGB 24

    yuy2转换为rgb24的小工具,图片转换小工具。

    YUY2TORGB 快速转换

    超快全免费的YUY2TORGB的转换动态链接库,带VB范例,Dll没有源码,但也没有任何限制,随意使用。5年前普通台式机320*240的转换16ms以内,其实在实际测试中经常是0ms,大概是3次0,1次16,我也不知道为什么。重要用途...

    YUY2-RGB.rar_YUY2 to RGB_yuy2_yuy2 rgb

    这次的资源"YUY2-RGB.rar"包含了关于如何将YUY2格式的数据转换为RGB格式的各种算法,这对于我们理解和处理YUV色彩空间的图像至关重要。 YUY2,也称为YCbCr 4:2:2,是一种半像素的色彩格式,其中每个像素由一个Y...

    RGB2YUY2.c

    RGB2YUY2,RGB转YUY2,

    YUY2 到 RGB 转换器:将来自我的罗技相机的 YUY2 输入转换为 RGB。 可能与 YUV 到 RGB 转换器相同。-matlab开发

    将我的罗技相机的 YUY2 输入转换为 RGB。 可能与 YUV 到 RGB 转换器相同。 如果您需要此文件来处理来自相机的视频输入,这里有另一种方法(我还没有测试过)。 引用 Lautaro Camona ( ...

    YUY420(YV12)转YUY2(YUV420),读取yuv文件转成YUY2文件

    在从YUY420(YV12)转换到YUY2(YUV422)的过程中,需要重新排列和复制数据。这是因为YUY2要求每两个Y像素共享一个U和V分量,而在YV12中,U和V分量不是紧邻Y像素的。因此,转换过程包括将YV12的Y、U、V平面重新组合...

    YV12转换为YUY2

    3. 考虑到4:2:0到4:2:2的子采样转换,对于每个YUY2像素,你需要取YV12中的两个相邻像素的U和V分量。例如,对于位置`(x, y)`的像素,U和V值来自YV12的位置`(x, y)`和`(x + 1, y)`,而对于`(x, y + 1)`,则来自`(x, y ...

    RawPlayer 2.2 | YUV/RGB 原始视频播放器

    它支持多种未压缩纯视频数据 (Uncompressed Raw Video Data,包括 YV12、IYUV、YUY2、YVYU、UYVY、VYUY、RGB24) 文件的显示播放,以及任意两种格式之间的相互转换。 主要功能 ○ 播放多种未压缩纯视频文件,包括 YV...

    高效YUY2转灰度

    本文将详细讲解如何高效地进行YUY2到灰度以及灰度到RGB24的转换,并探讨相关优化策略。 YUY2是一种4:2:2的采样格式,每个像素由两个Y(亮度)分量和一个U、V(色度)分量组成,占用4个字节。在处理YUY2数据时,首先...

    hdyc色彩转yuy2

    5. **编码和压缩**:最后,将转换后的Y、Cb、Cr分量按照YUY2的存储顺序编码并压缩,形成最终的YUY2数据。 在实际应用中,这个过程可能涉及到硬件加速、实时处理优化等问题。同时,为了保证质量,还需要考虑色彩保真...

    YUV颜色空间转换(YV12、NV12、NV21、I420、RGB等)

    本程序实现了简单的YUV数据之间的转换和YUV与RGB的转换。 注:1、本程序只是简单YUV之间的颜色空间转换和YUV与RGB的转换。 2、本程序使用的vs2019创建的,需使用2019打开工程。 3、包含功能: 1)YV12_2_I420; ...

    yuy2格式的裸数据

    yuy2 格式的YUV裸数据 供71帧 分辨率w:320 ,h:240

    c# YUYV转RGB格式

    在C#中处理YUYV到RGB的转换,我们可以使用位操作来提取和组合像素值。YUYV格式的每个像素由两个像素组成,每个像素占用4个字节,其中第一个字节是Y,第二个字节是U,第三个字节是Y,第四个字节是V。对于每个像素,...

    将YUV格式转换为RGB格式的图像或视频matlab代码(可运行)

    这里我们关注的是从YUV色彩空间转换到RGB色彩空间的过程,这在多媒体处理、图像编辑和视频处理中非常常见。MATLAB作为一种强大的数值计算和可视化工具,提供了丰富的函数库来支持这种转换。下面,我们将详细讨论YUV...

    rgb2yuv

    RGB和YUV是两种常见的颜色空间,它们在数字图像处理和视频编码中有着广泛的应用。本文将深入探讨RGB到YUV的颜色转换基础知识,以及这两种颜色模型的特性。 RGB(红绿蓝)是一种加性颜色模型,它基于三种基本颜色:...

    rgb24_to_yv12

    这里提供一个rgb24转为yv12格式的源代码.

    ( YUV420(YV12)与YUY2(YUV422,YUYV)格式互转

    做美颜要进行格式转换,就做了两种格式的互转,( YUV420(YV12)与YUY2(YUV422,YUYV)格式互转

Global site tag (gtag.js) - Google Analytics