Compartir vía


WriteableBitmap Clase

Definición

Proporciona un BitmapSource en el que se puede grabar o actualizar.

public ref class WriteableBitmap sealed : System::Windows::Media::Imaging::BitmapSource
public sealed class WriteableBitmap : System.Windows.Media.Imaging.BitmapSource
type WriteableBitmap = class
    inherit BitmapSource
Public NotInheritable Class WriteableBitmap
Inherits BitmapSource
Herencia

Ejemplos

En el ejemplo siguiente se muestra cómo se puede usar como WriteableBitmap origen de un Image objeto para dibujar píxeles cuando se mueve el mouse.

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Input;

namespace WriteableBitmapDemo
{
    class Program
    {
        static WriteableBitmap writeableBitmap;
        static Window w;
        static Image i;

        [STAThread]
        static void Main(string[] args)
        {
            i = new Image();
            RenderOptions.SetBitmapScalingMode(i, BitmapScalingMode.NearestNeighbor);
            RenderOptions.SetEdgeMode(i, EdgeMode.Aliased);
           
            w = new Window();
            w.Content = i;
            w.Show();

            writeableBitmap = new WriteableBitmap(
                (int)w.ActualWidth, 
                (int)w.ActualHeight, 
                96, 
                96, 
                PixelFormats.Bgr32, 
                null);

            i.Source = writeableBitmap;

            i.Stretch = Stretch.None;
            i.HorizontalAlignment = HorizontalAlignment.Left;
            i.VerticalAlignment = VerticalAlignment.Top;

            i.MouseMove += new MouseEventHandler(i_MouseMove);
            i.MouseLeftButtonDown += 
                new MouseButtonEventHandler(i_MouseLeftButtonDown);
            i.MouseRightButtonDown += 
                new MouseButtonEventHandler(i_MouseRightButtonDown);

            w.MouseWheel += new MouseWheelEventHandler(w_MouseWheel);

            Application app = new Application();
            app.Run();
        }

        // The DrawPixel method updates the WriteableBitmap by using
        // unsafe code to write a pixel into the back buffer.
        static void DrawPixel(MouseEventArgs e)
        {
            int column = (int)e.GetPosition(i).X;
            int row = (int)e.GetPosition(i).Y;

            try{
                // Reserve the back buffer for updates.
                writeableBitmap.Lock();

                unsafe
                {
                    // Get a pointer to the back buffer.
                    IntPtr pBackBuffer = writeableBitmap.BackBuffer;

                    // Find the address of the pixel to draw.
                    pBackBuffer += row * writeableBitmap.BackBufferStride;
                    pBackBuffer += column * 4;

                    // Compute the pixel's color.
                    int color_data = 255 << 16; // R
                    color_data |= 128 << 8;   // G
                    color_data |= 255 << 0;   // B

                    // Assign the color data to the pixel.
                    *((int*) pBackBuffer) = color_data;
                }
    
                // Specify the area of the bitmap that changed.
                writeableBitmap.AddDirtyRect(new Int32Rect(column, row, 1, 1));
            }
            finally{
                // Release the back buffer and make it available for display.
                writeableBitmap.Unlock();
            }
        }

        static void ErasePixel(MouseEventArgs e)
        {
            byte[] ColorData = { 0, 0, 0, 0 }; // B G R

            Int32Rect rect = new Int32Rect(
                    (int)(e.GetPosition(i).X), 
                    (int)(e.GetPosition(i).Y), 
                    1, 
                    1);

            writeableBitmap.WritePixels( rect, ColorData, 4, 0);
        }

        static void i_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            ErasePixel(e);
        }

