C#rápida representación de píxeles
graphics drawing (3)
Puede probar mi biblioteca de procesamiento de imágenes LINQ para trabajar con sus "mapas de bits de almacenamiento intermedio". Utiliza una sintaxis muy accesible, pero es muy eficaz para los grandes mapas de bits. Está disponible en Nuget como un solo archivo incluido en su proyecto.
¡Espero que ayude!
Estoy desarrollando aplicaciones de procesamiento de profundidad (Xbox Kinect, Asus Xtion, etc.) usando OpenNI.
Necesito una forma muy simple y rápida de dibujar en un formulario de Windows cuando hay nuevos datos de profundidad disponibles del sensor (30 o 60 fps dependiendo de la resolución).
Actualmente estoy invalidando un panel de doble buffer de un hilo separado cuando los datos están disponibles, y luego estableciendo los píxeles de un mapa de bits en el método de pintura del panel, produciendo un predecible horrible de 5 fps.
System.Drawing.Graphics parece carecer de una forma rápida de establecer píxeles individuales, a menos que alguien pueda indicar lo contrario.
Literalmente solo necesito establecer colores de píxeles, por lo que me gustaría evitar el uso de API de renderizado de alta velocidad de terceros si es posible, e idealmente usar algo tan nativo como sea posible.
¿Alguien tiene alguna sugerencia?
Si está utilizando Bitmaps, debe usar LockBits y UnlockBits para acceder a los datos directamente en la memoria. En C #, puede obtener un rendimiento adicional mediante el uso de bloques de código y punteros inseguros.
Consulte este enlace para obtener más información: http://web.archive.org/web/20150227183132/http://bobpowell.net/lockingbits.aspx
image.SetPixel()
es muy lento cuando reemplaza muchos píxeles por fotograma y necesita muchos fotogramas por segundo.
Será mucho más rápido cuando use un WriteableBitmap y llame a CopyPixels
De esta forma puede llenar la matriz con datos de píxeles usando múltiples hilos y simplemente ajustar la matriz a la imagen en una sola llamada.
EDITAR
Tenga en cuenta que WriteableBitmap es una clase WPF. Si está obligado a WinForms puede necesitar crear su propia implementación. Interoperabilidad WPF / WinForms / GDI: convirtiendo un WriteableBitmap a System.Drawing.Image?