Pregunta

Esto puede ser una repetición de la siguiente pregunta sin respuesta:

 Help with bitmap lock - Format8bppIndexed

Estoy de bloqueo una imagen de la siguiente manera:

// PixelFormat is 8BppIndexed in my case.
Bitmap bmp = new Bitmap("mySampleImage.tif");

// ClipRectangle will be a Rectangle such as {x=128, y=290, width=250, height=200},
// selected by the user by seeing the image on screen. Thus, it's a valid region
BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);

unsafe
{
  byte* origin = (byte*)data.Scan0.ToPointer();

  // Processing...
}

En la sección de procesamiento, me paso a través de los píxeles de la ClipRectangle en la dirección y. Sin embargo, un píxel que debería ser vueltas válidas con un error de acceso a la memoria, diciendo que no se puede eliminar la referencia al puntero.

Por ejemplo, en una imagen de 704x600 usando:

ClipRectangle = {x=128, y=290, width=250, height=200}

El píxel (128x321) debe ser válida. Al escribir manualmente en los cálculos para conseguir que el píxel en la ventana intermedia, me sale el siguiente:

origin + (321 * stride) + 128
0x053a80c0
    *(origin + (321 * stride) + 128): Cannot dereference 'origin + (321 * stride) + 128'. The pointer is not valid.

zancada es 704, la lógica en mi software viene con la posición del puntero exacta ya que la ventana intermedia, por lo que todo parece correcto. Los píxeles de Y de 290-320 se pueden desreferenciados bien. Si en lugar cierro todo el mapa de bits, toda mi lógica pasa bien, pero tengo dudas sobre si estoy recibiendo los píxeles correctas, o cómo se utiliza el rectángulo de bloqueo en LockBits.

¿Por qué no puedo acceder a los píxeles bloqueados esperados en el BitmapData Cuando bloqueo sólo la región que necesito?

¿Fue útil?

Solución

Cuando se bloquea bits utilizando un rectángulo con un desplazamiento, BitmapData.Scan0 no devuelve el mapa de bits origen, sino más bien el origen rectángulo especificado.

Por lo tanto, si se ha utilizado:

Rectangle rect = new Rectangle(128, 290, 250, 200);
BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);

a continuación, el desplazamiento desde Scan0 máxima es de (250 * Stride) + 200.

En otras palabras, el píxel en (128x321) sería a (Scan0 + (321 - 290) * Stride).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top