Sdílet prostřednictvím


WriteableBitmap Třída

Definice

Poskytuje soubor BitmapSource , který lze zapsat do a aktualizovat.

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
Dědičnost

Příklady

Následující příklad ukazuje, jak WriteableBitmap lze použít jako zdroj objektu Image pro kreslení pixelů při pohybu myši.

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

Poznámky

WriteableBitmap Pomocí třídy můžete aktualizovat a vykreslit rastrový obrázek na základě jednotlivých snímků. To je užitečné pro generování algoritmického obsahu, například fraktálního obrázku, a pro vizualizaci dat, jako je vizualizér hudby.

Třída WriteableBitmap používá dvě vyrovnávací paměti. Zpětná vyrovnávací paměť je přidělena v systémové paměti a shromažďuje obsah, který se aktuálně nezobrazuje. Přední vyrovnávací paměť je přidělena v systémové paměti a obsahuje obsah, který je aktuálně zobrazen. Vykreslovací systém zkopíruje přední vyrovnávací paměť do video paměti pro zobrazení.

Tyto vyrovnávací paměti používají dvě vlákna. Vlákno uživatelského rozhraní vygeneruje uživatelské rozhraní, ale nezobrazuje ho na obrazovce. Vlákno uživatelského rozhraní reaguje na vstup uživatele, časovače a další události. Aplikace může mít více vláken uživatelského rozhraní. Vykreslení vlákna komponuje a vykresluje změny z vlákna uživatelského rozhraní. Pro každou aplikaci existuje pouze jedno vlákno vykreslování.

Vlákno uživatelského rozhraní zapisuje obsah do zpětné vyrovnávací paměti. Vlákno vykreslování čte obsah z přední vyrovnávací paměti a zkopíruje ho do video paměti. Změny zpětné vyrovnávací paměti se sledují se změněnými obdélníkovými oblastmi.

Voláním jednoho z WritePixels přetížení automaticky aktualizujte a zobrazte obsah v zadní vyrovnávací paměti.

Pokud chcete získat větší kontrolu nad aktualizacemi a přístup k vyrovnávací paměti s více vlákny, použijte následující pracovní postup.

  1. Zavolejte metodu Lock pro rezervaci zpětné vyrovnávací paměti pro aktualizace.

  2. Získání ukazatele na zadní vyrovnávací paměť pomocí přístupu k BackBuffer vlastnosti.

  3. Zapište změny do zpětné vyrovnávací paměti. Jiná vlákna můžou zapisovat změny do zadní vyrovnávací paměti, když WriteableBitmap je uzamčena.

  4. Voláním AddDirtyRect metody označte oblasti, které se změnily.

  5. Voláním Unlock metody uvolněte zpět vyrovnávací paměť a povolte prezentaci na obrazovce.

Když se aktualizace odešlou do vykreslovacího vlákna, vykreslovací vlákno zkopíruje změněné obdélníky ze zadní vyrovnávací paměti do přední vyrovnávací paměti. Vykreslovací systém řídí tuto výměnu, aby se zabránilo vzájemným zablokováním a překreslování artefaktů, jako je "trhání".

Konstruktory

WriteableBitmap(BitmapSource)

Inicializuje novou instanci WriteableBitmap třídy pomocí daného BitmapSourceobjektu .

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

Inicializuje novou instanci WriteableBitmap třídy se zadanými parametry.

Vlastnosti

BackBuffer

Získá ukazatel na zadní vyrovnávací paměť.

BackBufferStride

Získá hodnotu označující počet bajtů v jednom řádku pixelových dat.

CanFreeze

Získá hodnotu, která označuje, zda objekt lze změnit.

(Zděděno od Freezable)
DependencyObjectType

Získá, DependencyObjectType který zabalí typ CLR této instance.

(Zděděno od DependencyObject)
Dispatcher

Získá přidruženou Dispatcher k tomuto DispatcherObject .

(Zděděno od DispatcherObject)
DpiX

Získá vodorovné tečky na palec (dpi) obrázku.

(Zděděno od BitmapSource)
DpiY

Získá svislé tečky na palec (dpi) obrázku.

(Zděděno od BitmapSource)
Format

Získá nativní PixelFormat rastrová data.

