Condividi tramite


WriteableBitmap Classe

Definizione

Fornisce un oggetto BitmapSource che può essere scritto e aggiornato.

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
Ereditarietà

Esempio

Nell'esempio seguente viene illustrato come utilizzare un WriteableBitmap oggetto come origine di un Image oggetto per disegnare pixel quando si sposta il 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);
        }
    }
}

Commenti

Usare la classe per aggiornare ed eseguire il WriteableBitmap rendering di una bitmap in base al fotogramma. Ciò è utile per generare contenuto algoritmico, ad esempio un'immagine frattale e per la visualizzazione dei dati, ad esempio un visualizzatore musicale.

La WriteableBitmap classe usa due buffer. Il buffer nascosto viene allocato nella memoria di sistema e accumula contenuto non attualmente visualizzato. Il buffer anteriore viene allocato nella memoria di sistema e contiene il contenuto attualmente visualizzato. Il sistema di rendering copia il buffer anteriore nella memoria video per la visualizzazione.

Due thread usano questi buffer. Il thread dell'interfaccia utente genera l'interfaccia utente ma non lo presenta sullo schermo. Il thread dell'interfaccia utente risponde all'input dell'utente, ai timer e ad altri eventi. Un'applicazione può avere più thread dell'interfaccia utente. Il thread di rendering compone ed esegue il rendering delle modifiche dal thread dell'interfaccia utente. Esiste un solo thread di rendering per applicazione.

Il thread dell'interfaccia utente scrive il contenuto nel buffer nascosto. Il thread di rendering legge il contenuto dal buffer anteriore e lo copia nella memoria video. Le modifiche apportate al buffer nascosto vengono rilevate con aree rettangolari modificate.

Chiamare uno degli WritePixels overload per aggiornare e visualizzare automaticamente il contenuto nel buffer nascosto.

Per un maggiore controllo sugli aggiornamenti e per l'accesso multithread al buffer nascosto, usare il flusso di lavoro seguente.

  1. Chiamare il Lock metodo per riservare il buffer nascosto per gli aggiornamenti.

  2. Ottenere un puntatore al buffer nascosto accedendo alla BackBuffer proprietà .

  3. Scrivere le modifiche nel buffer nascosto. Altri thread possono scrivere modifiche nel buffer nascosto quando è WriteableBitmap bloccato.

  4. Chiamare il AddDirtyRect metodo per indicare le aree modificate.

  5. Chiamare il Unlock metodo per rilasciare il buffer nascosto e consentire la presentazione sullo schermo.

Quando gli aggiornamenti vengono inviati al thread di rendering, il thread di rendering copia i rettangoli modificati dal buffer nascosto al buffer anteriore. Il sistema di rendering controlla questo scambio per evitare deadlock e ridisegnare artefatti, ad esempio "strappo".

Costruttori

Nome Descrizione
WriteableBitmap(BitmapSource)

Inizializza una nuova istanza della WriteableBitmap classe utilizzando l'oggetto specificato BitmapSource.

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

Inizializza una nuova istanza della WriteableBitmap classe con i parametri specificati.

Proprietà

Nome Descrizione
BackBuffer

Ottiene un puntatore al buffer nascosto.

BackBufferStride

Ottiene un valore che indica il numero di byte in una singola riga di dati pixel.

CanFreeze

Ottiene un valore che indica se l'oggetto può essere reso non modificabile.

(Ereditato da Freezable)
DependencyObjectType

Ottiene l'oggetto DependencyObjectType che esegue il wrapping del tipo CLR di questa istanza.

(Ereditato da DependencyObject)
Dispatcher

Ottiene l'oggetto DispatcherDispatcherObject a cui è associato.

(Ereditato da DispatcherObject)
DpiX

Ottiene i punti orizzontali per pollice (dpi) dell'immagine.

(Ereditato da BitmapSource)
DpiY

Ottiene i punti verticali per pollice (dpi) dell'immagine.

(Ereditato da BitmapSource)
Format

Ottiene l'oggetto nativo PixelFormat dei dati bitmap.

(Ereditato da BitmapSource)
HasAnimatedProperties