        static void i_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DrawPixel(e);
        }

        static void i_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                DrawPixel(e);
            }
            else if (e.RightButton == MouseButtonState.Pressed)
            {
                ErasePixel(e);
            }
        }

        static void w_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            System.Windows.Media.Matrix m = i.RenderTransform.Value;

            if (e.Delta > 0)
            {
                m.ScaleAt(
                    1.5, 
                    1.5, 
                    e.GetPosition(w).X, 
                    e.GetPosition(w).Y);
            }
            else
            {
                m.ScaleAt(
                    1.0 / 1.5, 
                    1.0 / 1.5, 
                    e.GetPosition(w).X, 
                    e.GetPosition(w).Y);
            }

            i.RenderTransform = new MatrixTransform(m);
        }
    }
}

Comentarios

Use la WriteableBitmap clase para actualizar y representar un mapa de bits por fotograma. Esto resulta útil para generar contenido algorítmico, como una imagen fractal y para la visualización de datos, como un visualizador de música.

La WriteableBitmap clase usa dos búferes. El búfer de reserva se asigna en la memoria del sistema y acumula contenido que no se muestra actualmente. El búfer frontal se asigna en la memoria del sistema y contiene el contenido que se muestra actualmente. El sistema de representación copia el búfer frontal en la memoria de vídeo para su visualización.

Dos subprocesos usan estos búferes. El subproceso de la interfaz de usuario (UI) genera la interfaz de usuario, pero no la presenta a la pantalla. El subproceso de interfaz de usuario responde a la entrada del usuario, los temporizadores y otros eventos. Una aplicación puede tener varios subprocesos de interfaz de usuario. El subproceso de representación crea y representa los cambios del subproceso de interfaz de usuario. Solo hay un subproceso de representación por aplicación.

El subproceso de interfaz de usuario escribe contenido en el búfer de reserva. El subproceso de representación lee el contenido del búfer frontal y lo copia en la memoria de vídeo. Se realiza un seguimiento de los cambios en el búfer de reserva con regiones rectangulares modificadas.

Llame a una de las WritePixels sobrecargas para actualizar y mostrar contenido en el búfer de reserva automáticamente.

Para un mayor control sobre las actualizaciones y para el acceso multiproceso al búfer de reserva, use el siguiente flujo de trabajo.

  1. Llame al Lock método para reservar el búfer de reserva para las actualizaciones.

  2. Obtenga un puntero al búfer de reserva accediendo a la BackBuffer propiedad .

  3. Escriba los cambios en el búfer de reserva. Otros subprocesos pueden escribir cambios en el búfer de reserva cuando WriteableBitmap está bloqueado.

  4. Llame al AddDirtyRect método para indicar las áreas que han cambiado.

  5. Llame al Unlock método para liberar el búfer de reserva y permitir la presentación en la pantalla.

Cuando se envían actualizaciones al subproceso de representación, el subproceso de representación copia los rectángulos cambiados del búfer de reserva al búfer frontal. El sistema de representación controla este intercambio para evitar interbloqueos y volver a dibujar artefactos, como "desgarro".

Constructores

WriteableBitmap(BitmapSource)

Inicializa una nueva instancia de la clase WriteableBitmap usando el objeto BitmapSource especificado.

WriteableBitmap(Int32, Int32, Double, Double, PixelFormat, BitmapPalette)

Inicializa una nueva instancia de la clase WriteableBitmap con los parámetros especificados.

Propiedades

BackBuffer

Obtiene un puntero al búfer de reserva.

BackBufferStride

Obtiene un valor que indica el número de bytes de una sola fila de datos de píxel.

CanFreeze

Obtiene un valor que indica si el objeto se puede convertir en no modificable.

(Heredado de Freezable)
DependencyObjectType

Obtiene el DependencyObjectType objeto que encapsula el tipo CLR de esta instancia.

(Heredado de DependencyObject)
Dispatcher

Obtiene el objeto Dispatcher al que está asociado DispatcherObject.

(Heredado de DispatcherObject)
DpiX

Obtiene los puntos horizontales por pulgada (ppp) de la imagen.

(Heredado de BitmapSource)
DpiY

Obtiene los puntos verticales por pulgada (ppp) de la imagen.

