我的窗口中有一个画布,偶尔我想拍摄内容的快照。
我有以下方法:
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出现在朝向底部/右侧的位图中,与位于窗口左上角的位置相同。我不知道为什么会这样。
作为示例,请参见下面的图片:左上方有空白区域,实际内容已翻译到右下角。原点应该是实际图像所在的位置。我会尝试放置一个边框,以便更容易想象问题(对不起,我不知道如何在图像周围放置边框,如果有人知道请告诉我或自己编辑。谢谢)。
答案 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>