WriteableBitmap Klasa

Definicja

Zawiera element BitmapSource , który można zapisywać i aktualizować.

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
Dziedziczenie

Przykłady

W poniższym przykładzie pokazano, jak WriteableBitmap można użyć jako źródła Image elementu do rysowania pikseli po przesunięciu myszy.

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

Uwagi

WriteableBitmap Użyj klasy , aby zaktualizować i renderować mapę bitową na podstawie ramek. Jest to przydatne w przypadku generowania zawartości algorytmicznej, takiej jak obraz fraktalny, i wizualizacji danych, takich jak wizualizator muzyki.

Klasa WriteableBitmap używa dwóch buforów. Bufor wsteczny jest przydzielany w pamięci systemowej i gromadzi zawartość, która nie jest obecnie wyświetlana. Bufor frontu jest przydzielany w pamięci systemowej i zawiera aktualnie wyświetlaną zawartość. System renderowania kopiuje bufor frontu do pamięci wideo na potrzeby wyświetlania.

Dwa wątki używają tych buforów. Wątek interfejsu użytkownika generuje interfejs użytkownika, ale nie przedstawia go na ekranie. Wątek interfejsu użytkownika odpowiada na dane wejściowe użytkownika, czasomierze i inne zdarzenia. Aplikacja może mieć wiele wątków interfejsu użytkownika. Wątek renderowania komponuje i renderuje zmiany z wątku interfejsu użytkownika. Istnieje tylko jeden wątek renderowania na aplikację.

Wątek interfejsu użytkownika zapisuje zawartość w buforze wstecznym. Wątek renderowania odczytuje zawartość z buforu frontu i kopiuje ją do pamięci wideo. Zmiany w buforze wstecznym są śledzone za pomocą zmienionych regionów prostokątnych.

Wywołaj jedno z przeciążeń, WritePixels aby automatycznie zaktualizować i wyświetlić zawartość w buforze wstecznym.

Aby uzyskać większą kontrolę nad aktualizacjami i dostęp wielowątkowy do bufora wstecznego, użyj następującego przepływu pracy.

  1. Wywołaj metodę Lock , aby zarezerwować bufor wsteczny dla aktualizacji.

  2. Uzyskaj wskaźnik do bufora wstecznego, uzyskując BackBuffer dostęp do właściwości .

  3. Zapisz zmiany w buforze wstecznym. Inne wątki mogą zapisywać zmiany w buforze wstecznym, gdy WriteableBitmap jest zablokowany.

  4. Wywołaj metodę , AddDirtyRect aby wskazać zmienione obszary.

  5. Wywołaj metodę Unlock , aby zwolnić bufor wsteczny i zezwolić na prezentację na ekranie.

Gdy aktualizacje są wysyłane do wątku renderowania, wątek renderowania kopiuje zmienione prostokąty z bufora wstecznego do buforu frontu. System renderowania kontroluje tę wymianę, aby uniknąć zakleszczenia i przerysowywania artefaktów, takich jak "rozerwanie".

Konstruktory

WriteableBitmap(BitmapSource)

Inicjuje WriteableBitmap nowe wystąpienie klasy przy użyciu podanego BitmapSourceelementu .

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

Inicjuje WriteableBitmap nowe wystąpienie klasy z określonymi parametrami.

Właściwości

BackBuffer

Pobiera wskaźnik do bufora wstecznego.

BackBufferStride

Pobiera wartość wskazującą liczbę bajtów w jednym wierszu danych pikseli.

CanFreeze

Pobiera wartość wskazującą, czy obiekt może być niemodyfikowalny.

(Odziedziczone po Freezable)
DependencyObjectType

Pobiera klasę DependencyObjectType , która opakowuje typ CLR tego wystąpienia.

(Odziedziczone po DependencyObject)
Dispatcher

Pobiera element, z Dispatcher który DispatcherObject jest skojarzony.

(Odziedziczone po DispatcherObject)
DpiX

Pobiera poziome kropki na cal (dpi) obrazu.

(Odziedziczone po BitmapSource)
DpiY

Pobiera pionowe kropki na cal (dpi) obrazu.

(Odziedziczone po BitmapSource)
Format

Pobiera natywne PixelFormat dane mapy bitowej.

(Odziedziczone po BitmapSource)
HasAnimatedProperties

Pobiera wartość wskazującą, czy co najmniej jeden AnimationClock obiekt jest skojarzony z dowolnymi właściwościami zależności tego obiektu.