(Zděděno od BitmapSource)
HasAnimatedProperties

Získá hodnotu, která označuje, zda jeden nebo více AnimationClock objektů je přidružena k některému z vlastností závislostí tohoto objektu.

(Zděděno od Animatable)
Height

Získá výšku zdrojového rastrového obrázku v jednotkách nezávislých na zařízení (1/96 palce na jednotku).

(Zděděno od BitmapSource)
IsDownloading

Získá hodnotu, která označuje, zda BitmapSource se obsah právě stahuje.

(Zděděno od BitmapSource)
IsFrozen

Získá hodnotu, která označuje, zda je objekt aktuálně upravitelný.

(Zděděno od Freezable)
IsSealed

Získá hodnotu, která označuje, zda je tato instance právě zapečetěna (jen pro čtení).

(Zděděno od DependencyObject)
Metadata

Získá metadata, která je přidružena k tomuto rastrovém obrázku.

(Zděděno od BitmapSource)
Palette

Získá paletu barev bitmapy, pokud je zadán.

(Zděděno od BitmapSource)
PixelHeight

Získá výšku bitmapy v pixelech.

(Zděděno od BitmapSource)
PixelWidth

Získá šířku rastru v pixelech.

(Zděděno od BitmapSource)
Width

Získá šířku rastru v jednotkách nezávislých na zařízení (1/96 palce na jednotku).

(Zděděno od BitmapSource)

Metody

AddDirtyRect(Int32Rect)

Určuje oblast rastrového obrázku, která se změnila.

ApplyAnimationClock(DependencyProperty, AnimationClock)

Použije na AnimationClock zadanou DependencyPropertyhodnotu . Pokud je vlastnost už animovaná, SnapshotAndReplace použije se chování předání.

