WriteableBitmap Classe

Définition

Fournit une source BitmapSource qui peut être modifiée et mise à jour.

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
Héritage

Exemples

L’exemple suivant montre comment WriteableBitmap un peut être utilisé comme source d’un Image pour dessiner des pixels lorsque la souris se déplace.

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

Remarques

Utilisez la WriteableBitmap classe pour mettre à jour et restituer une image bitmap par image. Cela est utile pour générer du contenu algorithmique, tel qu’une image fractale, et pour la visualisation des données, comme un visualiseur de musique.

La WriteableBitmap classe utilise deux mémoires tampons. La mémoire tampon arrière est allouée dans la mémoire système et accumule le contenu qui n’est pas affiché actuellement. La mémoire tampon frontale est allouée dans la mémoire système et contient le contenu actuellement affiché. Le système de rendu copie la mémoire tampon frontale dans la mémoire vidéo pour l’affichage.

Deux threads utilisent ces mémoires tampons. Le thread d’interface utilisateur génère l’interface utilisateur, mais ne la présente pas à l’écran. Le thread d’interface utilisateur répond aux entrées utilisateur, aux minuteurs et à d’autres événements. Une application peut avoir plusieurs threads d’interface utilisateur. Le thread de rendu compose et affiche les modifications du thread d’interface utilisateur. Il n’existe qu’un seul thread de rendu par application.

Le thread d’interface utilisateur écrit le contenu dans la mémoire tampon arrière. Le thread de rendu lit le contenu à partir de la mémoire tampon avant et le copie dans la mémoire vidéo. Les modifications apportées à la mémoire tampon arrière sont suivies avec des régions rectangulaires modifiées.

Appelez l’une WritePixels des surcharges pour mettre à jour et afficher automatiquement le contenu dans la mémoire tampon arrière.

Pour un meilleur contrôle sur les mises à jour et pour l’accès multithread à la mémoire tampon arrière, utilisez le workflow suivant.

  1. Appelez la Lock méthode pour réserver la mémoire tampon arrière pour les mises à jour.

  2. Obtenez un pointeur vers la mémoire tampon arrière en accédant à la BackBuffer propriété .

  3. Écrivez les modifications dans la mémoire tampon arrière. D’autres threads peuvent écrire des modifications dans la mémoire tampon arrière lorsque le WriteableBitmap est verrouillé.

  4. Appelez la AddDirtyRect méthode pour indiquer les zones qui ont changé.

  5. Appelez la Unlock méthode pour libérer la mémoire tampon arrière et autoriser la présentation à l’écran.

Lorsque des mises à jour sont envoyées au thread de rendu, le thread de rendu copie les rectangles modifiés de la mémoire tampon arrière vers la mémoire tampon avant. Le système de rendu contrôle cet échange pour éviter les interblocages et les artefacts redessinants, tels que le « déchirement ».

Constructeurs

WriteableBitmap(BitmapSource)

Initialise une nouvelle instance de la classe WriteableBitmap avec le BitmapSource donné.

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

Initialise une nouvelle instance de la classe WriteableBitmap avec les paramètres spécifiés.

Propriétés

BackBuffer

Obtient un pointeur vers la mémoire tampon d'arrière-plan.

BackBufferStride

Obtient une valeur indiquant le nombre d'octets d'une ligne unique de données de pixels.

CanFreeze

Obtient une valeur qui indique si l’objet peut être rendu non modifiable.

(Hérité de Freezable)
DependencyObjectType

Obtient le DependencyObjectType qui encapsule le type CLR de ce instance.

(Hérité de DependencyObject)
Dispatcher

Obtient le Dispatcher associé à DispatcherObject.

(Hérité de DispatcherObject)
DpiX

Obtient les points horizontaux par pouce (ppp) de l’image.

(Hérité de BitmapSource)
DpiY

Obtient les points verticaux par pouce (ppp) de l’image.

(Hérité de BitmapSource)
Format

Obtient le PixelFormat natif des données bitmap.