(Odziedziczone po Animatable)
Height

Pobiera wysokość źródłowej mapy bitowej w jednostkach niezależnych od urządzenia (1/96 cala na jednostkę).

(Odziedziczone po BitmapSource)
IsDownloading

Pobiera wartość wskazującą, czy BitmapSource zawartość jest obecnie pobierana.

(Odziedziczone po BitmapSource)
IsFrozen

Pobiera wartość wskazującą, czy obiekt jest obecnie modyfikowalny.

(Odziedziczone po Freezable)
IsSealed

Pobiera wartość wskazującą, czy to wystąpienie jest obecnie zapieczętowane (tylko do odczytu).

(Odziedziczone po DependencyObject)
Metadata

Pobiera metadane skojarzone z tym obrazem mapy bitowej.

(Odziedziczone po BitmapSource)
Palette

Pobiera paletę kolorów mapy bitowej, jeśli została określona.

(Odziedziczone po BitmapSource)
PixelHeight

Pobiera wysokość mapy bitowej w pikselach.

(Odziedziczone po BitmapSource)
PixelWidth

Pobiera szerokość mapy bitowej w pikselach.

(Odziedziczone po BitmapSource)
Width

Pobiera szerokość mapy bitowej w jednostkach niezależnych od urządzenia (1/96 cala na jednostkę).

(Odziedziczone po BitmapSource)

Metody

AddDirtyRect(Int32Rect)

Określa obszar zmienionej mapy bitowej.

ApplyAnimationClock(DependencyProperty, AnimationClock)

Stosuje element AnimationClock do określonego DependencyPropertyelementu . Jeśli właściwość jest już animowana, SnapshotAndReplace używane jest zachowanie przekazywania.