(Heredado de BitmapSource)
Format

Obtiene el PixelFormat nativo de los datos del mapa de bits.

(Heredado de BitmapSource)
HasAnimatedProperties

Obtiene un valor que indica si uno o más objetos AnimationClock se asocian a cualquiera de las propiedades de dependencia de este objeto.

(Heredado de Animatable)
Height

Obtiene el alto del mapa de bits de origen en unidades independientes del dispositivo (1/96 pulgadas por unidad).

(Heredado de BitmapSource)
IsDownloading

Obtiene un valor que indica si el contenido de BitmapSource se está descargando actualmente.

(Heredado de BitmapSource)
IsFrozen

Obtiene un valor que indica si el objeto se puede modificar actualmente.

(Heredado de Freezable)
IsSealed

Obtiene un valor que indica si esta instancia está actualmente sellada (es de solo lectura).

(Heredado de DependencyObject)
Metadata

Obtiene los metadatos asociados a esta imagen de mapa de bits.

(Heredado de BitmapSource)
Palette

Obtiene la paleta de colores del mapa de bits, si se especifica una.

(Heredado de BitmapSource)
PixelHeight

Obtiene el alto del mapa de bits en píxeles.

(Heredado de BitmapSource)
PixelWidth

Obtiene el ancho del mapa de bits en píxeles.

(Heredado de BitmapSource)
Width

Obtiene el ancho del mapa de bits en unidades independientes del dispositivo (1/96 pulgadas por unidad).

(Heredado de BitmapSource)

Métodos

AddDirtyRect(Int32Rect)

Especifica el área del mapa de bits que cambió.

ApplyAnimationClock(DependencyProperty, AnimationClock)

Se aplica AnimationClock al valor de DependencyProperty especificado. Si la propiedad ya está animada, se usa el comportamiento de entrega SnapshotAndReplace.

