【问题标题】:Taking bitmap of Canvas is incorrectly based on top left corner of Window画布的位图错误地基于窗口的左上角
【发布时间】:2011-09-17 09:27:59
【问题描述】:

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

我有以下方法:

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);
        }

问题:

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

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

【问题讨论】:

  • 你试过this吗?
  • @dowhilefor 谢谢,我正在看看。
  • @dowhile 是的,解决了问题,再次感谢!

标签: c# .net wpf


【解决方案1】:

感谢dowhilefor的评论,我从这个link得到了答案:

问题是 WPF 隐式添加了 Canvas 相对于父容器的边距。在我的情况下,父容器是一个 Grid 并且我没有定义任何边距,画布正在填充特定的单元格。然而,这以某种方式被合并到位图中。

解决方案,将 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多