WriteableBitmap Klasse

Definition

Stellt eine BitmapSource bereit, in die geschrieben werden kann und die aktualisiert werden kann.

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
Vererbung

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie ein WriteableBitmap als Quelle für ein Image verwendet werden kann, um Pixel zu zeichnen, wenn sich die Maus bewegt.

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);
        }
    }
}

Hinweise

Verwenden Sie die WriteableBitmap -Klasse, um eine Bitmap pro Frame zu aktualisieren und zu rendern. Dies ist nützlich für die Generierung algorithmischer Inhalte, z. B. ein fraktales Bild, und für die Datenvisualisierung, z. B. eine Musikvisualisierung.

Die WriteableBitmap -Klasse verwendet zwei Puffer. Der Rückpuffer wird im Systemspeicher zugeordnet und sammelt Inhalte, die derzeit nicht angezeigt werden. Der Frontpuffer wird im Systemspeicher zugeordnet und enthält den inhalt, der derzeit angezeigt wird. Das Renderingsystem kopiert den Frontpuffer zur Anzeige in den Videospeicher.

Zwei Threads verwenden diese Puffer. Der Thread der Benutzeroberfläche generiert die Benutzeroberfläche, zeigt sie jedoch nicht auf dem Bildschirm an. Der UI-Thread reagiert auf Benutzereingaben, Timer und andere Ereignisse. Eine Anwendung kann über mehrere UI-Threads verfügen. Der Renderthread erstellt und rendert Änderungen aus dem UI-Thread. Es gibt nur einen Renderthread pro Anwendung.

Der UI-Thread schreibt Inhalte in den Backpuffer. Der Renderthread liest Inhalte aus dem Frontpuffer und kopiert ihn in den Videospeicher. Änderungen am Backpuffer werden mit geänderten rechteckigen Regionen nachverfolgt.

Rufen Sie eine der WritePixels Überladungen auf, um Inhalte im Backpuffer automatisch zu aktualisieren und anzuzeigen.

Verwenden Sie den folgenden Workflow, um mehr Kontrolle über Updates zu erhalten und mehrThreadzugriff auf den Backpuffer zu erhalten.

  1. Rufen Sie die Lock -Methode auf, um den Backpuffer für Updates zu reservieren.

  2. Rufen Sie einen Zeiger auf den Backpuffer ab, indem Sie auf die BackBuffer -Eigenschaft zugreifen.

  3. Schreiben Sie Änderungen in den Backpuffer. Andere Threads können Änderungen in den Backpuffer schreiben, wenn der WriteableBitmap gesperrt ist.

  4. Rufen Sie die AddDirtyRect -Methode auf, um Bereiche anzugeben, die sich geändert haben.

  5. Rufen Sie die Unlock -Methode auf, um den Backpuffer freizugeben und die Darstellung auf dem Bildschirm zuzulassen.

Wenn Updates an den Renderingthread gesendet werden, kopiert der Renderingthread die geänderten Rechtecke aus dem Backpuffer in den Frontpuffer. Das Renderingsystem steuert diesen Austausch, um Deadlocks zu vermeiden und Artefakte wie "Tearing" zu vermeiden.

Konstruktoren

WriteableBitmap(BitmapSource)

Initialisiert eine neue Instanz der WriteableBitmap-Klasse mit dem angegebenen BitmapSource.

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

Initialisiert eine neue Instanz der WriteableBitmap-Klasse mit den angegebenen Parametern.

Eigenschaften

BackBuffer

Ruft einen Zeiger auf den Hintergrundpuffer ab.

BackBufferStride

Ruft einen Wert ab, der die Anzahl der Bytes in einer einzelnen Zeile der Pixeldaten angibt.

CanFreeze

Ruft einen Wert ab, der anzeigt, ob das Objekt als nicht änderbar festgelegt werden kann.

(Geerbt von Freezable)
DependencyObjectType

Ruft die ab, die DependencyObjectType den CLR-Typ dieser instance umschließt.

(Geerbt von DependencyObject)
Dispatcher

Ruft den Dispatcher ab, der diesem DispatcherObject zugeordnet ist.

(Geerbt von DispatcherObject)
DpiX

Ruft die horizontalen Punkte pro Zoll (dpi) des Bilds ab.

(Geerbt von BitmapSource)
DpiY

Ruft die vertikalen Punkte pro Zoll (dpi) des Bilds ab.

(Geerbt von BitmapSource)
Format

Ruft das systemeigene PixelFormat der Bitmapdaten ab.

(Geerbt von BitmapSource)
HasAnimatedProperties

