WriteableBitmap Klas

Definitie

Biedt een BitmapSource bestand dat kan worden geschreven naar en bijgewerkt.

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
Overname

Voorbeelden

In het volgende voorbeeld ziet u hoe een WriteableBitmap kan worden gebruikt als de bron van een Image om pixels te tekenen wanneer de muis beweegt.

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

Opmerkingen

Gebruik de WriteableBitmap klasse om een bitmap per frame bij te werken en weer te geven. Dit is handig voor het genereren van algoritme-inhoud, zoals een fractale afbeelding en voor gegevensvisualisatie, zoals een muziekvisualisatie.

De WriteableBitmap klasse maakt gebruik van twee buffers. De backbuffer wordt toegewezen in het systeemgeheugen en verzamelt inhoud die momenteel niet wordt weergegeven. De frontbuffer wordt toegewezen in het systeemgeheugen en bevat de inhoud die momenteel wordt weergegeven. Het renderingsysteem kopieert de frontbuffer naar het videogeheugen voor weergave.

Twee threads gebruiken deze buffers. De gebruikersinterfacethread (UI) genereert de gebruikersinterface , maar presenteert deze niet op het scherm. De UI-thread reageert op gebruikersinvoer, timers en andere gebeurtenissen. Een toepassing kan meerdere UI-threads hebben. De renderthread stelt wijzigingen van de UI-thread samen en geeft deze weer. Er is slechts één renderthread per toepassing.

De UI-thread schrijft inhoud naar de backbuffer. De renderthread leest inhoud van de frontbuffer en kopieert deze naar het videogeheugen. Wijzigingen in de backbuffer worden bijgehouden met gewijzigde rechthoekige regio's.

Roep een van de WritePixels overbelastingen aan om inhoud in de backbuffer automatisch bij te werken en weer te geven.

Gebruik de volgende werkstroom voor meer controle over updates en voor toegang met meerdere threads tot de backbuffer.

  1. Roep de Lock methode aan om de backbuffer voor updates te reserveren.

  2. Haal een aanwijzer naar de backbuffer door toegang te krijgen tot de BackBuffer eigenschap.

  3. Schrijf wijzigingen in de backbuffer. Andere threads kunnen wijzigingen in de achterbuffer schrijven wanneer de WriteableBitmap buffer is vergrendeld.

  4. Roep de AddDirtyRect methode aan om gebieden aan te geven die zijn gewijzigd.

  5. Roep de Unlock methode aan om de backbuffer los te laten en presentatie op het scherm toe te staan.

Wanneer updates naar de renderingthread worden verzonden, kopieert de renderingthread de gewijzigde rechthoeken van de achterbuffer naar de voorbuffer. Het renderingsysteem beheert deze uitwisseling om impasses te voorkomen en artefacten opnieuw te tekenen, zoals 'scheuren'.

Constructors

Name Description
WriteableBitmap(BitmapSource)

Initialiseert een nieuw exemplaar van de WriteableBitmap klasse met behulp van de opgegeven BitmapSource.

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

Initialiseert een nieuw exemplaar van de WriteableBitmap klasse met de opgegeven parameters.

Eigenschappen

Name Description
BackBuffer

Hiermee wordt een aanwijzer naar de backbuffer geretourneerd.

BackBufferStride

Hiermee wordt een waarde opgehaald die het aantal bytes in één rij met pixelgegevens aangeeft.

CanFreeze

Hiermee wordt een waarde opgehaald die aangeeft of het object onmodieerbaar kan worden gemaakt.

(Overgenomen van Freezable)
DependencyObjectType

Hiermee haalt u het DependencyObjectType CLR-type van dit exemplaar op.

(Overgenomen van DependencyObject)
Dispatcher

Hiermee wordt de Dispatcher aan dit DispatcherObject gekoppelde bestand.

(Overgenomen van DispatcherObject)
DpiX

Hiermee haalt u de horizontale puntjes per inch (dpi) van de afbeelding op.

(Overgenomen van BitmapSource)
DpiY

Hiermee haalt u de verticale puntjes per inch (dpi) van de afbeelding op.

(Overgenomen van BitmapSource)
Format

Hiermee haalt u de systeemeigen gegevens PixelFormat op van de bitmapgegevens.

(Overgenomen van BitmapSource)
HasAnimatedProperties

Hiermee wordt een waarde opgehaald die aangeeft of een of meer AnimationClock objecten zijn gekoppeld aan een van de afhankelijkheidseigenschappen van dit object.

(Overgenomen van Animatable)
Height

Hiermee haalt u de hoogte van de bron bitmap op in apparaatonafhankelijke eenheden (1/96e inch per eenheid).

