2011-09-11 25 views
1

我在我的窗口中有一個畫布,偶爾我想拍攝內容的快照。畫布的位圖不正確地基於窗口的左上角

我有以下方法可以這樣做:

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

你試過[這](http://www.west-wind.com/weblog/posts/2007/Sep/10/Rendering-a-WPF-Container -to-位圖)? – dowhilefor

+0

@dowhilefor謝謝,我正在看一看。 – Roland

+0

@dowhile是的,解決了這個問題,再次感謝! – Roland

回答

0

感謝的dowhilefor我從這個link得到的答案註釋:

的問題是WPF隱式添加畫布的邊緣相對於父容器。在我的情況下,父容器是一個網格,我沒有定義任何邊距,畫布填滿了特定的單元格。儘管如此,這種方式也被融入到了位圖中。

該解決方案將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>