3

使用 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。

我找到了做类似事情的示例代码,但它们似乎都想实例化 Visual Studio 告诉我的 Image 类是抽象的并且无法实例化。

我绕着圈子转,什么也没有。

我只想做这样的事情:

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

但是 Bitmap 没有有用的构造函数来让我从 dv (DrawingVisual) 到 bmp。:(

这 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);
4

2 回答 2

2

使用RenderTargetBitMap的结果是一个 WPF BitMapSource它不会将 Visual 本身转换为 a BitmapSource,它包含转换结果为 a BitmapSource。为了将 a 转换BitmapSourceSystem.Drawing.Bitmap尝试使用此MSDN 论坛帖子中代码的修改版本。

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;
}
于 2012-09-01T16:55:34.757 回答
0
private BitmapSource ToBitmapSource(Visual visual, Brush transparentBackground)
{
    var bounds = VisualTreeHelper.GetDescendantBounds(visual);
    var scale = VisualTreeHelper.GetDpi(visual);
    var bitmapSource = new RenderTargetBitmap(
        (int)(bounds.Width * scale.DpiScaleX),
        (int)(bounds.Height * scale.DpiScaleY),
        scale.PixelsPerInchX,
        scale.PixelsPerInchY,
        PixelFormats.Pbgra32);
    var drawingVisual = new DrawingVisual();
    using (var drawingContext = drawingVisual.RenderOpen())
    {
        drawingContext.DrawRectangle(transparentBackground, null, new Rect(bounds.Size));
        drawingContext.DrawRectangle(new VisualBrush(visual), null, new Rect(bounds.Size));
    }
    bitmapSource.Render(drawingVisual);
    return bitmapSource;
}

private System.Drawing.Bitmap BitmapFromSource(BitmapSource bitmapsource)
{
    System.Drawing.Bitmap bitmap;
    using (MemoryStream outStream = new MemoryStream())
    {
        BitmapEncoder enc = new BmpBitmapEncoder();
        enc.Frames.Add(BitmapFrame.Create(bitmapsource));
        enc.Save(outStream);
        bitmap = new System.Drawing.Bitmap(outStream);
    }
    return bitmap;
}
于 2020-05-10T11:49:04.637 回答