(Overgenomen van BitmapSource)
IsDownloading

Hiermee wordt een waarde opgehaald die aangeeft of de BitmapSource inhoud momenteel wordt gedownload.

(Overgenomen van BitmapSource)
IsFrozen

Hiermee wordt een waarde opgehaald die aangeeft of het object momenteel kan worden gewijzigd.

(Overgenomen van Freezable)
IsSealed

Hiermee wordt een waarde opgehaald die aangeeft of dit exemplaar momenteel is verzegeld (alleen-lezen).

(Overgenomen van DependencyObject)
Metadata

Hiermee haalt u de metagegevens op die aan deze bitmapafbeelding zijn gekoppeld.

(Overgenomen van BitmapSource)
Palette

Hiermee haalt u het kleurenpalet van de bitmap op, als er een is opgegeven.

(Overgenomen van BitmapSource)
PixelHeight

Hiermee haalt u de hoogte van de bitmap in pixels op.

(Overgenomen van BitmapSource)
PixelWidth

Hiermee wordt de breedte van de bitmap in pixels opgeslagen.

(Overgenomen van BitmapSource)
Width

Hiermee haalt u de breedte van de bitmap op in apparaatonafhankelijke eenheden (1/96e inch per eenheid).

(Overgenomen van BitmapSource)

Methoden

Name Description
AddDirtyRect(Int32Rect)

Hiermee geeft u het gebied van de bitmap die is gewijzigd.

ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Hiermee wordt een AnimationClock op de opgegeven DependencyPropertywaarde toegepast. Als de eigenschap al is geanimeerd, wordt de opgegeven HandoffBehavior waarde gebruikt.

(Overgenomen van Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock)

Hiermee wordt een AnimationClock op de opgegeven DependencyPropertywaarde toegepast. Als de eigenschap al is geanimeerd, wordt het SnapshotAndReplace handoff-gedrag gebruikt.

