获取Canvas的位图错误地基于Window的左上角

时间:2011-09-11 22:39:56

标签: c# .net wpf

我的窗口中有一个画布,偶尔我想拍摄内容的快照。

我有以下方法:

private PngBitmapEncoder captureVisual(Visual v)
{
    RenderTargetBitmap bmp = new RenderTargetBitmap(546, 410, 120, 96, PixelFormats.Pbgra32);
    bmp.Render(v);
    PngBitmapEncoder encoder = new PngBitmapEncoder();
    encoder.Interlace = PngInterlaceOption.On;
    encoder.Frames.Add(BitmapFrame.Create(bmp));
    return encoder;
}

我用以下方法调用此方法,该方法由按下按钮操作调用(想法是将图片添加到另一个将显示“照片”的画布:

 private void take_photo(Object sender, RoutedEventArgs e)
        {
            System.Windows.Controls.Image photoImg = new System.Windows.Controls.Image();
            BitmapEncoder enc = captureVisual(videoCanvas);
            photoImg.Source = enc.Frames[0];
            photoCanvas.Children.Add(photoImg);
        }

问题:

当我拍摄照片时,照片/位图的原点画布的原点而是窗口的原点。因此,Canvas出现在朝向底部/右侧的位图中,与位于窗口左上角的位置相同。我不知道为什么会这样。

作为示例,请参见下面的图片:左上方有空白区域,实际内容已翻译到右下角。原点应该是实际图像所在的位置。我会尝试放置一个边框,以便更容易想象问题(对不起,我不知道如何在图像周围放置边框,如果有人知道请告诉我或自己编辑。谢谢)。

Incorrectly translated image

1 个答案:

答案 0 :(得分:0)

感谢dowhile的评论,我得到了link的答案:

问题是WPF隐式添加了Canvas与父容器相关的边距。在我的情况下,父容器是一个网格,我没有定义任何边距,画布填充特定的单元格。然而,这不知何故被合并到位图中。

解决方案,将Canvas包裹在另一个Canvas周围。这是愚蠢但它的确有效。恕我直言这是WPF中的一个错误:

<Canvas 
                Name="outerCanvas"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"
                Grid.Row="1" Grid.Column="1">
                    <Canvas 
                        Name="videoCanvas"
                        Canvas.Left="0"
                        Canvas.Top="0"
                        HorizontalAlignment="Stretch"
                        VerticalAlignment="Stretch"
                        />
            </Canvas>