今有C++函数:BOOL clip255(LONG v)
{
if(v<0) v=0;
else if(v>255) v=255;
return (BYTE)v;
}
void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
BYTE Y0 = *YUY2buff;
BYTE U = *(++YUY2buff);
BYTE Y1 = *(++YUY2buff);
BYTE V = *(++YUY2buff);
++YUY2buff;
LONG Y,C,D,E;
BYTE R,G,B;
Y = Y0;
C = Y-16;
D = U-128;
E = V-128;
R = clip255(( 298 * C + 409 * E + 128) >> 8);
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
B = clip255(( 298 * C + 516 * D + 128) >> 8);
*(RGBbuff) = B;
*(++RGBbuff) = G;
*(++RGBbuff) = R;
Y = Y1;
C = Y-16;
D = U-128;
E = V-128;
R = clip255(( 298 * C + 409 * E + 128) >> 8);
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
B = clip255(( 298 * C + 516 * D + 128) >> 8);
*(++RGBbuff) = B;
*(++RGBbuff) = G;
*(++RGBbuff) = R;
++RGBbuff;
}
}
转成C#该怎么转??
我自己转的如下,似乎不对,请达人帮忙转下:
private static void YUV_RGB(byte[] YUY2buff, ref byte[] RGBbuff, Int32 dwSize)
{ byte[] tempBuf = RGBbuff;
MessageBox.Show(RGBbuff.Length.ToString() + "RGB " + YUY2buff.Length.ToString() + "YUY");
for (int i = 0; i < dwSize; i += 4)
{
float Y0 = YUY2buff[i];
float U = YUY2buff[i + 1];
float Y1 = YUY2buff[i + 2];
float V = YUY2buff[i + 3];
float R, G, B; R = (Y0 + 1.14f * V);
G = (Y0 - 0.39f * U - 0.58f * V);
B = (Y0 + 2.03f * U); if (R < 0) R = 0;
if (R > 255) R = 255;
if (G < 0) R = 0;
if (G > 255) R = 255;
if (B < 0) R = 0;
if (B > 255) R = 255; RGBbuff[i] = (byte)R;
RGBbuff[i + 1] = (byte)G;
RGBbuff[i + 2] = (byte)B;
R = (Y1 + 1.14f * V);
G = (Y1 - 0.39f * U - 0.58f * V);
B = (Y1 + 2.03f * U); if (R < 0) R = 0;
if (R > 255) R = 255;
if (G < 0) R = 0;
if (G > 255) R = 255;
if (B < 0) R = 0;
if (B > 255) R = 255; RGBbuff[i + 1] = (byte)R;
RGBbuff[i + 2] = (byte)G;
RGBbuff[i + 3] = (byte)B;
}
}
{
if(v<0) v=0;
else if(v>255) v=255;
return (BYTE)v;
}
void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
{
BYTE *orgRGBbuff = RGBbuff;
for(DWORD count=0;count<dwSize;count+=4)
{
BYTE Y0 = *YUY2buff;
BYTE U = *(++YUY2buff);
BYTE Y1 = *(++YUY2buff);
BYTE V = *(++YUY2buff);
++YUY2buff;
LONG Y,C,D,E;
BYTE R,G,B;
Y = Y0;
C = Y-16;
D = U-128;
E = V-128;
R = clip255(( 298 * C + 409 * E + 128) >> 8);
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
B = clip255(( 298 * C + 516 * D + 128) >> 8);
*(RGBbuff) = B;
*(++RGBbuff) = G;
*(++RGBbuff) = R;
Y = Y1;
C = Y-16;
D = U-128;
E = V-128;
R = clip255(( 298 * C + 409 * E + 128) >> 8);
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
B = clip255(( 298 * C + 516 * D + 128) >> 8);
*(++RGBbuff) = B;
*(++RGBbuff) = G;
*(++RGBbuff) = R;
++RGBbuff;
}
}
转成C#该怎么转??
我自己转的如下,似乎不对,请达人帮忙转下:
private static void YUV_RGB(byte[] YUY2buff, ref byte[] RGBbuff, Int32 dwSize)
{ byte[] tempBuf = RGBbuff;
MessageBox.Show(RGBbuff.Length.ToString() + "RGB " + YUY2buff.Length.ToString() + "YUY");
for (int i = 0; i < dwSize; i += 4)
{
float Y0 = YUY2buff[i];
float U = YUY2buff[i + 1];
float Y1 = YUY2buff[i + 2];
float V = YUY2buff[i + 3];
float R, G, B; R = (Y0 + 1.14f * V);
G = (Y0 - 0.39f * U - 0.58f * V);
B = (Y0 + 2.03f * U); if (R < 0) R = 0;
if (R > 255) R = 255;
if (G < 0) R = 0;
if (G > 255) R = 255;
if (B < 0) R = 0;
if (B > 255) R = 255; RGBbuff[i] = (byte)R;
RGBbuff[i + 1] = (byte)G;
RGBbuff[i + 2] = (byte)B;
R = (Y1 + 1.14f * V);
G = (Y1 - 0.39f * U - 0.58f * V);
B = (Y1 + 2.03f * U); if (R < 0) R = 0;
if (R > 255) R = 255;
if (G < 0) R = 0;
if (G > 255) R = 255;
if (B < 0) R = 0;
if (B > 255) R = 255; RGBbuff[i + 1] = (byte)R;
RGBbuff[i + 2] = (byte)G;
RGBbuff[i + 3] = (byte)B;
}
}
解决方案 »
- 在线急等啊DataSet 变量的问题
- 水晶报表导出
- 關於PadLeft
- C#的编程环境
- 为什么不能转换啊?在线等,急!
- 怎么样在上传的时候把pdf文件存入ORACLE数据库中?
- 急急急急急急急急急急——请高手们看看我的程序哪里错误在哪里??(关于RDA)
- ====有关this关键字使用的一个错误,如何解决?====
- 如何 根据输入参数 调用windows 的应用程序,如notepad ,word等
- 在服务器端如何给连入的客户端发消息?
- ♂如何判断客户端IE是否安装了Adobe PDF Reader ActiveX插件,如果没有让用户自动安装?♀
- VS2005 TEAM EDITION,如何知道组件在工具箱的哪个选项卡中?
298 * C + 409 * E + 128,你代码里面有吗其实C++和c#的差不多。
byte[] YUY2buff 这个参数在C#中不好弄,可以考虑使用BitmapData类,把图像锁在内存中
然后翻译就容易多了。。
*(++RGBbuff) = G;
对应是C#的 RGBbuff[i+1] = G吗?
BYTE 改为byte
指针改为数组