(Overgenomen van Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Hiermee past u een animatie toe op de opgegeven DependencyProperty. De animatie wordt gestart wanneer het volgende frame wordt weergegeven. Als de opgegeven eigenschap al is geanimeerd, wordt de opgegeven HandoffBehavior gebruikt.

(Overgenomen van Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Hiermee past u een animatie toe op de opgegeven DependencyProperty. De animatie wordt gestart wanneer het volgende frame wordt weergegeven. Als de opgegeven eigenschap al is geanimeerd, wordt het SnapshotAndReplace handoff-gedrag gebruikt.

(Overgenomen van Animatable)
CheckAccess()

Bepaalt of de aanroepende thread toegang heeft tot dit DispatcherObject.

(Overgenomen van DispatcherObject)
CheckIfSiteOfOrigin()

Controleert of de bitmapbroninhoud afkomstig is van een bekende site van oorsprong. Deze methode wordt gebruikt om ervoor te zorgen dat pixelkopieerbewerkingen veilig zijn.

(Overgenomen van BitmapSource)
ClearValue(DependencyProperty)

Hiermee wist u de lokale waarde van een eigenschap. De eigenschap die moet worden gewist, wordt opgegeven door een DependencyProperty id.

(Overgenomen van DependencyObject)
ClearValue(DependencyPropertyKey)

Hiermee wist u de lokale waarde van een alleen-lezen eigenschap. De eigenschap die moet worden gewist, wordt opgegeven door een DependencyPropertyKey.

(Overgenomen van DependencyObject)
Clone()

Hiermee maakt u een wijzigbare kloon van dit WriteableBitmapobject, waardoor diepe kopieën van de waarden van dit object worden gemaakt. Bij het kopiëren van afhankelijkheidseigenschappen kopieert deze methode bronverwijzingen en gegevensbindingen (maar ze kunnen deze mogelijk niet meer oplossen) maar niet animaties of hun huidige waarden.

CloneCore(Freezable)

Maakt dit exemplaar een diepe kopie van de opgegeven BitmapSource. Bij het kopiëren van afhankelijkheidseigenschappen kopieert deze methode bronverwijzingen en gegevensbindingen (maar ze kunnen deze mogelijk niet meer oplossen) maar niet animaties of hun huidige waarden.

(Overgenomen van BitmapSource)
CloneCurrentValue()

Hiermee maakt u een wijzigbare kloon van dit ByteAnimationUsingKeyFrames object, waardoor diepe kopieën worden gemaakt van de huidige waarden van dit object. Resourceverwijzingen, gegevensbindingen en animaties worden niet gekopieerd, maar de huidige waarden zijn.

CloneCurrentValueCore(Freezable)

Maakt dit exemplaar een wijzigbare diepe kopie van de opgegeven BitmapSource met behulp van huidige eigenschapswaarden. Resourceverwijzingen, gegevensbindingen en animaties worden niet gekopieerd, maar de huidige waarden zijn.

(Overgenomen van BitmapSource)
CoerceValue(DependencyProperty)

Hiermee wordt de waarde van de opgegeven afhankelijkheidseigenschap gecodeerd. Dit wordt bereikt door een CoerceValueCallback functie aan te roepen die is opgegeven in eigenschapsmetagegevens voor de afhankelijkheidseigenschap, zoals deze bestaat bij het aanroepen DependencyObject.

(Overgenomen van DependencyObject)
CopyPixels(Array, Int32, Int32)

Kopieert de bitmap pixelgegevens naar een matrix van pixels met de opgegeven stride, beginnend bij de opgegeven offset.

(Overgenomen van BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Kopieert de bitmap pixelgegevens binnen de opgegeven rechthoek naar een matrix van pixels met de opgegeven stride vanaf de opgegeven offset.

(Overgenomen van BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Kopieert de bitmap pixelgegevens binnen de opgegeven rechthoek.

(Overgenomen van BitmapSource)
CreateInstance()

Initialiseert een nieuw exemplaar van de Freezable klasse.

(Overgenomen van Freezable)
CreateInstanceCore()

Wanneer deze wordt geïmplementeerd in een afgeleide klasse, maakt u een nieuw exemplaar van de Freezable afgeleide klasse.

(Overgenomen van Freezable)
Equals(Object)

Bepaalt of een opgegeven DependencyObject gelijk is aan de huidige DependencyObject.

(Overgenomen van DependencyObject)
Freeze()

Maakt het huidige object onmodifieerbaar en stelt de IsFrozen eigenschap ervan in op true.

(Overgenomen van Freezable)
FreezeCore(Boolean)

Maakt een exemplaar van BitmapSource of een afgeleide klasse onveranderbaar.

(Overgenomen van BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Retourneert de niet-geanimeerde waarde van de opgegeven DependencyProperty.

(Overgenomen van Animatable)
GetAsFrozen()

Hiermee maakt u een geblokkeerde kopie van de Freezableeigenschapswaarden met basiswaarden (niet-geanimeerd). Omdat de kopie is geblokkeerd, worden alle geblokkeerde subobjecten gekopieerd met verwijzing.

(Overgenomen van Freezable)
GetAsFrozenCore(Freezable)

Hiermee wordt dit exemplaar een kloon van het opgegeven BitmapSource object.

(Overgenomen van BitmapSource)
GetCurrentValueAsFrozen()

Hiermee maakt u een geblokkeerde kopie van het Freezable gebruik van de huidige eigenschapswaarden. Omdat de kopie is geblokkeerd, worden alle geblokkeerde subobjecten gekopieerd met verwijzing.

(Overgenomen van Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Hiermee wordt deze instantie een geblokkeerde kloon van de opgegeven BitmapSource. Resourceverwijzingen, gegevensbindingen en animaties worden niet gekopieerd, maar de huidige waarden zijn.

(Overgenomen van BitmapSource)
GetHashCode()

Hiermee haalt u een hashcode op.DependencyObject

(Overgenomen van DependencyObject)
GetLocalValueEnumerator()

Hiermee maakt u een gespecialiseerde enumerator om te bepalen welke afhankelijkheidseigenschappen lokaal waarden hebben ingesteld.DependencyObject

(Overgenomen van DependencyObject)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
GetValue(DependencyProperty)

Retourneert de huidige effectieve waarde van een afhankelijkheidseigenschap op dit exemplaar van een DependencyObject.

(Overgenomen van DependencyObject)
InvalidateProperty(DependencyProperty)

Evalueert de effectieve waarde voor de opgegeven afhankelijkheidseigenschap opnieuw.

(Overgenomen van DependencyObject)
Lock()

Reserveert de backbuffer voor updates.

MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
OnChanged()

Aangeroepen wanneer het huidige Freezable object wordt gewijzigd.

(Overgenomen van Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Dit lid ondersteunt de Windows Presentation Foundation -infrastructuur (WPF) en is niet bedoeld om rechtstreeks vanuit uw code te worden gebruikt.

(Overgenomen van Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Zorgt ervoor dat de juiste contextpointers tot stand worden gebracht voor een DependencyObjectType gegevenslid dat zojuist is ingesteld.

(Overgenomen van Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Overschrijft de DependencyObject implementatie van het aanroepen OnPropertyChanged(DependencyPropertyChangedEventArgs) van Changed handlers als reactie op een veranderende afhankelijkheidseigenschap van het typeFreezable.

(Overgenomen van Freezable)
ReadLocalValue(DependencyProperty)

Retourneert de lokale waarde van een afhankelijkheidseigenschap, als deze bestaat.

(Overgenomen van DependencyObject)
ReadPreamble()

Zorgt ervoor dat de Freezable thread wordt geopend vanuit een geldige thread. Overnames van Freezable deze methode moeten aan het begin van een API worden aangeroepen die gegevensleden leest die geen afhankelijkheidseigenschappen zijn.

(Overgenomen van Freezable)
SetCurrentValue(DependencyProperty, Object)

Hiermee stelt u de waarde van een afhankelijkheidseigenschap in zonder de waardebron te wijzigen.

(Overgenomen van DependencyObject)
SetValue(DependencyProperty, Object)

Hiermee stelt u de lokale waarde van een afhankelijkheidseigenschap in, die is opgegeven door de id van de afhankelijkheidseigenschap.

(Overgenomen van DependencyObject)
SetValue(DependencyPropertyKey, Object)

Hiermee stelt u de lokale waarde van een alleen-lezen afhankelijkheidseigenschap in, die is opgegeven door de DependencyPropertyKey id van de afhankelijkheidseigenschap.

(Overgenomen van DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Retourneert een waarde die aangeeft of serialisatieprocessen de waarde voor de opgegeven afhankelijkheidseigenschap moeten serialiseren.

(Overgenomen van DependencyObject)
ToString()

Hiermee maakt u een tekenreeksweergave van dit object op basis van de huidige cultuur.

(Overgenomen van ImageSource)
ToString(IFormatProvider)

Hiermee maakt u een tekenreeksweergave van dit object op basis van de IFormatProvider doorgegeven tekenreeks. Als de provider is null, wordt de CurrentCulture provider gebruikt.

(Overgenomen van ImageSource)
TryLock(Duration)

Probeert de bitmap te vergrendelen en wacht niet langer dan de opgegeven tijdsduur.

Unlock()

Hiermee wordt de backbuffer vrijgegeven om deze beschikbaar te maken voor weergave.

VerifyAccess()

Hiermee wordt afgedwongen dat de aanroepende thread toegang heeft tot dit DispatcherObject.

(Overgenomen van DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32, Int32)

Hiermee worden de pixels in het opgegeven gebied van de bitmap bijgewerkt.

WritePixels(Int32Rect, Array, Int32, Int32)

Hiermee worden de pixels in het opgegeven gebied van de bitmap bijgewerkt.

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

Hiermee worden de pixels in het opgegeven gebied van de bitmap bijgewerkt.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Hiermee worden de pixels in het opgegeven gebied van de bitmap bijgewerkt.

WritePostscript()

Hiermee wordt de gebeurtenis voor de Changed gebeurtenis gegenereerd en wordt Freezable de OnChanged() methode aangeroepen. Klassen die zijn afgeleid van Freezable , moeten deze methode aan het einde van een API aanroepen die klasseleden wijzigt die niet zijn opgeslagen als afhankelijkheidseigenschappen.

(Overgenomen van Freezable)
WritePreamble()

Controleert of het Freezable niet is geblokkeerd en of deze wordt geopend vanuit een geldige threadingcontext. Freezable overnemers moeten deze methode aan het begin van een API aanroepen die schrijft naar gegevensleden die geen afhankelijkheidseigenschappen zijn.

(Overgenomen van Freezable)

gebeurtenis

Name Description
Changed

Treedt op wanneer het Freezable object dat het bevat, wordt gewijzigd.

(Overgenomen van Freezable)
DecodeFailed

Treedt op wanneer de installatiekopieën niet kunnen worden geladen, vanwege een beschadigde afbeeldingskoptekst.

(Overgenomen van BitmapSource)
DownloadCompleted

Treedt op wanneer de bitmapinhoud volledig is gedownload.

(Overgenomen van BitmapSource)
DownloadFailed

Treedt op wanneer de bitmapinhoud niet kan worden gedownload.

(Overgenomen van BitmapSource)
DownloadProgress

Vindt plaats wanneer de downloadvoortgang van de bitmapinhoud is gewijzigd.

(Overgenomen van BitmapSource)

Expliciete interface-implementaties

Name Description
IFormattable.ToString(String, IFormatProvider)

Hiermee wordt de waarde van het huidige exemplaar opgemaakt met behulp van de opgegeven indeling.

(Overgenomen van ImageSource)

Van toepassing op

Zie ook