WPF equivalente a Bitmap.LockBits

Tengo el siguiente código de trabajo en una aplicación Win Forms:

Bitmap bitmap = new Bitmap(imageWidth, imageHeight, PixelFormat.Format32bppArgb);
Rectangle rect = new Rectangle(0, 0, imageWidth, imageHeight);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

Tao.DevIl.Il.ilConvertImage(Tao.DevIl.Il.IL_BGRA, Tao.DevIl.Il.IL_UNSIGNED_BYTE);
Tao.DevIl.Il.ilCopyPixels(0, 0, 0, imageWidth, imageHeight, 1, Tao.DevIl.Il.IL_BGRA, Tao.DevIl.Il.IL_UNSIGNED_BYTE, bitmapData.Scan0);

bitmap.UnlockBits(bitmapData);

Me gustaría convertir este código para que sea compatible con WPF y se pueda visualizar en la interfaz de usuario. Esto significa que probablemente tendré que convertir System.Drawing.Bitmap a System.Windows.Media.Imaging.BitmapImage.

Sin embargo, en lugar de convertir entre los dos, me preguntaba si hay una forma más directa / rápida de hacer esto. Como hacer algo como LockBits () en BitmapImage.

IlCopyPixels () toma un IntPtr como último baram. En el código anterior obtengo este formulario BitmapData.Scan0.

Edit:

Gracias a la respuesta de Erno, se me ocurrió lo siguiente:

WriteableBitmap bitmap = new WriteableBitmap(imageWidth, imageHeight, 96, 96, PixelFormats.Bgra32, null);
bitmap.Lock();
Tao.DevIl.Il.ilCopyPixels(0, 0, 0, imageWidth, imageHeight, 1, Tao.DevIl.Il.IL_BGRA, Tao.DevIl.Il.IL_UNSIGNED_BYTE, bitmap.BackBuffer);
bitmap.Unlock();

Sin embargo, cuando configuro el mapa de bits como fuente de una imagen, no veo nada. Sin embargo, no obtengo ninguna excepción.

¡Gracias!

preguntado el 10 de mayo de 11 a las 13:05

2 Respuestas

Echa un vistazo a la Mapa de bits escribible se ocupa de la mayoría de estos detalles.

contestado el 10 de mayo de 11 a las 18:05

¿Podría mostrar cómo está asignando el mapa de bits como fuente de una imagen? También estoy un poco preocupado por todos los parámetros de iLCopyPixels. El formato de píxel debe ser correcto. ¿Podría intentar copiar los píxeles en una matriz y luego asignar la propiedad Pixels del mapa de bits? - Emond Erno

Solo estoy configurando la propiedad Source de una imagen en mi WriteableBitmap. Estoy usando el marco Tao, así que no tengo otra opción que CopyPixels. Espero que funcione con una matriz, lo veré. - SaphuA

Por cierto, Bitmap y WriteableBitmap no tienen una propiedad Pixels. - SaphuA

Lo siento, tiendo a mezclar WPF y Silverlight WriteableBitmaps. - Emond Erno

La solución temporal actual que tengo es convertir el mapa de bits en un BitmapSource usando el siguiente código:

Bitmap bitmap = new Bitmap(imageWidth, imageHeight, PixelFormat.Format32bppArgb);
Rectangle rect = new Rectangle(0, 0, imageWidth, imageHeight);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

Tao.DevIl.Il.ilCopyPixels(0, 0, 0, imageWidth, imageHeight, 1, Tao.DevIl.Il.IL_BGRA, Tao.DevIl.Il.IL_UNSIGNED_BYTE, bitmapData.Scan0);
Tao.DevIl.Il.ilDeleteImages(1, ref imageId);

bitmap.UnlockBits(bitmapData);

using (MemoryStream str = new MemoryStream())
{
    bitmap.Save(str, ImageFormat.Bmp);
    str.Seek(0, SeekOrigin.Begin);
    BitmapDecoder bdc = new BmpBitmapDecoder(str, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    // Retrieve the BitmapSource
    image1.Source = bdc.Frames[0];
}

Obviamente, preferiría crear un BitmapSource directamente sin la sobrecarga adicional de crear primero un Bitmap. ¡Cualquier sugerencia es bienvenida!

contestado el 18 de mayo de 11 a las 11:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.