(Odziedziczone po Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Stosuje element AnimationClock do określonego DependencyPropertyelementu . Jeśli właściwość jest już animowana, zostanie użyta określona HandoffBehavior wartość .

(Odziedziczone po Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Stosuje animację do określonego DependencyPropertyelementu . Animacja jest uruchamiana po renderowaniu następnej ramki. Jeśli określona właściwość jest już animowana, SnapshotAndReplace używane jest zachowanie przekazywania.

(Odziedziczone po Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Stosuje animację do określonego DependencyPropertyelementu . Animacja jest uruchamiana po renderowaniu następnej ramki. Jeśli określona właściwość jest już animowana, zostanie użyta określona HandoffBehavior właściwość.

(Odziedziczone po Animatable)
CheckAccess()

Określa, czy wątek wywołujący ma dostęp do tego DispatcherObjectelementu .

(Odziedziczone po DispatcherObject)
CheckIfSiteOfOrigin()

Sprawdza, czy zawartość źródłowa mapy bitowej pochodzi ze znanej lokacji pochodzenia. Ta metoda służy do zapewnienia, że operacje kopiowania pikseli są bezpieczne.

(Odziedziczone po BitmapSource)
ClearValue(DependencyProperty)

Czyści wartość lokalną właściwości. Właściwość do wyczyszczenia jest określana przez DependencyProperty identyfikator.

(Odziedziczone po DependencyObject)
ClearValue(DependencyPropertyKey)

Czyści wartość lokalną właściwości tylko do odczytu. Właściwość do wyczyszczenia jest określana przez element DependencyPropertyKey.

(Odziedziczone po DependencyObject)
Clone()

Tworzy modyfikowalny klon tego WriteableBitmapobiektu , tworząc głębokie kopie wartości tego obiektu. Podczas kopiowania właściwości zależności ta metoda kopiuje odwołania do zasobów i powiązania danych (ale mogą nie być już rozpoznawane), ale nie animacje ani ich bieżące wartości.

CloneCore(Freezable)

Powoduje, że to wystąpienie jest głęboką kopią określonego BitmapSourceelementu . Podczas kopiowania właściwości zależności ta metoda kopiuje odwołania do zasobów i powiązania danych (ale mogą nie być już rozpoznawane), ale nie animacje ani ich bieżące wartości.

(Odziedziczone po BitmapSource)
CloneCurrentValue()

Tworzy modyfikowalny klon tego ByteAnimationUsingKeyFrames obiektu, tworząc głębokie kopie bieżących wartości tego obiektu. Odwołania do zasobów, powiązania danych i animacje nie są kopiowane, ale ich bieżące wartości są.

CloneCurrentValueCore(Freezable)

Sprawia, że to wystąpienie jest modyfikowalną kopią głęboką określonego BitmapSource przy użyciu bieżących wartości właściwości. Odwołania do zasobów, powiązania danych i animacje nie są kopiowane, ale ich bieżące wartości są.

(Odziedziczone po BitmapSource)
CoerceValue(DependencyProperty)

Przekształca wartość określonej właściwości zależności. Jest to realizowane przez wywołanie dowolnej CoerceValueCallback funkcji określonej w metadanych właściwości dla właściwości zależności, ponieważ istnieje w wywołaniu DependencyObject.

(Odziedziczone po DependencyObject)
CopyPixels(Array, Int32, Int32)

Kopiuje dane pikseli mapy bitowej do tablicy pikseli z określonym krokiem, zaczynając od określonego przesunięcia.

(Odziedziczone po BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Kopiuje dane pikseli mapy bitowej w określonym prostokącie do tablicy pikseli, która ma określony krok rozpoczynający się od określonego przesunięcia.

(Odziedziczone po BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Kopiuje dane pikseli mapy bitowej w określonym prostokącie.

(Odziedziczone po BitmapSource)
CreateInstance()

Inicjuje nowe wystąpienie klasy Freezable.

(Odziedziczone po Freezable)
CreateInstanceCore()

Po zaimplementowaniu w klasie pochodnej tworzy nowe wystąpienie klasy pochodnej Freezable .

(Odziedziczone po Freezable)
Equals(Object)

Określa, czy podany DependencyObject element jest odpowiednikiem bieżącego DependencyObjectelementu .

(Odziedziczone po DependencyObject)
Freeze()

Sprawia, że bieżący obiekt jest niemodyfikowalny i ustawia jego IsFrozen właściwość na true.

(Odziedziczone po Freezable)
FreezeCore(Boolean)

Sprawia, że wystąpienie klasy pochodnej BitmapSource jest niezmienne.

(Odziedziczone po BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Zwraca nieimętowaną wartość określonego DependencyPropertyelementu .

(Odziedziczone po Animatable)
GetAsFrozen()

Tworzy zamrożoną kopię Freezableobiektu przy użyciu podstawowych (nieimowanych) wartości właściwości. Ponieważ kopia jest zamrożona, wszystkie zamrożone obiekty podrzędne są kopiowane przez odwołanie.

(Odziedziczone po Freezable)
GetAsFrozenCore(Freezable)

Sprawia, że to wystąpienie jest klonem określonego BitmapSource obiektu.

(Odziedziczone po BitmapSource)
GetCurrentValueAsFrozen()

Tworzy zamrożoną kopię przy użyciu bieżących Freezable wartości właściwości. Ponieważ kopia jest zamrożona, wszystkie zamrożone obiekty podrzędne są kopiowane przez odwołanie.

(Odziedziczone po Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Powoduje, że to wystąpienie jest zamrożonym klonem określonego BitmapSourceobiektu . Odwołania do zasobów, powiązania danych i animacje nie są kopiowane, ale ich bieżące wartości są.

(Odziedziczone po BitmapSource)
GetHashCode()

Pobiera kod skrótu dla tego DependencyObjectpliku .

(Odziedziczone po DependencyObject)
GetLocalValueEnumerator()

Tworzy wyspecjalizowany moduł wyliczający do określania, które właściwości zależności mają lokalnie ustawione wartości dla tego DependencyObjectelementu .

(Odziedziczone po DependencyObject)
GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
GetValue(DependencyProperty)

Zwraca bieżącą obowiązującą wartość właściwości zależności dla tego wystąpienia klasy DependencyObject.

(Odziedziczone po DependencyObject)
InvalidateProperty(DependencyProperty)

Ponownie oblicza efektywną wartość dla określonej właściwości zależności.

(Odziedziczone po DependencyObject)
Lock()

Rezerwuje bufor wsteczny aktualizacji.

MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
OnChanged()

Wywoływana, gdy bieżący Freezable obiekt jest modyfikowany.

(Odziedziczone po Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Zapewnia, że dla elementu członkowskiego danych, który właśnie został ustawiony, są ustanawiane DependencyObjectType odpowiednie wskaźniki kontekstu.

(Odziedziczone po Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Ten element członkowski obsługuje infrastrukturę Windows Presentation Foundation (WPF) i nie jest przeznaczony do użycia bezpośrednio z kodu.

(Odziedziczone po Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Zastępuje implementację DependencyObject elementu OnPropertyChanged(DependencyPropertyChangedEventArgs) , aby również wywoływać wszelkie Changed procedury obsługi w odpowiedzi na zmieniającą się właściwość zależności typu Freezable.

(Odziedziczone po Freezable)
ReadLocalValue(DependencyProperty)

Zwraca wartość lokalną właściwości zależności, jeśli istnieje.

(Odziedziczone po DependencyObject)
ReadPreamble()

Zapewnia dostęp do obiektu Freezable z prawidłowego wątku. Dziedziczenie Freezable elementu musi wywoływać tę metodę na początku dowolnego interfejsu API, który odczytuje elementy członkowskie danych, które nie są właściwościami zależności.

(Odziedziczone po Freezable)
SetCurrentValue(DependencyProperty, Object)

Ustawia wartość właściwości zależności bez zmieniania jej źródła wartości.

(Odziedziczone po DependencyObject)
SetValue(DependencyProperty, Object)

Ustawia wartość lokalną właściwości zależności określonej przez jej identyfikator właściwości zależności.

(Odziedziczone po DependencyObject)
SetValue(DependencyPropertyKey, Object)

Ustawia wartość lokalną właściwości zależności tylko do odczytu określonej przez DependencyPropertyKey identyfikator właściwości zależności.

(Odziedziczone po DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Zwraca wartość wskazującą, czy procesy serializacji powinny serializować wartość dla podanej właściwości zależności.

(Odziedziczone po DependencyObject)
ToString()

Tworzy reprezentację ciągu tego obiektu na podstawie bieżącej kultury.

(Odziedziczone po ImageSource)
ToString(IFormatProvider)

Tworzy reprezentację ciągu tego obiektu na podstawie przekazanego IFormatProvider obiektu. Jeśli dostawca to null, CurrentCulture parametr jest używany.

(Odziedziczone po ImageSource)
TryLock(Duration)

Próbuje zablokować mapę bitową, czekając nie dłużej niż określona długość czasu.

Unlock()

Zwalnia bufor wsteczny, aby udostępnić go do wyświetlania.

VerifyAccess()

Wymusza, że wątek wywołujący ma dostęp do tego DispatcherObjectelementu .

(Odziedziczone po DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32)

Aktualizacje pikseli w określonym regionie mapy bitowej.

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

Aktualizacje pikseli w określonym regionie mapy bitowej.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Aktualizacje pikseli w określonym regionie mapy bitowej.

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

Aktualizacje pikseli w określonym regionie mapy bitowej.

WritePostscript()

Changed Wywołuje zdarzenie dla klasy Freezable i wywołuje jego OnChanged() metodę. Klasy pochodzące z Freezable klasy powinny wywoływać tę metodę na końcu dowolnego interfejsu API, który modyfikuje składowe klasy, które nie są przechowywane jako właściwości zależności.

(Odziedziczone po Freezable)
WritePreamble()

Sprawdza, czy element Freezable nie jest zamrożony i czy jest on uzyskiwany z prawidłowego kontekstu wątkowego. Freezable dziedziczenie powinno wywoływać tę metodę na początku dowolnego interfejsu API, który zapisuje dane członkom, które nie są właściwościami zależności.

(Odziedziczone po Freezable)

Zdarzenia

Changed

Występuje, gdy Freezable obiekt lub, który zawiera, jest modyfikowany.

(Odziedziczone po Freezable)
DecodeFailed

Występuje, gdy nie można załadować obrazu z powodu uszkodzonego nagłówka obrazu.

(Odziedziczone po BitmapSource)
DownloadCompleted

Występuje, gdy zawartość mapy bitowej została całkowicie pobrana.

(Odziedziczone po BitmapSource)
DownloadFailed

Występuje, gdy pobieranie zawartości mapy bitowej nie powiodło się.

(Odziedziczone po BitmapSource)
DownloadProgress

Występuje, gdy postęp pobierania zawartości mapy bitowej uległ zmianie.

(Odziedziczone po BitmapSource)

Jawne implementacje interfejsu

IFormattable.ToString(String, IFormatProvider)

Formatuje wartość bieżącego wystąpienia przy użyciu określonego formatu.

(Odziedziczone po ImageSource)

Dotyczy

Zobacz też