Ottiene un valore che indica se uno o più AnimationClock oggetti sono associati a una delle proprietà di dipendenza di questo oggetto.

(Ereditato da Animatable)
Height

Ottiene l'altezza della bitmap di origine in unità indipendenti dal dispositivo (1/96 pollici per unità).

(Ereditato da BitmapSource)
IsDownloading

Ottiene un valore che indica se il BitmapSource contenuto è attualmente in fase di download.

(Ereditato da BitmapSource)
IsFrozen

Ottiene un valore che indica se l'oggetto è attualmente modificabile.

(Ereditato da Freezable)
IsSealed

Ottiene un valore che indica se questa istanza è attualmente sealed (sola lettura).

(Ereditato da DependencyObject)
Metadata

Ottiene i metadati associati a questa immagine bitmap.

(Ereditato da BitmapSource)
Palette

Ottiene la tavolozza dei colori della bitmap, se specificata.

(Ereditato da BitmapSource)
PixelHeight

Ottiene l'altezza della bitmap in pixel.

(Ereditato da BitmapSource)
PixelWidth

Ottiene la larghezza della bitmap in pixel.

(Ereditato da BitmapSource)
Width

Ottiene la larghezza della bitmap in unità indipendenti dal dispositivo (1/96° pollice per unità).

(Ereditato da BitmapSource)

Metodi

Nome Descrizione
AddDirtyRect(Int32Rect)

Specifica l'area della bitmap modificata.

ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Applica un oggetto AnimationClock all'oggetto specificato DependencyProperty. Se la proprietà è già animata, viene utilizzato l'oggetto specificato HandoffBehavior .

(Ereditato da Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock)

Applica un oggetto AnimationClock all'oggetto specificato DependencyProperty. Se la proprietà è già animata, viene utilizzato il SnapshotAndReplace comportamento di handoff.