(Hérité de BitmapSource)
HasAnimatedProperties

Obtient une valeur qui indique si un ou plusieurs objets AnimationClock sont associés à l'une ou l'autre des propriétés de dépendance de cet objet.

(Hérité de Animatable)
Height

Obtient la hauteur de la bitmap source en unités indépendantes de l’appareil (1/96e pouce par unité).

(Hérité de BitmapSource)
IsDownloading

Obtient une valeur qui indique si le contenu BitmapSource est en cours de téléchargement.

(Hérité de BitmapSource)
IsFrozen

Obtient une valeur qui indique si l’objet est actuellement modifiable.

(Hérité de Freezable)
IsSealed

Récupère une valeur qui indique si cette instance est actuellement sealed (en lecture seule).

(Hérité de DependencyObject)
Metadata

Obtient les métadonnées associées à cette image bitmap.

(Hérité de BitmapSource)
Palette

Obtient la palette de couleurs de l'image bitmap, si spécifiée.

(Hérité de BitmapSource)
PixelHeight

Obtient la hauteur de l'image bitmap en pixels.

(Hérité de BitmapSource)
PixelWidth

Obtient la largeur de l'image bitmap en pixels.

(Hérité de BitmapSource)
Width

Obtient la largeur de la bitmap en unités indépendantes de l’appareil (1/96e pouce par unité).

(Hérité de BitmapSource)

Méthodes

AddDirtyRect(Int32Rect)

Spécifie la zone de la bitmap qui a été modifiée.

ApplyAnimationClock(DependencyProperty, AnimationClock)

Applique AnimationClock au DependencyProperty spécifié. Si la propriété est déjà animée, le comportement de transfert SnapshotAndReplace est utilisé.