Ruft einen Wert ab, der angibt, ob einer der Abhängigkeitseigenschaften dieses Objekts ein oder mehrere AnimationClock-Objekte zugeordnet sind.

(Geerbt von Animatable)
Height

Ruft die Höhe der Quell-Bitmap in geräteunabhängigen Einheiten (1/96 Zoll pro Einheit) ab.

(Geerbt von BitmapSource)
IsDownloading

Ruft einen Wert ab, der angibt, ob der BitmapSource-Inhalt gegenwärtig heruntergeladen wird.

(Geerbt von BitmapSource)
IsFrozen

Ruft einen Wert ab, der angibt, ob das Objekt derzeit geändert werden kann.

(Geerbt von Freezable)
IsSealed

Ruft einen Wert ab, der angibt, ob diese Instanz derzeit versiegelt (schreibgeschützt) ist.

(Geerbt von DependencyObject)
Metadata

Ruft die Metadaten ab, die diesem Bitmap-Bild zugeordnet sind.

(Geerbt von BitmapSource)
Palette

Ruft die Farbpalette der Bitmap ab (sofern angegeben).

(Geerbt von BitmapSource)
PixelHeight

Ruft die Höhe der Bitmap in Pixeln ab.

(Geerbt von BitmapSource)
PixelWidth

Ruft die Breite der Bitmap in Pixeln ab.

(Geerbt von BitmapSource)
Width

Ruft die Breite der Bitmap in geräteunabhängigen Einheiten ab (1/96 Zoll pro Einheit).

(Geerbt von BitmapSource)

Methoden

AddDirtyRect(Int32Rect)

Gibt den Bereich der Bitmap an, der geändert wurde.

ApplyAnimationClock(DependencyProperty, AnimationClock)

Wendet einen AnimationClock auf die angegebene DependencyProperty an. Wenn die Eigenschaft bereits animiert wird, wird das SnapshotAndReplace-Übergabeverhalten verwendet.