(Ereditato da Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Applica un'animazione all'oggetto specificato DependencyProperty. L'animazione viene avviata quando viene eseguito il rendering del fotogramma successivo. Se la proprietà specificata è già animata, viene utilizzato l'oggetto specificato HandoffBehavior .

(Ereditato da Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Applica un'animazione all'oggetto specificato DependencyProperty. L'animazione viene avviata quando viene eseguito il rendering del fotogramma successivo. Se la proprietà specificata è già animata, viene utilizzato il SnapshotAndReplace comportamento di handoff.

(Ereditato da Animatable)
CheckAccess()

Determina se il thread chiamante ha accesso a questo DispatcherObjectoggetto .

(Ereditato da DispatcherObject)
CheckIfSiteOfOrigin()

Verifica se il contenuto dell'origine bitmap proviene da un sito di origine noto. Questo metodo viene usato per assicurarsi che le operazioni di copia in pixel siano sicure.

(Ereditato da BitmapSource)
ClearValue(DependencyProperty)

Cancella il valore locale di una proprietà. La proprietà da cancellare viene specificata da un DependencyProperty identificatore.

(Ereditato da DependencyObject)
ClearValue(DependencyPropertyKey)

Cancella il valore locale di una proprietà di sola lettura. La proprietà da cancellare viene specificata da un oggetto DependencyPropertyKey.

(Ereditato da DependencyObject)
Clone()

Crea un clone modificabile di questo WriteableBitmapoggetto , eseguendo copie complete dei valori di questo oggetto. Quando si copiano le proprietà di dipendenza, questo metodo copia i riferimenti alle risorse e i data binding (ma potrebbero non essere più risolti), ma non le animazioni o i relativi valori correnti.

CloneCore(Freezable)

Rende questa istanza una copia completa dell'oggetto specificato BitmapSource. Quando si copiano le proprietà di dipendenza, questo metodo copia i riferimenti alle risorse e i data binding (ma potrebbero non essere più risolti), ma non le animazioni o i relativi valori correnti.

(Ereditato da BitmapSource)
CloneCurrentValue()

Crea un clone modificabile di questo ByteAnimationUsingKeyFrames oggetto, eseguendo copie complete dei valori correnti dell'oggetto. I riferimenti alle risorse, i data binding e le animazioni non vengono copiati, ma i relativi valori correnti sono.

CloneCurrentValueCore(Freezable)

Rende questa istanza una copia completa modificabile dell'oggetto specificato BitmapSource utilizzando i valori delle proprietà correnti. I riferimenti alle risorse, i data binding e le animazioni non vengono copiati, ma i relativi valori correnti sono.

(Ereditato da BitmapSource)
CoerceValue(DependencyProperty)

Forza il valore della proprietà di dipendenza specificata. A tale scopo, richiamare qualsiasi CoerceValueCallback funzione specificata nei metadati della proprietà per la proprietà di dipendenza così come esiste nella chiamata DependencyObjectdi .

(Ereditato da DependencyObject)
CopyPixels(Array, Int32, Int32)

Copia i dati del pixel bitmap in una matrice di pixel con lo stride specificato, a partire dall'offset specificato.

(Ereditato da BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Copia i dati del pixel bitmap all'interno del rettangolo specificato in una matrice di pixel con lo stride specificato a partire dall'offset specificato.

(Ereditato da BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Copia i dati dei pixel bitmap all'interno del rettangolo specificato.

(Ereditato da BitmapSource)
CreateInstance()

Inizializza una nuova istanza della classe Freezable.

(Ereditato da Freezable)
CreateInstanceCore()

Se implementato in una classe derivata, crea una nuova istanza della Freezable classe derivata.

(Ereditato da Freezable)
Equals(Object)

Determina se un oggetto specificato DependencyObject è equivalente all'oggetto corrente DependencyObject.

(Ereditato da DependencyObject)
Freeze()

Rende l'oggetto corrente non modificabile e imposta la relativa IsFrozen proprietà su true.

(Ereditato da Freezable)
FreezeCore(Boolean)

Rende non modificabile un'istanza di BitmapSource o una classe derivata.

(Ereditato da BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Restituisce il valore non animato dell'oggetto specificato DependencyProperty.

(Ereditato da Animatable)
GetAsFrozen()

Crea una copia bloccata della proprietà , utilizzando i valori della Freezableproprietà base (non animati). Poiché la copia è bloccata, tutti gli oggetti secondari bloccati vengono copiati in base al riferimento.

(Ereditato da Freezable)
GetAsFrozenCore(Freezable)

Rende questa istanza un clone dell'oggetto specificato BitmapSource .

(Ereditato da BitmapSource)
GetCurrentValueAsFrozen()

Crea una copia bloccata dell'oggetto utilizzando i valori correnti delle Freezable proprietà. Poiché la copia è bloccata, tutti gli oggetti secondari bloccati vengono copiati in base al riferimento.

(Ereditato da Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Rende questa istanza un clone bloccato dell'oggetto specificato BitmapSource. I riferimenti alle risorse, i data binding e le animazioni non vengono copiati, ma i relativi valori correnti sono.

(Ereditato da BitmapSource)
GetHashCode()

Ottiene un codice hash per l'oggetto DependencyObject.

(Ereditato da DependencyObject)
GetLocalValueEnumerator()

Crea un enumeratore specializzato per determinare quali proprietà di dipendenza hanno valori impostati localmente in questo DependencyObjectoggetto .

(Ereditato da DependencyObject)
GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
GetValue(DependencyProperty)

Restituisce il valore effettivo corrente di una proprietà di dipendenza in questa istanza di un oggetto DependencyObject.

(Ereditato da DependencyObject)
InvalidateProperty(DependencyProperty)

Rivaluta il valore effettivo per la proprietà di dipendenza specificata.

(Ereditato da DependencyObject)
Lock()

Riserva il buffer nascosto per gli aggiornamenti.

MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
OnChanged()

Chiamato quando l'oggetto corrente Freezable viene modificato.

(Ereditato da Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Questo membro supporta l'infrastruttura di Windows Presentation Foundation (WPF) e non deve essere usato direttamente dal codice.

(Ereditato da Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Assicura che vengano stabiliti puntatori di contesto appropriati per un DependencyObjectType membro dati appena impostato.

(Ereditato da Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Esegue l'override dell'implementazione DependencyObject di OnPropertyChanged(DependencyPropertyChangedEventArgs) per richiamare anche i Changed gestori in risposta a una proprietà di dipendenza modificata di tipo Freezable.

(Ereditato da Freezable)
ReadLocalValue(DependencyProperty)

Restituisce il valore locale di una proprietà di dipendenza, se esistente.

(Ereditato da DependencyObject)
ReadPreamble()

Assicura che l'oggetto Freezable sia accessibile da un thread valido. Gli eredi di Freezable devono chiamare questo metodo all'inizio di qualsiasi API che legge i membri dati che non sono proprietà di dipendenza.

(Ereditato da Freezable)
SetCurrentValue(DependencyProperty, Object)

Imposta il valore di una proprietà di dipendenza senza modificarne l'origine del valore.

(Ereditato da DependencyObject)
SetValue(DependencyProperty, Object)

Imposta il valore locale di una proprietà di dipendenza, specificato dall'identificatore della proprietà di dipendenza.

(Ereditato da DependencyObject)
SetValue(DependencyPropertyKey, Object)

Imposta il valore locale di una proprietà di dipendenza di sola lettura, specificato dall'identificatore DependencyPropertyKey della proprietà di dipendenza.

(Ereditato da DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Restituisce un valore che indica se i processi di serializzazione devono serializzare il valore per la proprietà di dipendenza specificata.

(Ereditato da DependencyObject)
ToString()

Crea una rappresentazione di stringa di questo oggetto in base alle impostazioni cultura correnti.

(Ereditato da ImageSource)
ToString(IFormatProvider)

Crea una rappresentazione di stringa di questo oggetto in base all'oggetto IFormatProvider passato. Se il provider è null, CurrentCulture viene utilizzato .

(Ereditato da ImageSource)
TryLock(Duration)

Tenta di bloccare la bitmap, in attesa di non più del periodo di tempo specificato.

Unlock()

Rilascia il buffer nascosto per renderlo disponibile per la visualizzazione.

VerifyAccess()

Impone che il thread chiamante abbia accesso a questo DispatcherObjectoggetto .

(Ereditato da DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32, Int32)

Aggiorna i pixel nell'area specificata della bitmap.

WritePixels(Int32Rect, Array, Int32, Int32)

Aggiorna i pixel nell'area specificata della bitmap.

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

Aggiorna i pixel nell'area specificata della bitmap.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Aggiorna i pixel nell'area specificata della bitmap.

WritePostscript()

Genera l'evento Changed per Freezable e richiama il relativo OnChanged() metodo. Le classi che derivano da Freezable devono chiamare questo metodo alla fine di qualsiasi API che modifica i membri della classe non archiviati come proprietà di dipendenza.

(Ereditato da Freezable)
WritePreamble()

Verifica che l'oggetto Freezable non sia bloccato e che sia accessibile da un contesto di threading valido. Freezable Gli eredi devono chiamare questo metodo all'inizio di qualsiasi API che scrive nei membri dati che non sono proprietà di dipendenza.

(Ereditato da Freezable)

Eventi

Nome Descrizione
Changed

Si verifica quando l'oggetto Freezable o un oggetto che contiene viene modificato.

(Ereditato da Freezable)
DecodeFailed

Si verifica quando l'immagine non viene caricata, a causa di un'intestazione di immagine danneggiata.

(Ereditato da BitmapSource)
DownloadCompleted

Si verifica quando il contenuto bitmap è stato completamente scaricato.

(Ereditato da BitmapSource)
DownloadFailed

Si verifica quando il contenuto bitmap non è riuscito a scaricare.

(Ereditato da BitmapSource)
DownloadProgress

Si verifica quando lo stato di avanzamento del download del contenuto bitmap è stato modificato.

(Ereditato da BitmapSource)

Implementazioni dell'interfaccia esplicita

Nome Descrizione
IFormattable.ToString(String, IFormatProvider)

Formatta il valore dell'istanza corrente utilizzando il formato specificato.

(Ereditato da ImageSource)

Si applica a

Vedi anche