2011-08-12 25 views
3

にトリミングされて、私はこのコードを使用してWPFコントロールのイメージを取っています:取得画像が表示されるサイズ

BitmapEncoder imgEncoder = new PngBitmapEncoder(); 
RenderTargetBitmap bmpSource = new RenderTargetBitmap((int)element.ActualWidth, (int)element.ActualHeight, 150, 150, PixelFormats.Pbgra32); 
bmpSource.Render(element); 
imgEncoder.Frames.Add(BitmapFrame.Create(bmpSource)); 
using (MemoryStream ms = new MemoryStream()) 
{ 
    imgEncoder.Save(ms); 
    bytes = ms.ToArray(); 
    ms.Position = 0; 
    Image i = Image.FromStream(ms); 
    i.Save(@"C:\" + Guid.NewGuid().ToString() + "LARGE.png"); 
} 

トラブルがActualHeight/Widthプロパティは、すなわち表示部分描画時の高さと幅を与えています。コントロールの一部が画面に表示されない、つまりスクロールビューアに配置されていても、コントロール全体の画像を保存したいと思います。

bmpSource.Render()がコントロール全体を画像にレンダリングするように、コントロールのフルサイズ/高さを取得するにはどうすればよいですか?

答えて

0

一時的にコントロールからコンテキストを取り除く(バインドされていると問題が発生する可能性があります)、視覚的なポイントに変換したり、レンダリングのためにビューにスクロールしたりできます。

 SaveUsingEncoder(fileName, frameworkElement, new PngBitmapEncoder()); 

として

+0

私はそれに新しいサイズを与えて、updatelayout()を呼び出そうとしましたが、それは古いサイズに戻りますか? – Jon

+0

可視点は目に見えることが保証されている点です。スクロールビューアでは、コントロールをビューポートに移動するよりも、ビューポートをスクロールするほうが簡単です。 –

1
 private static void SaveUsingEncoder(string fileName, FrameworkElement UIElement, BitmapEncoder encoder) 
    { 
     int height = (int)UIElement.ActualHeight; 
     int width = (int)UIElement.ActualWidth; 

     // These two line of code make sure that you get completed visual bitmap. 
     // In case your Framework Element is inside the scroll viewer then some part which is not 
     // visible gets clip. 
     UIElement.Measure(new System.Windows.Size(width, height)); 
     UIElement.Arrange(new Rect(new System.Windows.Point(), new Point(width, height))); 

     RenderTargetBitmap bitmap = new RenderTargetBitmap(width, 

                   height, 
                   96, // These decides the dpi factors 
                   96,// The can be changed when we'll have preview options. 
                   PixelFormats.Pbgra32); 
     bitmap.Render(UIElement); 

     SaveUsingBitmapTargetRenderer(fileName, bitmap, encoder); 
    } 


    private static void SaveUsingBitmapTargetRenderer(string fileName, RenderTargetBitmap renderTargetBitmap, BitmapEncoder bitmapEncoder) 
    { 
     BitmapFrame frame = BitmapFrame.Create(renderTargetBitmap); 
     bitmapEncoder.Frames.Add(frame); 
     // Save file . 
     using (var stream = File.Create(fileName)) 
     { 
      bitmapEncoder.Save(stream); 
     } 
    } 

この関数を呼び出し、これが役立つことを願っています。

関連する問題