2011-05-03 8 views
10

Renderizar un control WPF a una imagen de mapa de bits no es una tarea trivial como descubrí hoy. Como sé que ahora se trata de que el margen de control de los padres es un problema, como escribió Rick Strahl en su blogRenderice un control WPF "no visible" a una imagen de mapa de bits

http://www.west-wind.com/weblog/posts/2007/Sep/10/Rendering-a-WPF-Container-to-Bitmap

Hasta ahora yo soy capaz de crear mapas de bits de cualquier control que es visible en el interior de una ventana, pero lo que yo realmente lo que hay que hacer es crear mapas de bits de controles invisibles. Simplemente los creo en código (formas simples como rectángulo y elipse) y quiero guardarlos como bitmaps en el disco. Para mí, esto resulta ser una pesadilla personal. Como mi ActualHeight y ActualWidth siempre son 0, utilizo Height y Width. Pero todo lo que obtengo es una imagen vacía en el tamaño de mi control.

¿Cómo puedo crear un mapa de bits de cualquier control sin agregarlo a una ventana visible?

Respuesta

19

No se han realizado diseños en los elementos nuevos. Debe llamar a Medir y Organizar en el control antes de procesarlo.

Canvas c = new Canvas(); 

Rectangle r = new Rectangle 
{ 
    Fill = Brushes.Orange, 
    Width = 200, 
    Height = 100 
}; 

Ellipse e = new Ellipse 
{ 
    Fill = Brushes.DodgerBlue, 
    Width = 100, 
    Height = 100 
}; 

Canvas.SetLeft(e, 150); 

c.Children.Add(r); 
c.Children.Add(e); 

var size = new Size(250,100); 
c.Measure(size); 
c.Arrange(new Rect(size)); 

RenderTargetBitmap bmp = new RenderTargetBitmap(250, 100, 96, 96, PixelFormats.Pbgra32); 

bmp.Render(c); 

PngBitmapEncoder enc = new PngBitmapEncoder(); 
enc.Frames.Add(BitmapFrame.Create(bmp)); 

using(var s = File.OpenWrite("image.png")) 
    enc.Save(s); 
Cuestiones relacionadas