2012-09-01 4 views
2

Visual C# 2010을 사용하여 Windows Kinect에서받은 프레임에서 .avi 파일을 작성하려고합니다. 프레임은 BitmapEncoder 및 PngBitmapEncoder (스트림에 저장)를 사용하여 .png 파일로 충분히 쉽게 저장할 수 있지만 여기에 제공된 VideoStream에 임의로 이러한 이미지를 추가 할 수는 없습니다 : http://www.codeproject.com/Articles/7388/A-Simple-C-Wrapper-for-the-AviFile-Library RenderTargetBitmap 또는 DrawingVisual을 System.Drawing.Bitmap으로 변환 할 수 있습니다.DrawingVisual을 비트 맵으로 변환하려면 어떻게해야합니까?

비슷한 일을하는 예제 코드를 찾았지만 모두 Visual Studio에서 추상이라고 알려주고 인스턴스화 할 수없는 Image 클래스를 인스턴스화하려고합니다.

저는 서클에서 돌아가고 어디에도 가지 않을 것입니다.

... 
renderBitmap.Render(dv); 
Bitmap bmp=new Bitmap(dv); 
VideoStream aviStream=aviManager.AddVideoStream(true,60,bmp); 
... 

을하지만 비트 맵 DV BMP로 (으로 DrawingVisual)에서 저를 얻기 위해 유용한 생성자가 없습니다 :

난 그냥 이런 식으로 뭔가를 할 수 있습니다. :(

그 3 개 라인이 조각에서 온 :

var renderBitmap=new RenderTargetBitmap(colorWidth,colorHeight,96.0,96.0,PixelFormats.Pbgra32); 
DrawingVisual dv=new DrawingVisual(); 
using(DrawingContext dc=dv.RenderOpen()) 
{ 
    VisualBrush backdropBrush=new VisualBrush(Backdrop); 
    dc.DrawRectangle(backdropBrush,null,new Rect(0,0,colorWidth,colorHeight)); 
    VisualBrush colorBrush=new VisualBrush(MaskedColor); 
    dc.DrawRectangle(colorBrush,null,new Rect(0,0,colorWidth,colorHeight)); 
    VisualBrush watermarkBrush=new VisualBrush(Watermark); 
    dc.DrawRectangle(watermarkBrush,null,new Rect(colorWidth-96,colorHeight-80,64,48)); 
} 
renderBitmap.Render(dv); 
Bitmap bmp=new Bitmap(dv); 
VideoStream aviStream=aviManager.AddVideoStream(true,60,bmp); 
+1

을 반환하는 방법을 만들었습니다. "dv"는 어디에서 왔습니까? 그 유형은 무엇입니까? – JcMaltaDev

+0

코드 릿킷을 확장하여 진행 상황을보다 잘 이해할 수있게되었습니다. –

답변

2

RenderTargetBitMap 사용의 결과는 WPF 그것이 BitmapSource 자체 비주얼을 변환하지 않습니다 BitMapSource, 그것은 변환 등의 결과를 포함 BitmapSource.이 MSDN Forum Post에서 코드의 수정 된 버전을 사용하려고 System.Drawing.BitmapBitmapSource을 변환하기 위해.

renderBitmap.Render(dv); 
BitmapSource bmp = renderBitmap; 

using(MemoryStream outStream = new MemoryStream()) 
{ 
    BitmapEncoder enc = new BmpBitmapEncoder(); 
    enc.Frames.Add(BitmapFrame.Create(bmp)); 
    enc.Save(outStream); 
    System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream); 
    VideoStream aviStream=aviManager.AddVideoStream(true,60,bitmap); 
} 

난 당신이 샘플 코드를 확장해야한다고 생각하여 비트 맵을

renderBitmap.Render(dv); 
BitmapSource bmp =renderBitmap; 

VideoStream aviStream = aviManager.AddVideoStream(true, 60, ConvertToBitmap(bmp)); 

private System.Drawing.Bitmap ConvertToBitmap(BitmapSource target) 
{ 
    System.Drawing.Bitmap bitmap; 

    using (MemoryStream outStream = new MemoryStream()) 
    { 
     BitmapEncoder enc = new BmpBitmapEncoder(); 
     enc.Frames.Add(BitmapFrame.Create(target)); 
     enc.Save(outStream); 
     bitmap = new System.Drawing.Bitmap(outStream); 
    } 

    return bitmap; 
} 
관련 문제