(Zděděno od Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Použije na AnimationClock zadanou DependencyPropertyhodnotu . Pokud je vlastnost už animovaná, použije se zadaná HandoffBehavior vlastnost.

(Zděděno od Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Použije animaci na zadaný objekt DependencyProperty. Animace se spustí při vykreslení dalšího snímku. Pokud je zadaná vlastnost již animované, SnapshotAndReplace použije se chování předání.

(Zděděno od Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Použije animaci na zadaný objekt DependencyProperty. Animace se spustí při vykreslení dalšího snímku. Pokud je zadaná vlastnost již animovaná, použije se zadaná HandoffBehavior vlastnost.

(Zděděno od Animatable)
CheckAccess()

Určuje, zda má volající vlákno přístup k tomuto DispatcherObject.

(Zděděno od DispatcherObject)
CheckIfSiteOfOrigin()

Zkontroluje, zda zdrojový obsah rastrového obrázku pochází ze známého webu původu. Tato metoda se používá k zajištění, že operace kopírování pixelů jsou bezpečné.

(Zděděno od BitmapSource)
ClearValue(DependencyProperty)

Vymaže místní hodnotu vlastnosti. Vlastnost, která má být vymazána, je určena identifikátorem DependencyProperty .

(Zděděno od DependencyObject)
ClearValue(DependencyPropertyKey)

Vymaže místní hodnotu vlastnosti jen pro čtení. Vlastnost, která se má vymazat, je určena parametrem DependencyPropertyKey.

(Zděděno od DependencyObject)
Clone()

Vytvoří upravitelný klon tohoto WriteableBitmapobjektu a vytváří hluboké kopie hodnot tohoto objektu. Při kopírování vlastností závislostí tato metoda kopíruje odkazy na prostředky a datové vazby (ale nemusí se už překládat), ale ne animace nebo jejich aktuální hodnoty.

CloneCore(Freezable)

Vytvoří tuto instanci jako hlubokou kopii zadaného BitmapSourceobjektu . Při kopírování vlastností závislostí tato metoda kopíruje odkazy na prostředky a datové vazby (ale nemusí se už překládat), ale ne animace nebo jejich aktuální hodnoty.

(Zděděno od BitmapSource)
CloneCurrentValue()

Vytvoří upravitelný klon tohoto ByteAnimationUsingKeyFrames objektu a vytváří hluboké kopie aktuálních hodnot tohoto objektu. Odkazy na prostředky, datové vazby a animace se nekopírují, ale jejich aktuální hodnoty jsou.

CloneCurrentValueCore(Freezable)

Vytvoří tuto instanci upravitelnou hloubkovou kopii zadané BitmapSource pomocí aktuálních hodnot vlastností. Odkazy na prostředky, datové vazby a animace se nekopírují, ale jejich aktuální hodnoty ano.

(Zděděno od BitmapSource)
CoerceValue(DependencyProperty)

Převede hodnotu zadané vlastnosti závislosti. Toho se dosáhne vyvoláním jakékoli CoerceValueCallback funkce zadané v metadatech vlastnosti závislosti, protože existuje ve volajícím DependencyObjectobjektu .

(Zděděno od DependencyObject)
CopyPixels(Array, Int32, Int32)

Zkopíruje data rastrových pixelů do pole pixelů se zadaným krokem počínaje zadaným posunem.

(Zděděno od BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Zkopíruje data rastrových pixelů v zadaném obdélníku do pole pixelů, které má zadaný krok začínající na zadaném posunu.

(Zděděno od BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Zkopíruje data rastrových pixelů v zadaném obdélníku.

(Zděděno od BitmapSource)
CreateInstance()

Inicializuje novou instanci Freezable třídy .

(Zděděno od Freezable)
CreateInstanceCore()

Při implementaci v odvozené třídě vytvoří novou instanci odvozené Freezable třídy.

(Zděděno od Freezable)
Equals(Object)

Určuje, zda zadaný DependencyObject je ekvivalentní k aktuálnímu DependencyObject.

(Zděděno od DependencyObject)
Freeze()

Nastaví aktuální objekt jako neupravitelný a nastaví jeho IsFrozen vlastnost na true.

(Zděděno od Freezable)
FreezeCore(Boolean)

Nastaví instanci BitmapSource nebo odvozenou třídu neměnnou.

(Zděděno od BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Vrátí ne animovanou hodnotu zadané DependencyPropertyhodnoty .

(Zděděno od Animatable)
GetAsFrozen()

Vytvoří zamrzlou kopii objektu Freezables použitím základních (ne animovaných) hodnot vlastností. Vzhledem k tomu, že kopie je zamrzlá, jsou všechny ukotvené dílčí objekty zkopírovány odkazem.

(Zděděno od Freezable)
GetAsFrozenCore(Freezable)

Vytvoří tuto instanci klon zadaného BitmapSource objektu.

(Zděděno od BitmapSource)
GetCurrentValueAsFrozen()

Vytvoří zamrzlou kopii objektu Freezable s použitím aktuálních hodnot vlastností. Vzhledem k tomu, že kopie je zamrzlá, jsou všechny ukotvené dílčí objekty zkopírovány odkazem.

(Zděděno od Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Vytvoří tuto instanci zablokovaný klon zadaného BitmapSourceobjektu . Odkazy na prostředky, datové vazby a animace se nekopírují, ale jejich aktuální hodnoty ano.

(Zděděno od BitmapSource)
GetHashCode()

Získá hash kód pro tento DependencyObject.

(Zděděno od DependencyObject)
GetLocalValueEnumerator()

Vytvoří specializovaný enumerátor pro určení vlastností závislostí, které mají místně nastavené hodnoty v tomto DependencyObjectobjektu .

(Zděděno od DependencyObject)
GetType()

Type Získá z aktuální instance.

(Zděděno od Object)
GetValue(DependencyProperty)

Vrátí aktuální efektivní hodnotu vlastnosti závislosti na této instanci objektu DependencyObject.

(Zděděno od DependencyObject)
InvalidateProperty(DependencyProperty)

Znovu vyhodnotí efektivní hodnotu pro zadanou vlastnost závislosti.

(Zděděno od DependencyObject)
Lock()

Zarezervuje back buffer pro aktualizace.

MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
OnChanged()

Volána při změně aktuálního Freezable objektu.

(Zděděno od Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Zajišťuje, že jsou vytvořeny vhodné ukazatele kontextu pro DependencyObjectType datový člen, který byl právě nastaven.

(Zděděno od Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Tento člen podporuje infrastrukturu Windows Presentation Foundation (WPF) a není určen k použití přímo z vašeho kódu.

(Zděděno od Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Přepíše implementaci DependencyObject tak, OnPropertyChanged(DependencyPropertyChangedEventArgs) aby také vyvolala všechny Changed obslužné rutiny v reakci na měnící se vlastnost závislosti typu Freezable.

(Zděděno od Freezable)
ReadLocalValue(DependencyProperty)

Vrátí místní hodnotu vlastnosti závislosti, pokud existuje.

(Zděděno od DependencyObject)
ReadPreamble()

Zajišťuje, že Freezable se k souboru přistupuje z platného vlákna. Dědíci Freezable musí tuto metodu volat na začátku jakéhokoli rozhraní API, které čte datové členy, které nejsou vlastnosti závislostí.

(Zděděno od Freezable)
SetCurrentValue(DependencyProperty, Object)

Nastaví hodnotu vlastnosti závislosti beze změny jejího zdroje hodnoty.

(Zděděno od DependencyObject)
SetValue(DependencyProperty, Object)

Nastaví místní hodnotu vlastnosti závislosti určenou identifikátorem vlastnosti závislosti.

(Zděděno od DependencyObject)
SetValue(DependencyPropertyKey, Object)

Nastaví místní hodnotu vlastnosti závislosti jen pro čtení určenou DependencyPropertyKey identifikátorem vlastnosti závislosti.

(Zděděno od DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Vrátí hodnotu, která označuje, zda serializační procesy mají serializovat hodnotu pro zadanou vlastnost závislosti.

(Zděděno od DependencyObject)
ToString()

Vytvoří řetězcovou reprezentaci tohoto objektu na základě aktuální jazykové verze.

(Zděděno od ImageSource)
ToString(IFormatProvider)

Vytvoří řetězcovou reprezentaci tohoto objektu IFormatProvider na základě předaného. Pokud je nullzprostředkovatel , použije se CurrentCulture .

(Zděděno od ImageSource)
TryLock(Duration)

Pokusí se uzamknout rastrový obrázek, nečeká déle než zadanou dobu.

Unlock()

Uvolní zadní vyrovnávací paměť, aby byla k dispozici pro zobrazení.

VerifyAccess()

Vynutí, aby volající vlákno má přístup k tomuto DispatcherObject.

(Zděděno od DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32)

Aktualizace pixelů v zadané oblasti rastrového obrázku.

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

Aktualizace pixelů v zadané oblasti rastrového obrázku.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Aktualizace pixelů v zadané oblasti rastrového obrázku.

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

Aktualizace pixelů v zadané oblasti rastrového obrázku.

WritePostscript()

Changed Vyvolá událost pro Freezable a vyvolá jeho OnChanged() metodu. Třídy odvozené z Freezable by měly tuto metodu volat na konci jakéhokoli rozhraní API, které upravuje členy třídy, které nejsou uloženy jako vlastnosti závislosti.

(Zděděno od Freezable)
WritePreamble()

Ověřuje, že Freezable objekt není zamrznutý a že se k němu přistupuje z platného kontextu podprocesů. Freezable Dědiče by tuto metodu měli volat na začátku jakéhokoli rozhraní API, které zapisuje do datových členů, které nejsou vlastnosti závislostí.

(Zděděno od Freezable)

Událost

Changed

Vyvolá se při změně objektu Freezable nebo objektu, který obsahuje.

(Zděděno od Freezable)
DecodeFailed

Vyvolá se, když se kvůli poškozené hlavičce image nepodaří načíst image.

(Zděděno od BitmapSource)
DownloadCompleted

Vyvolá se v případě, že byl obsah rastrového obrázku zcela stažen.

(Zděděno od BitmapSource)
DownloadFailed

Vyvolá se, když se obsah rastrového obrázku nepodařilo stáhnout.

(Zděděno od BitmapSource)
DownloadProgress

Vyvolá se při průběhu stahování obsahu rastrového obrázku změněna.

(Zděděno od BitmapSource)

Explicitní implementace rozhraní

IFormattable.ToString(String, IFormatProvider)

Formátuje hodnotu aktuální instance pomocí zadaného formátu.

(Zděděno od ImageSource)

Platí pro

Viz také