¿Hay alguna forma de obtener un DrawingContext
(o algo similar) para un WriteableBitmap
? Es decir. algo que le permita llamar a tipos simples de métodos DrawLine
/DrawRectangle
/etc, en lugar de manipular los píxeles brutos directamente.Obteniendo un DrawingContext para un wpf WriteableBitmap
Respuesta
Aparece the word is no.
Para referencia futura, tenemos la intención de utilizar un puerto de la Writeable Bitmap Extensions para WPF.
Para una solución puramente utilizando el código existente, cualquiera de las otras sugerencias mencionadas a continuación va a funcionar.
me pregunto lo mismo, ya que actualmente hago algo como:
DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
//
// ... draw on the drawingContext
//
RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, dpi, dpi, PixelFormats.Default);
bmp.Render(drawingVisual);
image.Source = bmp;
}
estoy tratando de utilizar el WriteableBitmap para permitir el acceso multiproceso en el búfer de píxeles, que en la actualidad no está permitido ni con un DrawingContext ni un RenderTargetBitmap. ¿Tal vez algún tipo de rutina WritePixels basada en lo que has recuperado del RenderTargetBitmap funcionaría?
Si no les importa usar System.Drawing
que podría hacer algo como:
var wb = new WriteableBitmap(width, height, dpi, dpi,
PixelFormats.Pbgra32, null);
wb.Lock();
var bmp = new System.Drawing.Bitmap(wb.PixelWidth, wb.PixelHeight,
wb.BackBufferStride,
PixelFormat.Format32bppPArgb,
wb.BackBuffer);
Graphics g = System.Drawing.Graphics.FromImage(bmp); // Good old Graphics
g.DrawLine(...); // etc...
// ...and finally:
g.Dispose();
bmp.Dispose();
wb.AddDirtyRect(...);
wb.Unlock();
No he tenido la oportunidad de probarlo por el momento, pero esto parece una solución muy razonable en WPF. ¡Gracias! –
En caso de que alguien se pregunte, probé el método DrawingVisual WPF mencionado en este tema y este método System.Drawing, y este método System.Drawing es MUCHO MÁS RÁPIDO. Estoy muy decepcionado con WPF. – Verax
Usted puede hacer lo mismo con WPF, con similares prestaciones mediante el uso de RenderTargetBitmap y DrawingVisual/DrawingContext –
encontré solución sixlettervariables' la más viable. Sin embargo, falta un "drawingContext.Close()". De acuerdo con MSDN, "Un DrawingContext debe cerrarse antes de que se pueda procesar su contenido". El resultado es la siguiente función de utilidad:
public static BitmapSource CreateBitmap(
int width, int height, double dpi, Action<DrawingContext> render)
{
DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
render(drawingContext);
}
RenderTargetBitmap bitmap = new RenderTargetBitmap(
width, height, dpi, dpi, PixelFormats.Default);
bitmap.Render(drawingVisual);
return bitmap;
}
Esto puede fácilmente ser utilizada como esta:
BitmapSource image = ImageTools.CreateBitmap(
320, 240, 96,
drawingContext =>
{
drawingContext.DrawRectangle(
Brushes.Green, null, new Rect(50, 50, 200, 100));
drawingContext.DrawLine(
new Pen(Brushes.White, 2), new Point(0, 0), new Point(320, 240));
});
El '.Close()' es implícita en el '.Dispose()' (o mejor?) - que es el punto entero detrás la declaración 'using'. Si deja * solo * el comando 'render (...)' dentro del bloque de uso, estará bien y no necesita '.Close()'. –
Gracias Eamon. Solucioné el error en el código. –
No hay 'WriteableBitmap' en esta respuesta, ¿por qué es el más alto? :) No tiene relación con la pregunta. –
Una forma diferente de resolver este problema es utilizar un RenderTargetBitmap
como un almacén de respaldo, simplemente como en el ejemplo WriteableBitmap
. Luego puede crear y emitir comandos de dibujo de WPF cuando lo desee. Por ejemplo:
// create the backing store in a constructor
var backingStore =
new RenderTargetBitmap(200,200,97,97,PixelFormats.Pbgra32);
myImage.Source = backingStore;
// whenever you want to update the bitmap, do:
var drawingVisual = new DrawingVisual();
var drawingContext = drawingVisual.RenderOpen();
{
// your drawing commands go here
drawingContext.DrawRectangle(
Brushes.Red, new Pen(),
new Rect(this.RenderSize));
}
Render(drawingContext);
drawingContext.Close();
backingStore.Render(drawingVisual);
Si desea volver a dibujar este RenderTargetBitmap
cada cuadro, se puede coger el evento CompositionTarget.Rendering
, así:
CompositionTarget.Rendering += MyRenderingHandler;
- 1. Guardar WriteableBitmap al archivo usando WPF
- 2. Cómo dibujar directamente en mapa de bits (BitmapSource, WriteableBitmap) en WPF?
- 3. Obteniendo un selector jQuery para un elemento
- 4. Usando FJCore para codificar Silverlight WriteableBitmap
- 5. Dibujando en WriteableBitmap
- 6. Silverlight: BitmapImage to WriteableBitmap
- 7. Obteniendo las coordenadas superiores izquierdas de un UIElement de WPF
- 8. Obteniendo el verdadero cuadro delimitador visual de un elemento WPF?
- 9. Obteniendo un impulso :: shared_ptr para este
- 10. Obteniendo CLSID para un archivo DLL?
- 11. Obteniendo un forech para ejecutar una vez
- 12. Obteniendo la imagen para estirar un div
- 13. Obteniendo eventos WPF ETW utilizando XPerf.exe
- 14. Obteniendo un NSImage de un NSProgressIndicator
- 15. Obteniendo un vertex_handle desde un edge_iterator
- 16. Convertir el formato de píxeles de WriteableBitmap a Bgra32 en C# wpf
- 17. obteniendo la posición actual de un XmlReader
- 18. Obteniendo un objeto JQuery vacío
- 19. Obteniendo Factores de un Número
- 20. ¿Cómo puedo escribir una secuencia en WriteableBitmap?
- 21. No puedo inicializar WriteableBitmap con BitmapImage
- 22. Obteniendo un nodo en JTree
- 23. Obteniendo un valor de Request.Headers
- 24. Obteniendo java.lang.reflect.Method de un ProceedingJoinPoint?
- 25. ¿Cómo puedo convertir WriteableBitmap a BitmapImage?
- 26. WPF VirtualizingStackPanel para un mayor rendimiento
- 27. Sugiera un visor de PDF para WPF
- 28. ¿Forzar un control WPF para actualizar?
- 29. ¿Utiliza MEF para importar un WPF DataTemplate?
- 30. Encabezado de columna para un WPF TreeView
Esa no es una palabra oficial. Es solo un tipo que dice algo en un foro. –
Punto tomado; texto actualizado Supongo que se podría decir que significa "oficial" como en "publicado en un foro supervisado por funcionarios, y no corregido por ellos", pero eso es un poco exagerado :) –