我想用VC实现一个能自由变形并且可以在窗口边缘进行灰度调节的播放窗口,请问我该如何实现这一点?
如果调用控件那么自由变形和灰度调节恐怕是做不到了,有人说DIRECTSHOW可以,请问具体如何实现?推荐下这方面相关的教程也可以

解决方案 »

  1.   

    什么是自由变形?
    有种制作透明图作背景
    这样样式就是你的图的范围了,算不算自由变形?
    至于播放的话,可能就是把一个wmplayer控件内嵌在里面了
    不知道行不行~~~?
      

  2.   

    写一个TransForm的filter就可以了
      

  3.   

    谢谢两位的回答,比如说,默认播放窗口是矩形,那么我希望像调整显示器一样把播放窗口调整成曲边矩形甚至梯形.另外我希望达到这样的效果,如果把播放窗口比成一个"回"字的话,那么我希望对外面那个环形框进行亮度或者灰度调节,这怎么实现?我要处理的是视频不是图片.transform fiter?能说的详细点么?推荐几篇教程也行啊!
      

  4.   

    又研究了下,通过picture control+directshow的FilterGraph可以播放视频,通过调整picture control的大小应该能实现变形吧?
      

  5.   

    trans filter
    ISampleGrabber
    vmr9
      

  6.   

    谢谢楼上,ISampleGrabber可以实现数据读取,现在我已经实现播放功能了,问题是播放窗口能否进行变形或者羽化处理?
      

  7.   

    播放窗口变形,应该是要自己写一个Renderer
    试试这个:
    C:\DXSDK\Samples\C++\DirectShow\Filters\SampVid
      

  8.   

    或者,不写Renderer。
    在你的filter链路上接一个 NULL Renderer,然后将你从ISampleGrabber接口获得的图像数据在窗口上用GDI画出来。这个窗口可以完全有你写了,异型窗口。
      

  9.   

    给一段调节亮度、对比度的代码你。
    申明,这代码也是我baidu来的还没有用过,若产生异常,后果自负,呵呵
    //pixelData:rgb24 
     //@iPercent:value from 1 to 200;100 is the original value 
     void wx_do_brightness (uint8_t *pixelData,uint32_t width,uint32_t height,int32_t iPercent) 
     { 
     int x,y; 
     uint8_t *pPixel=0; 
     int nSpan=3;//only for rgb24 
     
     if(iPercent==100) 
     return; 
     iPercent = (iPercent<<7)/100 ; 
     for (y=0;y <height;y++) 
     { 
     pPixel=pixelData+y*width*nSpan; 
     for (x=0 ; x <width ; x++,pPixel += nSpan) 
     { 
     pPixel[0] = min ((pPixel[0] * iPercent)>>7 , 255) ; 
     pPixel[1] = min ((pPixel[1] * iPercent)>>7, 255) ; 
     pPixel[2] = min ((pPixel[2] * iPercent)>>7, 255) ; 
     } 
     } 
     } 
     
     //pixelData:rgb24 
     //@iPercent:value from 1 to 200;100 is the original value 
     void wx_do_contrast (uint8_t *pixelData,uint32_t width,uint32_t height,int32_t iPercent) 
     { 
     int x,y,temp; 
     uint8_t *pPixel=0; 
     int nSpan = 3;//only for rgb24 
     
     iPercent = iPercent<<7 / 100 ; 
     temp=128-iPercent; 
     for (y=0 ; y <height; y++) 
     { 
     pPixel=pixelData+y*width*nSpan; 
     for (x = 0 ; x < width ; x++, pPixel += nSpan) 
     { 
     pPixel[0] = max (min (temp+(pPixel[0]*iPercent)>>7, 255), 0) ; 
     pPixel[1] = max (min (temp+(pPixel[1]*iPercent)>>7, 255), 0) ; 
     pPixel[2] = max (min (temp+(pPixel[2]*iPercent)>>7, 255), 0) ; 
     } 
     } 
     } 
      

  10.   

    谢谢楼上,请问怎么写Renderer?我刚接触directshow,很多东西不明白,还望大家不吝赐教!
      

  11.   

    谢谢大家,虽然问题还是没有解决,不过有所进展,大家有兴趣可以看下这里(也是100分):
    http://topic.csdn.net/u/20080714/17/3d0a8fce-e04d-4566-b06e-ed090ae73e93.html