2014-01-21 7 views
0

저는 DirectShowNET 샘플에서 DxLogo 프로젝트로 작업 해 왔습니다. 이렇게하면 비디오에 이미지가 추가되지만 움직이면 이미지 색상이 왜곡되며 투명 배경도 처리되지 않습니다.[directshow.net] 비디오를 캡처하는 동안 이미지 (워터 마크)를 어떻게 추가 하시겠습니까?

Bitmap v = new Bitmap(m_videoWidth, m_videoHeight, m_stride, PixelFormat.Format32bppArgb, pBuffer); 

그런 다음 새로운 비트 맵에 워터 마크를 추가 :

Graphics g = Graphics.FromImage(v); 
g.DrawImage(m_Bitmap, 0, 0, m_Bitmap.Width, m_Bitmap.Height); 
v = new Bitmap(v.Width, v.Height, g); 
순서대로 그 요인 ...

내가 비트 맵에 프레임을 변환해야하는 방법 몇 가지를 처리 ​​할 수 ​​있도록

그런 다음 BufferCB가 프레임으로 새 비트 맵을 가져 오게되면 그 부분이 멈추게됩니다. 어떻게 그럴 수 있니?

원래 DxLogo BufferCB 방법 :

int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) 
{ 
    // Avoid the possibility that someone is calling SetLogo() at this instant 
    lock (this) 
    {    
     if (m_bmdLogo != null) 
     {      
      for (int x = 0; x < m_bmdLogo.Height; x++) 
      {       
       CopyMemory(ipDest, ipSource, (uint)m_bmdLogo.Stride); 
       ipSource = (IntPtr)(ipSource.ToInt32() + m_bmdLogo.Stride); 
       ipDest = (IntPtr)(ipDest.ToInt32() + m_stride); 
      } 
     } 
    } 

    return 0; 
} 

감사합니다!

답변

1

다른 사람이 문제에 부딪 힐 경우 문제를 발견했습니다. pBuffer에서 bitmat를 만들 때 PixelFormat을 잘못 사용했습니다. PixelFormat.Format32bppArgb 대신 PixelFormat.Format24bppRgb을 사용하십시오.

int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen) 
{ 
    // Avoid the possibility that someone is calling SetLogo() at this instant 
    lock (this) 
    { 
     if (m_Bitmap != null) 
     {       
      Bitmap v; 
      v = new Bitmap(m_videoWidth, m_videoHeight, m_stride, PixelFormat.Format24bppRgb, pBuffer); 

      Graphics g = Graphics.FromImage(v); 
      g.DrawImage(m_Bitmap, 100, 100, m_Bitmap.Width, m_Bitmap.Height);     
     } 
    } 

이것은 재배치 및 투명 배경이 지금 작업하는 경우 이미지의 색상이 왜곡 것이다 문제를 해결 :

다음은 DxLogo 샘플에 대한 내 작업 BufferCB입니다.