2011-03-03 30 views
10

Estoy tratando de llamar al método WriteableBitmap.WritePixels, pero parece que no puedo entender los parámetros. El artículo de MSDN es muy aburrido (O shuold, digo ... ¿nulo?), Y no pude entender cómo usar el método.Llamando al método WriteableBitmap.WritePixels

Editar: traté de modificar un código de este artículo: http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap%28v=VS.90%29.aspx

 PixelFormat pf = PixelFormats.Rgba128Float; 
     WriteableBitmap wb = new WriteableBitmap(width * 5, height * 5, 100, 100, pf, new BitmapPalette(new List<Color> { Color.FromArgb(255, 255, 0, 0) })); 
     byte[] ColorData = { 0, 0, 0, 0 }; 
     wb.WritePixels(new Int32Rect(0, 0, 1, 1), ColorData, 4, 0); 
     Background.Source = wb; 

En la línea antes de la última línea del depurador afirma que el (ColorData) tamaño del búfer no es suficiente.

Edit2: Lo intenté de nuevo:

 void RefreshGraphics() 
    { 
     PixelFormat pf = PixelFormats.Pbgra32; 
     WriteableBitmap wb = new WriteableBitmap(width * 5, height * 5, 100, 100, pf, new BitmapPalette(new List<Color> { Color.FromArgb(255, 255, 0, 0) })); 
     byte[] ColorData = new byte[1000]; 
     byte t = 0; 
     for (int i = 0; i < 1000; i++) 
      ColorData[i] = t++; 
     wb.WritePixels(new Int32Rect(0, 0, 10, 10), ColorData, 10, 0); 
     Background.Source = wb; 
    } 

Ahora, un "Valor no está en el rango esperado." El StackTrace no dice cuál ...

Datos 3: Problema resuelto! No sé cómo o por qué, pero el código funciona (y tengo miedo de cambiarlo ...)

Respuesta

3

Compruebe los valores de alto y ancho. ¡Tal vez la matriz de bytes simplemente no es lo suficientemente grande!

+0

La altura y el ancho de qué? ¿El rectángulo o el objeto WritableBitmap? –

+0

¿Y cuál debería ser el tamaño de la matriz comparada con la altura/ancho? –

+1

Si no comprende cuál es el tamaño, no comprende lo que está haciendo. ¡Lee el artículo en la respuesta de JacobJ! –

7

This article (para .NET 3) tiene algunos comentarios en los ejemplos que ayudan a explicar cuáles son los diferentes parámetros (conceptos como "zancada") y cómo calcularlos. Desplácese hasta la parte inferior donde están los ejemplos del código real. No estoy seguro de por qué eliminaron esos comentarios de la versión .NET 4.

Editar: ¿Puedes compartir cuál es tu objetivo con WritePixels? Si está tratando de dibujar imágenes, formas, etc., normalmente uso DrawingContext para escribir en el mapa de bits y luego procesarlo en un DrawingVisual.

7

Aquí es la manera que lo entiendo:

  • System.Windows.Int32Rect sourceRect: El argumento más obvio. Representa la posición, el ancho y la altura del subconjunto de su mapa de bits en el que está intentando escribir.
  • Sistema.Array píxeles: Una matriz bidimensional o bidimensional de bytes. El formato de píxeles que utilizó en el constructor del mapa de bits determinará cuántas entradas de bytes se utilizan para cada píxel.
  • System.Int32 paso: Define el número de píxeles de la matriz de entrada debe fila de cada uso (el ancho)
  • System.Int32 compensar: Un desplazamiento de la matriz de píxeles de entrada, si desea volver a utilizar su array para más de una llamada WritePixels.
+0

'zancada' es el ancho en bytes de su matriz. Vea aquí: http://stackoverflow.com/a/13969778/6734314 – astrowalker

Cuestiones relacionadas