高分求!!!YUY2数据格式转换为RGB24的数据格式的方法?

a554187160 2011-08-26 08:37:49
在使用VFW做视频采集程序的时候,摄像头采集到的图像格式是YUY2时,无法实现预览,但是数据已经捕捉到了,而且录制成为了视频,只是界面的预览框时一片黑。
现在我要的想法时先将YUY2格式的数据在回调函数中转换为RGB24格式的,然后在在刷新到预览框。数据转换已经实现了,就是我应该如何奖RGB的数据现实到预览框呢?
时间有点紧,如果有源码就请给小弟发一份,万分感谢。邮箱:ningzhufeng@gmail.com
...全文
669 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljh_0728 2012-08-14
  • 打赏
  • 举报
回复
楼主已经结贴了,不过不知道有没有确实解决,你说的 yuy2 数据的问题, 我也遇到过,
  用个函数进行转换成 RGB 应该就可以了。 解决方法留给有需要的人。
可以参考下我的解决方法:  http://blog.csdn.net/ljh_0728/article/details/7861927

ljh_0728 2012-08-14
  • 打赏
  • 举报
回复
楼主已经结贴了,不过不知道有没有确实解决,你说的 yuy2 数据的问题, 我也遇到过,
  用个函数进行转换成 RGB 应该就可以了。 解决方法留给有需要的人。
可以参考下我的解决方法:  http://blog.csdn.net/ljh_0728/article/details/7861927
神仙约架 2012-08-10
  • 打赏
  • 举报
回复
留名,好贴,收藏啦
zhangruixuan1986 2012-05-29
  • 打赏
  • 举报
回复
谢谢楼主,的确是这样的,在位图的文件头里加个负号就好了
a554187160 2011-08-29
  • 打赏
  • 举报
回复
好了,终于解决了,原来就是一个符号的问题。我把代码贴出来,留给有需要的人。
HWND hwndStill = NULL;
pDlg->GetDlgItem(IDC_PANEL, &hwndStill); // IDC_PANEL为picture控件ID

RECT rc;
::GetWindowRect( hwndStill, &rc );
long lStillWidth = rc.right - rc.left;
long lStillHeight = rc.bottom - rc.top;

BITMAPINFO *pbih = new BITMAPINFO;

memset((void *)pbih, 0, sizeof(BITMAPINFO));
pbih->bmiHeader.biSize = 40 ;
pbih->bmiHeader.biHeight = -bitmapinfoheader->biHeight;
//图片高度,一定记得添加负号,否则就会是倒的
pbih->bmiHeader.biWidth = bitmapinfoheader->biWidth; // 图片宽度
pbih->bmiHeader.biBitCount = 24;
pbih->bmiHeader.biPlanes = 1;


HDC hdcStill = ::GetDC( hwndStill );
PAINTSTRUCT pss;
::BeginPaint(hwndStill, &pss);

SetStretchBltMode(hdcStill, COLORONCOLOR);
StretchDIBits(
hdcStill, 0, 0,
lStillWidth, lStillHeight,
0, 0, bitmapinfoheader->biWidth, bitmapinfoheader->biHeight,
sum_buffer, // 图片的原始数据,采用BGR格式排列
(BITMAPINFO*) pbih,
DIB_RGB_COLORS,
SRCCOPY );

::EndPaint(hwndStill, &pss);
::ReleaseDC( hwndStill, hdcStill );
a554187160 2011-08-29
  • 打赏
  • 举报
回复
怎么没有人顶,求大牛指点
a554187160 2011-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 blukercn 的回复:]

。。。2字节一个点,把数据倒过来算了
一行为:width*2个字节
[/Quote]

楼上的大哥,可以说清楚点吗?我还是有点不太明白
for(int i=0;i<lpVHdr->dwBufferLength/3;i++)
for(int j=0;j<=2;j++)
{
sum_buffer[lpVHdr->dwBufferLength-1-3*i-j]=Xiangsu[3*i+j];
}
sum_buffer是申请的一块内存,Xiangshu是指向RGB数据的指针,我这样倒过来以后在画,可是图像出现了断层,而且下半部分的数据色彩正常,上半部分色彩有问题。您能看看钱哦这样到错在哪里了吗?
  • 打赏
  • 举报
回复
。。。2字节一个点,把数据倒过来算了
一行为:width*2个字节
loving_hoping 2011-08-27
  • 打赏
  • 举报
回复
我有,周一晚上给你贴出来!
hnzlk 2011-08-27
  • 打赏
  • 举报
回复
http://vckbase.com/document/viewdoc/?id=1780
a554187160 2011-08-27
  • 打赏
  • 举报
回复
怎么没有大牛来帮忙呢 。。。。
a554187160 2011-08-27
  • 打赏
  • 举报
回复
我已经把图画出来了,可是时倒着的,我时使用了,StretchDIBit画出来的,有没有哪位大虾知道怎么让它成正的啊,求啊,时间紧迫啊。
a554187160 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bokutake 的回复:]

DIB结构的位图就是倒的。VFW已经提供了DrawDib函数值可以快速绘制DIB。
http://msdn.microsoft.com/en-us/library/dd797892(v=VS.85).aspx
去网上搜一下 DrawDib函数组的使用
有中文翻译。
[/Quote]

大侠,我发现程序在XP上运行时能直接显示出YUY2的数据,可是在win7运行时,图像无法显示出来,所以我就在回调函数中将YUY2转换成RGB画出来以后。可是我发现图像时倒的,我是使用了StretchDIBit来画图像的。我又试着将RGB的数据倒置了过来,可是图片变模糊了,而且图片中间有个断层,上面一部分,下面一部分。
辰岡墨竹 2011-08-27
  • 打赏
  • 举报
回复
DIB结构的位图就是倒的。VFW已经提供了DrawDib函数值可以快速绘制DIB。
http://msdn.microsoft.com/en-us/library/dd797892(v=VS.85).aspx
去网上搜一下 DrawDib函数组的使用
有中文翻译。
a554187160 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 loving_hoping 的回复:]

我有,周一晚上给你贴出来!
[/Quote]
呃,现在能给我整份不,我这里很急啊,我做了下显示图像是倒过来的,然后我干脆把RGB数据倒过来,但是图像变得模糊了,而且中间还有断层

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