(Geerbt von Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Wendet einen AnimationClock auf die angegebene DependencyProperty an. Wenn die Eigenschaft bereits animiert wird, wird das angegebene HandoffBehavior verwendet.

(Geerbt von Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Wendet eine Animation auf die angegebene DependencyProperty an. Die Animation wird gestartet, wenn der nächste Frame gerendert wird. Wenn die angegebene Eigenschaft bereits animiert wird, wird das SnapshotAndReplace-Übergabeverhalten verwendet.

(Geerbt von Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Wendet eine Animation auf die angegebene DependencyProperty an. Die Animation wird gestartet, wenn der nächste Frame gerendert wird. Wenn die angegebene Eigenschaft bereits animiert wird, wird das angegebene HandoffBehavior verwendet.

(Geerbt von Animatable)
CheckAccess()

Bestimmt, ob der aufrufende Thread auf dieses DispatcherObject zugreifen kann.

(Geerbt von DispatcherObject)
CheckIfSiteOfOrigin()

Überprüft, ob der Inhalt der Bitmapquelle aus einer bekannten Ursprungssite stammt. Diese Methode wird verwendet, um sicherzustellen, dass das Kopieren von Pixeln sicher ist.

(Geerbt von BitmapSource)
ClearValue(DependencyProperty)

Löscht den lokalen Wert einer Eigenschaft. Die Eigenschaft, deren Wert gelöscht werden soll, wird durch einen DependencyProperty-Bezeichner angegeben.

(Geerbt von DependencyObject)
ClearValue(DependencyPropertyKey)

Löscht den lokalen Wert einer schreibgeschützten Eigenschaft. Die Eigenschaft, deren Wert gelöscht werden soll, wird durch einen DependencyPropertyKey angegeben.

(Geerbt von DependencyObject)
Clone()

Erstellt einen änderbaren Klon dieser WriteableBitmap, indem tiefe Kopien der Werte dieses Objekts erzeugt werden. Beim Kopieren von Abhängigkeitseigenschaften kopiert diese Methode Ressourcenverweise und Datenbindungen (die aber möglicherweise nicht mehr aufgelöst werden können), jedoch keine Animationen oder ihre aktuellen Werte.

CloneCore(Freezable)

Macht diese Instanz zu einer tiefen Kopie der angegebenen BitmapSource. Beim Kopieren von Abhängigkeitseigenschaften kopiert diese Methode Ressourcenverweise und Datenbindungen (die aber möglicherweise nicht mehr aufgelöst werden können), jedoch keine Animationen oder ihre aktuellen Werte.

(Geerbt von BitmapSource)
CloneCurrentValue()

Erstellt einen änderbaren Klon des ByteAnimationUsingKeyFrames-Objekts, indem tiefe Kopien der aktuellen Werte dieses Objekts erzeugt werden. Ressourcenverweise, Datenbindungen und Animationen werden nicht kopiert, ihre aktuellen Werte werden jedoch kopiert.

CloneCurrentValueCore(Freezable)

Macht diese Instanz mithilfe aktueller Eigenschaftswerte zu einer tiefen Kopie der angegebenen BitmapSource, die geändert werden kann. Ressourcenverweise, Datenbindungen und Animationen werden nicht kopiert, ihre aktuellen Werte werden jedoch kopiert.

(Geerbt von BitmapSource)
CoerceValue(DependencyProperty)

Erzwingt den Wert der angegebenen Abhängigkeitseigenschaft. Dies erfolgt durch den Aufruf einer beliebigen CoerceValueCallback-Funktion, die in den Metadaten für die Abhängigkeitseigenschaft angegeben ist, während sie beim aufrufenden DependencyObject beendet wird.

(Geerbt von DependencyObject)
CopyPixels(Array, Int32, Int32)

Kopiert die Bitmap-Pixeldaten ab dem angegebenen Offset in ein Array von Pixeln mit dem angegebenen Schritt.

(Geerbt von BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Kopiert die Bitmap-Pixeldaten in dem angegebenen Rechteck ab dem angegebenen Offset in ein Array von Pixeln mit dem angegebenen Schritt.

(Geerbt von BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Kopiert die Bitmap-Pixeldaten im angegebenen Rechteck.

(Geerbt von BitmapSource)
CreateInstance()

Initialisiert eine neue Instanz der Freezable-Klasse.

(Geerbt von Freezable)
CreateInstanceCore()

Erstellt beim Implementieren in einer abgeleiteten Klasse eine neue Instanz der abgeleiteten Freezable-Klasse.

(Geerbt von Freezable)
Equals(Object)

Bestimmt, ob ein angegebenes DependencyObject dem aktuellen DependencyObject entspricht.

(Geerbt von DependencyObject)
Freeze()

Definiert das aktuelle Objekt als nicht änderbar und legt seine IsFrozen-Eigenschaft auf true fest.

(Geerbt von Freezable)
FreezeCore(Boolean)

Legt eine Instanz von BitmapSource oder einer abgeleiteten Klasse als unveränderlich fest.

(Geerbt von BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Gibt den nicht animierten Wert der angegebenen DependencyProperty zurück.

(Geerbt von Animatable)
GetAsFrozen()

Erstellt eine fixierte Kopie von Freezable mit Basiseigenschaftswerten (nicht animiert). Da die Kopie fixiert ist, werden alle fixierten Unterobjekte als Verweis kopiert.

(Geerbt von Freezable)
GetAsFrozenCore(Freezable)

Macht diese Instanz zu einem Klon des angegebenen BitmapSource-Objekts.

(Geerbt von BitmapSource)
GetCurrentValueAsFrozen()

Erstellt eine fixierte Kopie von Freezable mit aktuellen Eigenschaftswerten. Da die Kopie fixiert ist, werden alle fixierten Unterobjekte als Verweis kopiert.

(Geerbt von Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Macht diese Instanz zu einem fixierten Klon des angegebenen BitmapSource-Objekts. Ressourcenverweise, Datenbindungen und Animationen werden nicht kopiert, ihre aktuellen Werte werden jedoch kopiert.

(Geerbt von BitmapSource)
GetHashCode()

Ruft einen Hashcode für diese DependencyObject ab.

(Geerbt von DependencyObject)
GetLocalValueEnumerator()

Erstellt einen spezialisierten Enumerator, mit dem bestimmt wird, welche Abhängigkeitseigenschaften dieses DependencyObject über lokal festgelegte Werte verfügen.

(Geerbt von DependencyObject)
GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
GetValue(DependencyProperty)

Gibt den aktuellen effektiven Wert einer Abhängigkeitseigenschaft für diese Instanz eines DependencyObject zurück.

(Geerbt von DependencyObject)
InvalidateProperty(DependencyProperty)

Wertet den effektiven Wert für die angegebene Abhängigkeitseigenschaft erneut aus.

(Geerbt von DependencyObject)
Lock()

Reserviert den Hintergrundpuffer für Aktualisierungen.

MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
OnChanged()

Wird aufgerufen, wenn das aktuelle Freezable-Objekt geändert wird.

(Geerbt von Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Stellt sicher, dass entsprechende Kontextzeiger für einen gerade festgelegten DependencyObjectType-Datenmember eingerichtet werden.

(Geerbt von Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Dieses Member unterstützt die WPF-Infrastruktur (Windows Presentation Foundation) und ist nicht für die direkte Verwendung aus Ihrem Code vorgesehen.

(Geerbt von Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Überschreibt die DependencyObject-Implementierung von OnPropertyChanged(DependencyPropertyChangedEventArgs), damit in Reaktion auf eine geänderte Abhängigkeitseigenschaft des Typs Freezable auch Changed-Handler aufgerufen werden.

(Geerbt von Freezable)
ReadLocalValue(DependencyProperty)

Gibt den lokalen Wert einer Abhängigkeitseigenschaft zurück, wenn dieser vorhanden ist.

(Geerbt von DependencyObject)
ReadPreamble()

Stellt sicher, dass über einen gültigen Thread auf Freezable zugegriffen wird. Vererber von Freezable müssen diese Methode am Anfang jeder API aufrufen, die Datenmember liest, bei denen es sich nicht um Abhängigkeitseigenschaften handelt.

(Geerbt von Freezable)
SetCurrentValue(DependencyProperty, Object)

Legt den Wert einer Abhängigkeitseigenschaft fest, ohne deren Wertquelle zu ändern.

(Geerbt von DependencyObject)
SetValue(DependencyProperty, Object)

Legt den lokalen Wert einer Abhängigkeitseigenschaft fest, die durch ihren Bezeichner angegeben ist.

(Geerbt von DependencyObject)
SetValue(DependencyPropertyKey, Object)

Legt den lokalen Wert einer schreibgeschützten Abhängigkeitseigenschaft fest, die durch den DependencyPropertyKey-Bezeichner der Abhängigkeitseigenschaft angegeben ist.

(Geerbt von DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Gibt einen Wert zurück, der angibt, ob Serialisierungsprozesse den Wert der bereitgestellten Abhängigkeitseigenschaft serialisieren sollen.

(Geerbt von DependencyObject)
ToString()

Erstellt eine Zeichenfolgendarstellung dieses Objekts auf der Grundlage der aktuellen Kultur.

(Geerbt von ImageSource)
ToString(IFormatProvider)

Erstellt eine Zeichenfolgendarstellung dieses Objekts auf Grundlage des übergebenen IFormatProvider. Wenn der Anbieter null ist, wird CurrentCulture verwendet.

(Geerbt von ImageSource)
TryLock(Duration)

Versucht, die Bitmap zu sperren, und wartet höchstens die angegebene Zeit.

Unlock()

Gibt den Hintergrundpuffer frei, um ihn für die Anzeige verfügbar zu machen.

VerifyAccess()

Erzwingt, dass der aufrufende Thread auf dieses DispatcherObject zugreifen kann.

(Geerbt von DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32)

Aktualisiert die Pixel im angegebenen Bereich der Bitmap.

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

Aktualisiert die Pixel im angegebenen Bereich der Bitmap.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Aktualisiert die Pixel im angegebenen Bereich der Bitmap.

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

Aktualisiert die Pixel im angegebenen Bereich der Bitmap.

WritePostscript()

Löst das Changed-Ereignis für das Freezable-Objekt aus und ruft dessen OnChanged()-Methode auf. Klassen, die aus Freezable abgeleitet werden, sollten diese Methode am Ende jeder API aufrufen, die Klassenmember ändert, die nicht als Abhängigkeitseigenschaften gespeichert sind.

(Geerbt von Freezable)
WritePreamble()

Stellt sicher, dass das Freezable nicht fixiert ist und dass über einen gültigen Threadkontext darauf zugegriffen wird. Vererber von Freezable sollten diese Methode am Anfang jeder API aufrufen, die Datenmember schreibt, bei denen es sich nicht um Abhängigkeitseigenschaften handelt.

(Geerbt von Freezable)

Ereignisse

Changed

Tritt auf, wenn Freezable oder ein darin enthaltenes Objekt geändert wird.

(Geerbt von Freezable)
DecodeFailed

Tritt auf, wenn das Bild aufgrund eines fehlerhaften Bildheaders nicht geladen werden kann.

(Geerbt von BitmapSource)
DownloadCompleted

Tritt auf, wenn der Bitmapinhalt vollständig heruntergeladen wurde.

(Geerbt von BitmapSource)
DownloadFailed

Tritt auf, wenn der Bitmapinhalt nicht heruntergeladen werden konnte.

(Geerbt von BitmapSource)
DownloadProgress

Tritt auf, wenn sich der Status beim Herunterladen des Bitmapinhalts geändert hat.

(Geerbt von BitmapSource)

Explizite Schnittstellenimplementierungen

IFormattable.ToString(String, IFormatProvider)

Formatiert den Wert der aktuellen Instanz mit dem angegebenen Format.

(Geerbt von ImageSource)

Gilt für:

Weitere Informationen