(Heredado de Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Se aplica AnimationClock al valor de DependencyProperty especificado. Si la propiedad ya está animada, se usa el objeto HandoffBehavior especificado.

(Heredado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Aplica una animación a la DependencyProperty especificada. La animación se inicia al representar el siguiente fotograma. Si la propiedad especificada ya está animada, se usa el comportamiento de entrega SnapshotAndReplace.

(Heredado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Aplica una animación a la DependencyProperty especificada. La animación se inicia al representar el siguiente fotograma. Si la propiedad especificada ya está animada, se usa el objeto HandoffBehavior especificado.

(Heredado de Animatable)
CheckAccess()

Determina si el subproceso de la llamada tiene acceso a DispatcherObject.

(Heredado de DispatcherObject)
CheckIfSiteOfOrigin()

Comprueba si el contenido de origen del mapa de bits es de un sitio de origen conocido. Este método se utiliza para asegurarse de que las operaciones de copia son seguras.

(Heredado de BitmapSource)
ClearValue(DependencyProperty)

Borra el valor local de una propiedad. La propiedad que se va a borrar se especifica mediante un identificador DependencyProperty.

(Heredado de DependencyObject)
ClearValue(DependencyPropertyKey)

Borra el valor local de una propiedad de solo lectura. La propiedad que se va a borrar se especifica mediante un DependencyPropertyKey.

(Heredado de DependencyObject)
Clone()

Crea un clon modificable de este WriteableBitmap y hace copias en profundidad de los valores de este objeto. Cuando se copian propiedades de dependencia, este método copia las referencias de recursos y enlaces de datos (aunque podrían no resolverse), pero no copia las animaciones ni sus valores actuales.

CloneCore(Freezable)

Convierte esta instancia en una copia en profundidad del valor de BitmapSource especificado. Cuando se copian propiedades de dependencia, este método copia las referencias de recursos y enlaces de datos (aunque podrían no resolverse), pero no copia las animaciones ni sus valores actuales.

(Heredado de BitmapSource)
CloneCurrentValue()

Crea un clon modificable de este objeto ByteAnimationUsingKeyFrames y hace copias en profundidad de sus valores actuales. Las referencias de recursos, los enlaces de datos y las animaciones no se copian, pero sí sus valores actuales.

CloneCurrentValueCore(Freezable)

Convierte esta instancia en una copia en profundidad modificable del elemento BitmapSource especificado mediante los valores de propiedad actuales. Las referencias de recursos, los enlaces de datos y las animaciones no se copian, pero sí sus valores actuales.

(Heredado de BitmapSource)
CoerceValue(DependencyProperty)

Convierte el valor de la propiedad de dependencia especificada. Esto se logra invocando cualquier función CoerceValueCallback especificada en los metadatos de la propiedad de dependencia tal como existe en la clase DependencyObject que llama.

(Heredado de DependencyObject)
CopyPixels(Array, Int32, Int32)

Copia los datos de píxeles del mapa de bits en una matriz de píxeles con el paso especificado, a partir de la posición de desplazamiento especificada.

(Heredado de BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Copia los datos de píxeles del mapa de bits del rectángulo especificado en una matriz de píxeles con el paso especificado, a partir de la posición de desplazamiento especificada.

(Heredado de BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Copia los datos de píxeles del mapa de bits dentro del rectángulo especificado.

(Heredado de BitmapSource)
CreateInstance()

Inicializa una nueva instancia de la clase Freezable.

(Heredado de Freezable)
CreateInstanceCore()

Cuando se implementa en una clase derivada, crea una nueva instancia de la clase Freezable derivada.

(Heredado de Freezable)
Equals(Object)

Determina si un objeto DependencyObject proporcionado es equivalente al objeto DependencyObject actual.

(Heredado de DependencyObject)
Freeze()

Convierte el objeto actual en no modificable y establece su propiedad IsFrozen en true.

(Heredado de Freezable)
FreezeCore(Boolean)

Crea una instancia de la clase BitmapSource o una clase derivada inmutable.

(Heredado de BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Devuelve el valor no animado del objeto DependencyProperty especificado.

(Heredado de Animatable)
GetAsFrozen()

Crea una copia inmovilizada de Freezable, con los valores de propiedades base (no animadas). Puesto que se inmoviliza la copia, se copia cualquier subobjeto inmovilizado por referencia.

(Heredado de Freezable)
GetAsFrozenCore(Freezable)

Convierte esta instancia en un clon del objeto BitmapSource especificado.

(Heredado de BitmapSource)
GetCurrentValueAsFrozen()

Crea una copia inmovilizada de Freezable con los valores de propiedad actuales. Puesto que se inmoviliza la copia, se copia cualquier subobjeto inmovilizado por referencia.

(Heredado de Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Convierte esta instancia en un clon inmovilizado del valor de BitmapSource especificado. Las referencias de recursos, los enlaces de datos y las animaciones no se copian, pero sí sus valores actuales.

(Heredado de BitmapSource)
GetHashCode()

Obtiene un código hash de este objeto DependencyObject.

(Heredado de DependencyObject)
GetLocalValueEnumerator()

Crea un enumerador especializado para determinar qué propiedades de dependencia han establecido localmente los valores en DependencyObject.

(Heredado de DependencyObject)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
GetValue(DependencyProperty)

Devuelve el valor efectivo actual de una propiedad de dependencia en esta instancia de un DependencyObject.

(Heredado de DependencyObject)
InvalidateProperty(DependencyProperty)

Vuelve a evaluar el valor efectivo para la propiedad de dependencia especificada.

(Heredado de DependencyObject)
Lock()

Restringe el búfer de reserva a las actualizaciones.

MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
OnChanged()

Se le llama cuando el objeto Freezable actual se modifica.

(Heredado de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Se asegura de que se establecen los punteros contextuales adecuados para un miembro de datos DependencyObjectType que se acaba de establecer.

(Heredado de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Este miembro admite la infraestructura de Windows Presentation Foundation (WPF) y no está pensada para usarse directamente desde el código.

(Heredado de Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Reemplaza la implementación DependencyObject de OnPropertyChanged(DependencyPropertyChangedEventArgs) para invocar también cualquier controlador Changed en respuesta a una propiedad de dependencia cambiante de tipo Freezable.

(Heredado de Freezable)
ReadLocalValue(DependencyProperty)

Devuelve el valor local de una propiedad de dependencia, si existe.

(Heredado de DependencyObject)
ReadPreamble()

Se asegura de que se tiene acceso a Freezable desde un subproceso válido. Los herederos de Freezable deben llamar a este método al inicio de las API que leen miembros de datos que no son propiedades de dependencia.

(Heredado de Freezable)
SetCurrentValue(DependencyProperty, Object)

Establece el valor de una propiedad de dependencia sin cambiar el origen del valor.

(Heredado de DependencyObject)
SetValue(DependencyProperty, Object)

Establece el valor local de una propiedad de dependencia, especificado mediante el identificador de la propiedad de dependencia.

(Heredado de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Establece el valor local de una propiedad de dependencia de solo lectura, especificado por el identificador DependencyPropertyKey de la propiedad de dependencia.

(Heredado de DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Devuelve un valor que indica si los procesos de serialización deben serializar el valor de la propiedad de dependencia especificada.

(Heredado de DependencyObject)
ToString()

Crea una representación de cadena de este objeto basándose en la referencia cultural actual.

(Heredado de ImageSource)
ToString(IFormatProvider)

Crea una representación de cadena de este objeto basándose en el objeto IFormatProvider que se pasa. Si el proveedor es null, se usará la propiedad CurrentCulture.

(Heredado de ImageSource)
TryLock(Duration)

Intenta bloquear el mapa de bits exactamente durante el tiempo que se ha especificado.

Unlock()

Libera el búfer de reserva de modo que esté disponible para la presentación.

VerifyAccess()

Exige que el subproceso de la llamada tenga acceso a DispatcherObject.

(Heredado de DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32)

Actualiza los píxeles de la región especificada del mapa de bits.

WritePixels(Int32Rect, Array, Int32, Int32, Int32)

Actualiza los píxeles de la región especificada del mapa de bits.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Actualiza los píxeles de la región especificada del mapa de bits.

WritePixels(Int32Rect, IntPtr, Int32, Int32, Int32, Int32)

Actualiza los píxeles de la región especificada del mapa de bits.

WritePostscript()

Genera el evento Changed para Freezable e invoca su método OnChanged(). Las clases que derivan de Freezable deben llamar a este método al final de cualquier API que modifique miembros de clase que no estén almacenados como propiedades de dependencia.

(Heredado de Freezable)
WritePreamble()

Comprueba que no se inmovilice Freezable y que se tiene acceso desde un contexto de subproceso válido. Los herederos de Freezable deben llamar a este método al inicio de las API que escriben en miembros de datos que no son propiedades de dependencia.

(Heredado de Freezable)

Eventos

Changed

Se produce cuando se modifican la clase Freezable o un objeto que la contiene.

(Heredado de Freezable)
DecodeFailed

Se produce si no puede cargarse la imagen debido a un encabezado de imagen dañado.

(Heredado de BitmapSource)
DownloadCompleted

Se produce cuando se ha descargado completamente el contenido de mapa de bits.

(Heredado de BitmapSource)
DownloadFailed

Se produce cuando no se puede descargar el contenido de mapa de bits.

(Heredado de BitmapSource)
DownloadProgress

Se produce cuando el progreso de la descarga del contenido de mapa de bits sufre un cambio.

(Heredado de BitmapSource)

Implementaciones de interfaz explícitas

IFormattable.ToString(String, IFormatProvider)

Da formato al valor de la instancia actual usando el formato especificado.

(Heredado de ImageSource)

Se aplica a

Consulte también