(Hérité de Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Applique AnimationClock au DependencyProperty spécifié. Si la propriété spécifiée est déjà animée, le comportement HandoffBehavior spécifié est utilisé.

(Hérité de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Applique une animation au DependencyProperty spécifié. L’animation est démarrée lors de la restitution de l’image suivante. Si la propriété spécifiée est déjà animée, le comportement de transfert SnapshotAndReplace est utilisé.

(Hérité de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Applique une animation au DependencyProperty spécifié. L’animation est démarrée lors de la restitution de l’image suivante. Si la propriété spécifiée est déjà animée, le comportement HandoffBehavior spécifié est utilisé.

(Hérité de Animatable)
CheckAccess()

Détermine si le thread appelant a accès à ce DispatcherObject.

(Hérité de DispatcherObject)
CheckIfSiteOfOrigin()

Vérifie si le contenu de la source bitmap provient d’un site d’origine connu. Cette méthode est utilisée pour s’assurer que les opérations de copie des pixels sont sûres.

(Hérité de BitmapSource)
ClearValue(DependencyProperty)

Efface la valeur locale d’une propriété. La propriété à effacer est spécifiée par un identificateur DependencyProperty.

(Hérité de DependencyObject)
ClearValue(DependencyPropertyKey)

Efface la valeur locale d’une propriété en lecture seule. La propriété à effacer est spécifiée par DependencyPropertyKey.

(Hérité de DependencyObject)
Clone()

Crée un clone modifiable de ce WriteableBitmap, en créant des copies complètes des valeurs de cet objet. Pendant la copie des propriétés de dépendance, cette méthode copie les références de ressources et les liaisons de données (qui risquent toutefois de ne plus pouvoir se résoudre), mais pas les animations ni leurs valeurs actuelles.

CloneCore(Freezable)

Convertit cette instance en copie complète de l’objet BitmapSource spécifié. Pendant la copie des propriétés de dépendance, cette méthode copie les références de ressources et les liaisons de données (qui risquent toutefois de ne plus pouvoir se résoudre), mais pas les animations ni leurs valeurs actuelles.

(Hérité de BitmapSource)
CloneCurrentValue()

Crée un clone modifiable de cet objet ByteAnimationUsingKeyFrames, en effectuant une copie complète des valeurs actuelles de cet objet. Contrairement à leurs valeurs actuelles, les références de ressources, les liaisons de données et les animations ne sont pas copiées.

CloneCurrentValueCore(Freezable)

Convertit cette instance en copie complète modifiable de l’objet BitmapSource spécifié à l’aide des valeurs de propriété actuelles. Contrairement à leurs valeurs actuelles, les références de ressources, les liaisons de données et les animations ne sont pas copiées.

(Hérité de BitmapSource)
CoerceValue(DependencyProperty)

Convertit la valeur de la propriété de dépendance spécifiée. Pour cela, on appelle toute fonction CoerceValueCallback spécifiée dans les métadonnées de propriété pour la propriété de dépendance telle qu’elle existe sur le DependencyObject appelant.

(Hérité de DependencyObject)
CopyPixels(Array, Int32, Int32)

Copie les données de pixels de l'image bitmap dans un tableau de pixels avec la largeur de numérisation spécifiée, en commençant à l'offset spécifié.

(Hérité de BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Copie les données de pixels de l'image bitmap dans le rectangle indiqué dans un tableau de pixels avec la largeur de numérisation spécifiée, en commençant à l'offset spécifié.

(Hérité de BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Copie les données de pixels de l’image bitmap dans le rectangle spécifié.

(Hérité de BitmapSource)
CreateInstance()

Initialise une nouvelle instance de la classe Freezable.

(Hérité de Freezable)
CreateInstanceCore()

Une fois implémentée dans une classe dérivée, initialise une nouvelle instance de la classe dérivée Freezable.

(Hérité de Freezable)
Equals(Object)

Détermine si un DependencyObject fourni est équivalent au DependencyObject réel.

(Hérité de DependencyObject)
Freeze()

Rend l’objet actif non modifiable et attribue à sa propriété IsFrozen la valeur true.

(Hérité de Freezable)
FreezeCore(Boolean)

Rend une instance de BitmapSource ou une classe dérivée immuable.

(Hérité de BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Retourne la valeur non animée de la propriété DependencyProperty spécifiée.

(Hérité de Animatable)
GetAsFrozen()

Crée une copie figée de Freezable, à l'aide des valeurs de propriété (non-animées) de base. Étant donné que la copie est figée, tous les sous-objets figés sont copiés par référence.

(Hérité de Freezable)
GetAsFrozenCore(Freezable)

Convertit cette instance en un clone de l’objet BitmapSource spécifié.

(Hérité de BitmapSource)
GetCurrentValueAsFrozen()

Crée une copie figée de Freezable à l'aide des valeurs de propriété actuelles. Étant donné que la copie est figée, tous les sous-objets figés sont copiés par référence.

(Hérité de Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Convertit cette instance en clone figé du BitmapSource spécifié. Contrairement à leurs valeurs actuelles, les références de ressources, les liaisons de données et les animations ne sont pas copiées.

(Hérité de BitmapSource)
GetHashCode()

Obtient un code de hachage pour ce DependencyObject.

(Hérité de DependencyObject)
GetLocalValueEnumerator()

Crée un énumérateur spécialisé pour déterminer quelles propriétés de dépendance ont des valeurs définies localement sur ce DependencyObject.

(Hérité de DependencyObject)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
GetValue(DependencyProperty)

Retourne la valeur effective actuelle d’une propriété de dépendance sur cette instance d’un DependencyObject.

(Hérité de DependencyObject)
InvalidateProperty(DependencyProperty)

Réévalue la valeur effective de la propriété de dépendance spécifiée.

(Hérité de DependencyObject)
Lock()

Réserve la mémoire tampon d'arrière-plan aux mises à jour.

MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
OnChanged()

Appelé lorsque l’objet Freezable actuel est modifié.

(Hérité de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Garantit que les pointeurs de contexte appropriés sont établis pour un membre de données de type DependencyObjectType qui vient juste d'être défini.

(Hérité de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Ce membre prend en charge l’infrastructure Windows Presentation Foundation (WPF) et n’est pas destiné à être utilisé directement à partir de votre code.

(Hérité de Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Substitue l’implémentation DependencyObject de OnPropertyChanged(DependencyPropertyChangedEventArgs) pour appeler également tous les gestionnaires Changed en réponse à une propriété de dépendance variable de type Freezable.

(Hérité de Freezable)
ReadLocalValue(DependencyProperty)

Retourne la valeur locale d’une propriété de dépendance, si elle existe.

(Hérité de DependencyObject)
ReadPreamble()

Garantit que Freezable est accessible à partir d'un thread valide. Les héritiers de Freezable doivent appeler cette méthode au début de toute API lisant les membres de données qui ne sont pas des propriétés de dépendance.

(Hérité de Freezable)
SetCurrentValue(DependencyProperty, Object)

Définit la valeur d’une propriété de dépendance sans modifier sa valeur source.

(Hérité de DependencyObject)
SetValue(DependencyProperty, Object)

Définit la valeur locale d’une propriété de dépendance, spécifiée par son identificateur de propriété de dépendance.

(Hérité de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Définit la valeur locale d’une propriété de dépendance en lecture seule, spécifiée par l’identificateur DependencyPropertyKey de la propriété de dépendance.

(Hérité de DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Retourne une valeur qui indique si les processus de sérialisation doivent sérialiser la valeur de la propriété de dépendance fournie.

(Hérité de DependencyObject)
ToString()

Crée une représentation sous forme de chaîne de cet objet selon la culture actuelle.

(Hérité de ImageSource)
ToString(IFormatProvider)

Crée une représentation sous forme de chaîne de cet objet en fonction du IFormatProvider passé. Si le fournisseur est null, le CurrentCulture est utilisé.

(Hérité de ImageSource)
TryLock(Duration)

Tente de verrouiller la bitmap, en attendant la durée spécifié.

Unlock()

Libère la mémoire tampon d'arrière-plan afin qu'elle soit disponible pour l'affichage.

VerifyAccess()

Garantit que le thread appelant a accès à DispatcherObject.

(Hérité de DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32)

Met à jour les pixels dans la zone spécifiée pour la bitmap.

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

Met à jour les pixels dans la zone spécifiée pour la bitmap.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Met à jour les pixels dans la zone spécifiée pour la bitmap.

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

Met à jour les pixels dans la zone spécifiée pour la bitmap.

WritePostscript()

Déclenche l’événement Changed pour le Freezable et appelle sa méthode OnChanged(). Les classes qui dérivent de Freezable doivent appeler cette méthode à la fin de toute API qui modifie des membres de classe qui ne sont pas stockés en tant que propriétés de dépendance.

(Hérité de Freezable)
WritePreamble()

Vérifie que le Freezable n'est pas figé et que son accès s'effectue à partir d'un contexte de thread valide. Les héritiers de Freezable doivent appeler cette méthode au début de toute API écrivant dans les membres de données qui ne sont pas des propriétés de dépendance.

(Hérité de Freezable)

Événements

Changed

Se produit lorsque Freezable ou un objet qu'il contient est modifié.

(Hérité de Freezable)
DecodeFailed

Se produit en cas d'échec du téléchargement de l'image, à cause d'un en-tête d'image corrompu.

(Hérité de BitmapSource)
DownloadCompleted

Se produit lorsque le contenu de la bitmap a été complètement téléchargé.

(Hérité de BitmapSource)
DownloadFailed

Se produit lorsque le téléchargement du contenu de la bitmap a échoué.

(Hérité de BitmapSource)
DownloadProgress

Se produit lorsque la progression du téléchargement du contenu de la bitmap a changé.

(Hérité de BitmapSource)

Implémentations d’interfaces explicites

IFormattable.ToString(String, IFormatProvider)

Met en forme la valeur de l’instance actuelle en utilisant le format spécifié.

(Hérité de ImageSource)

S’applique à

Voir aussi