DirectShow视频旋转90度的filter重影条纹问题

时间:2022-05-19 18:29:12
从EZRGB24例子修改的代码,可以实现视频翻转。但是视频旋转90度的实现时,图像出现多个重影,并且都是条纹状的。估计旋转处理的代码没问题。因为在Receive函数中修改视频的宽高(视频窗口的宽高没有改变)后,即使是原来运行正常的视频图像,也会同样出现重影和条纹。
我尝试修改旋转视频后的窗口宽高总是不能实现,不知道在哪里修改。论坛里有个PropPage.ax可以实现视频图像的90度旋转,但是没有源码,而且存在小问题,旋转后的视频,会间隔几秒后出现停顿的问题,而且在graphedit中运行时cpu占用率比较高。

9 个解决方案

#1


希望高手能指点一二,不胜感激

#2


大家都忙啊,自己顶一下

#3


期盼高手出没,雪中送炭

#4


我写过的代码。。
bool rgb24_rotate_90(unsigned char *src_rgb,unsigned int iWidth,unsigned int iHeight,bool direction)
    {
    if(!src_rgb)
    return false;
    unsigned int n=0;
    unsigned int linesize=iWidth*3;
    unsigned char *dst_rgb  = (unsigned char*)malloc(iWidth*iHeight*3);
    int i,j;
    if(direction)
    {
    for(j=iWidth;j>0;j--)
   for(i=0;i<iHeight;i++)
   {
   memcpy(&dst_rgb[n],&src_rgb[linesize*i+j*3-3],3);
  n+=3;
  }
  }
  else
  {
   for(j=0;j<iWidth;j++)
   for(i=iHeight;i>0;i--)
   {
   memcpy(&dst_rgb[n],&src_rgb[linesize*(i-1)+j*3-3],3);
   n+=3;
  }
  }
   memcpy(src_rgb ,dst_rgb ,iWidth*iHeight*3); // itmp = iLBytes*iHeight;
  free(dst_rgb);
  return true;
 }

#5


感谢Evankaka!
这个函数是在Transform中调用吗?这个函数实现了图像的旋转,要使视频图像正确显示在窗口上,是不是还需要做其他方面的处理和修改,例如宽高比转换。我调整宽高尺寸的代码总是不起作用,也不知何故。测试了下,如果窗口尺寸不正确,即使在Transform中代码是正确的,最后显示的图像也是失真的,例如条纹重影。
感觉DirectDraw的运行机制有些复杂,新手掌握起来难度比较大。

#6


不知道里面的奥秘究竟在哪里

#7


努力研读测试了几天没有改善啊

#8


楼主万福,不知道这个视频旋转的功能做好了吗?好了的话能指教一下吗。我也看了好多天的文档还有这个传说中的EZRGB24demo,但是还是不知道怎么下手,新手太菜。万望指教呀

#9


不知道楼主解决了吗?怎么解决的

#1


希望高手能指点一二,不胜感激

#2


大家都忙啊,自己顶一下

#3


期盼高手出没,雪中送炭

#4


我写过的代码。。
bool rgb24_rotate_90(unsigned char *src_rgb,unsigned int iWidth,unsigned int iHeight,bool direction)
    {
    if(!src_rgb)
    return false;
    unsigned int n=0;
    unsigned int linesize=iWidth*3;
    unsigned char *dst_rgb  = (unsigned char*)malloc(iWidth*iHeight*3);
    int i,j;
    if(direction)
    {
    for(j=iWidth;j>0;j--)
   for(i=0;i<iHeight;i++)
   {
   memcpy(&dst_rgb[n],&src_rgb[linesize*i+j*3-3],3);
  n+=3;
  }
  }
  else
  {
   for(j=0;j<iWidth;j++)
   for(i=iHeight;i>0;i--)
   {
   memcpy(&dst_rgb[n],&src_rgb[linesize*(i-1)+j*3-3],3);
   n+=3;
  }
  }
   memcpy(src_rgb ,dst_rgb ,iWidth*iHeight*3); // itmp = iLBytes*iHeight;
  free(dst_rgb);
  return true;
 }

#5


感谢Evankaka!
这个函数是在Transform中调用吗?这个函数实现了图像的旋转,要使视频图像正确显示在窗口上,是不是还需要做其他方面的处理和修改,例如宽高比转换。我调整宽高尺寸的代码总是不起作用,也不知何故。测试了下,如果窗口尺寸不正确,即使在Transform中代码是正确的,最后显示的图像也是失真的,例如条纹重影。
感觉DirectDraw的运行机制有些复杂,新手掌握起来难度比较大。

#6


不知道里面的奥秘究竟在哪里

#7


努力研读测试了几天没有改善啊

#8


楼主万福,不知道这个视频旋转的功能做好了吗?好了的话能指教一下吗。我也看了好多天的文档还有这个传说中的EZRGB24demo,但是还是不知道怎么下手,新手太菜。万望指教呀

#9


不知道楼主解决了吗?怎么解决的