WriteableBitmap Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Fournit un BitmapSource élément qui peut être écrit dans et mis à 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
-
WriteableBitmap
Exemples
L’exemple suivant montre comment un WriteableBitmap 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 afficher une 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 en mémoire système et contient le contenu actuellement affiché. Le système de rendu copie la mémoire tampon frontale en 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 le 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 du contenu dans la mémoire tampon arrière. Le thread de rendu lit le contenu de la mémoire tampon frontale et le copie en mémoire vidéo. Les modifications apportées à la mémoire tampon arrière sont suivies avec des régions rectangulaires modifiées.
Appelez automatiquement l’une des WritePixels surcharges pour mettre à jour et afficher du contenu dans la mémoire tampon arrière.
Pour un meilleur contrôle des mises à jour et pour l’accès multithread à la mémoire tampon back, utilisez le flux de travail suivant.
Appelez la méthode pour réserver la Lock mémoire tampon back pour les mises à jour.
Obtenez un pointeur vers la mémoire tampon back en accédant à la BackBuffer propriété.
Écrivez les modifications apportées à la mémoire tampon d’arrière-mémoire. D’autres threads peuvent écrire des modifications dans la mémoire tampon arrière lorsque l’objet WriteableBitmap est verrouillé.
Appelez la AddDirtyRect méthode pour indiquer les zones qui ont changé.
Appelez la méthode pour libérer la Unlock mémoire tampon arrière et autoriser la présentation à l’écran.
Lorsque les 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 frontale. Le système de rendu contrôle cet échange pour éviter les interblocages et redessiner les artefacts, tels que « déchirures ».
Constructeurs
| Nom | Description |
|---|---|
| WriteableBitmap(BitmapSource) |
Initialise une nouvelle instance de la classe à l’aide WriteableBitmap de l’élément donné BitmapSource. |
| WriteableBitmap(Int32, Int32, Double, Double, PixelFormat, BitmapPalette) |
Initialise une nouvelle instance de la WriteableBitmap classe avec les paramètres spécifiés. |
Propriétés
| Nom | Description |
|---|---|
| BackBuffer |
Obtient un pointeur vers la mémoire tampon arrière. |
| BackBufferStride |
Obtient une valeur indiquant le nombre d’octets dans une seule ligne 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 type CLR de cette instance. (Hérité de DependencyObject) |
| Dispatcher |
Obtient ce Dispatcher qui DispatcherObject est associé. (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 natif PixelFormat des données bitmap. (Hérité de BitmapSource) |
| HasAnimatedProperties |
Obtient une valeur qui indique si un ou plusieurs AnimationClock objets sont associés à l’une des propriétés de dépendance de cet objet. (Hérité de Animatable) |
| Height |
Obtient la hauteur de la bitmap source dans les unités indépendantes de l’appareil (1/96e pouce par unité). (Hérité de BitmapSource) |
| IsDownloading |
Obtient une valeur qui indique si le BitmapSource contenu 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 |
Obtient une valeur qui indique si cette instance est actuellement scellée (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 la bitmap, si elle est spécifiée. (Hérité de BitmapSource) |
| PixelHeight |
Obtient la hauteur de la bitmap en pixels. (Hérité de BitmapSource) |
| PixelWidth |
Obtient la largeur de la 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
| Nom | Description |
|---|---|
| AddDirtyRect(Int32Rect) |
Spécifie la zone de la bitmap qui a changé. |
| ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior) |
Applique un AnimationClock à l’objet spécifié DependencyProperty. Si la propriété est déjà animée, la propriété HandoffBehavior spécifiée est utilisée. (Hérité de Animatable) |
| ApplyAnimationClock(DependencyProperty, AnimationClock) |
Applique un AnimationClock à l’objet spécifié DependencyProperty. Si la propriété est déjà animée, le comportement de SnapshotAndReplace transfert est utilisé. (Hérité de Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
Applique une animation au fichier spécifié DependencyProperty. L’animation est démarrée lorsque l’image suivante est rendue. Si la propriété spécifiée est déjà animée, celle-ci HandoffBehavior est utilisée. (Hérité de Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline) |
Applique une animation au fichier spécifié DependencyProperty. L’animation est démarrée lorsque l’image suivante est rendue. Si la propriété spécifiée est déjà animée, le comportement de SnapshotAndReplace transfert est utilisé. (Hérité de Animatable) |
| CheckAccess() |
Détermine si le thread appelant a accès à ce DispatcherObjectfichier . (Hérité de DispatcherObject) |
| CheckIfSiteOfOrigin() |
Vérifie si le contenu source bitmap provient d’un site d’origine connu. Cette méthode est utilisée pour vous assurer que les opérations de copie de pixels sont sécurisées. (Hérité de BitmapSource) |
| ClearValue(DependencyProperty) |
Efface la valeur locale d’une propriété. La propriété à effacer est spécifiée par un DependencyProperty identificateur. (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 un DependencyPropertyKey. (Hérité de DependencyObject) |
| Clone() |
Crée un clone modifiable de ce WriteableBitmapfichier, en effectuant des copies approfondies des valeurs de cet objet. Lors de 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 (mais elles peuvent ne plus être résolues), mais pas les animations ni leurs valeurs actuelles. |
| CloneCore(Freezable) |
Rend cette instance une copie approfondie du fichier spécifié BitmapSource. Lors de 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 (mais elles peuvent ne plus être résolues), mais pas les animations ni leurs valeurs actuelles. (Hérité de BitmapSource) |
| CloneCurrentValue() |
Crée un clone modifiable de cet ByteAnimationUsingKeyFrames objet, effectuant des copies approfondies des valeurs actuelles de cet objet. Les références de ressources, les liaisons de données et les animations ne sont pas copiées, mais leurs valeurs actuelles sont. |
| CloneCurrentValueCore(Freezable) |
Rend cette instance une copie approfondie modifiable de l’élément spécifié BitmapSource à l’aide des valeurs de propriété actuelles. Les références de ressources, les liaisons de données et les animations ne sont pas copiées, mais leurs valeurs actuelles sont. (Hérité de BitmapSource) |
| CoerceValue(DependencyProperty) |
Force la valeur de la propriété de dépendance spécifiée. Pour ce faire, appelez n’importe quelle CoerceValueCallback fonction spécifiée dans les métadonnées de propriété pour la propriété de dépendance telle qu’elle existe sur l’appel DependencyObject. (Hérité de DependencyObject) |
| CopyPixels(Array, Int32, Int32) |
Copie les données de pixel bitmap dans un tableau de pixels avec la progression spécifiée, en commençant à l’offset spécifié. (Hérité de BitmapSource) |
| CopyPixels(Int32Rect, Array, Int32, Int32) |
Copie les données de pixel bitmap dans le rectangle spécifié dans un tableau de pixels dont la progression spécifiée commence au décalage spécifié. (Hérité de BitmapSource) |
| CopyPixels(Int32Rect, IntPtr, Int32, Int32) |
Copie les données de pixel bitmap dans le rectangle spécifié. (Hérité de BitmapSource) |
| CreateInstance() |
Initialise une nouvelle instance de la classe Freezable. (Hérité de Freezable) |
| CreateInstanceCore() |
En cas d’implémentation dans une classe dérivée, crée une nouvelle instance de la Freezable classe dérivée. (Hérité de Freezable) |
| Equals(Object) |
Détermine si un élément fourni DependencyObject est équivalent à l’actuel DependencyObject. (Hérité de DependencyObject) |
| Freeze() |
Rend l’objet actuel non modifiable et définit sa IsFrozen propriété sur |
| 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 l’objet spécifié DependencyProperty. (Hérité de Animatable) |
| GetAsFrozen() |
Crée une copie figée des valeurs de Freezablepropriété de base (non animées). É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) |
Fait de cette instance un clone de l’objet spécifié BitmapSource . (Hérité de BitmapSource) |
| GetCurrentValueAsFrozen() |
Crée une copie figée de l’utilisation Freezable 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) |
Fait de cette instance un clone figé du fichier spécifié BitmapSource. Les références de ressources, les liaisons de données et les animations ne sont pas copiées, mais leurs valeurs actuelles sont. (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 la 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) |
Évalue à nouveau la valeur effective de la propriété de dépendance spécifiée. (Hérité de DependencyObject) |
| Lock() |
Réserve la mémoire tampon de retour pour les mises à jour. |
| MemberwiseClone() |
Crée une copie superficielle du Objectactuel. (Hérité de Object) |
| OnChanged() |
Appelé lorsque l’objet actuel Freezable est modifié. (Hérité de Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty) |
Ce membre prend en charge l’infrastructure WPF (Windows Presentation Foundation) et n’est pas destiné à être utilisé directement à partir de votre code. (Hérité de Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
Garantit que les pointeurs de contexte appropriés sont établis pour un DependencyObjectType membre de données qui vient d’être défini. (Hérité de Freezable) |
| OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Remplace l’implémentation DependencyObject de OnPropertyChanged(DependencyPropertyChangedEventArgs) l’appel de tous Changed les gestionnaires en réponse à une propriété de dépendance modifiée de type Freezable. (Hérité de Freezable) |
| ReadLocalValue(DependencyProperty) |
Retourne la valeur locale d’une propriété de dépendance, le cas échéant. (Hérité de DependencyObject) |
| ReadPreamble() |
Garantit l’accès Freezable à partir d’un thread valide. Les héritiers de Freezable doivent appeler cette méthode au début de toute API qui lit 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 source de valeur. (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 en fonction de 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 passage. Si le fournisseur est |
| TryLock(Duration) |
Tente de verrouiller la bitmap, en attendant qu’elle ne dépasse pas la durée spécifiée. |
| Unlock() |
Libère la mémoire tampon de retour pour la rendre disponible pour l’affichage. |
| VerifyAccess() |
Applique que le thread appelant a accès à ce DispatcherObjectfichier . (Hérité de DispatcherObject) |
| WritePixels(Int32Rect, Array, Int32, Int32, Int32) |
Met à jour les pixels dans la région spécifiée de la bitmap. |
| WritePixels(Int32Rect, Array, Int32, Int32) |
Met à jour les pixels dans la région spécifiée de la bitmap. |
| WritePixels(Int32Rect, IntPtr, Int32, Int32, Int32, Int32) |
Met à jour les pixels dans la région spécifiée de la bitmap. |
| WritePixels(Int32Rect, IntPtr, Int32, Int32) |
Met à jour les pixels dans la région spécifiée de la bitmap. |
| WritePostscript() |
Déclenche l’événement Changed pour la Freezable méthode et appelle sa OnChanged() méthode. Les classes dérivées Freezable de doivent appeler cette méthode à la fin de toute API qui modifie les 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 l’objet Freezable n’est pas figé et qu’il est accessible à partir d’un contexte de threading valide. Freezable Les hériteurs doivent appeler cette méthode au début de toute API qui écrit dans les membres de données qui ne sont pas des propriétés de dépendance. (Hérité de Freezable) |
Événements
| Nom | Description |
|---|---|
| Changed |
Se produit lorsque l’objet Freezable qu’il contient est modifié. (Hérité de Freezable) |
| DecodeFailed |
Se produit lorsque l’image ne parvient pas à se charger, en raison d’un en-tête d’image endommagé. (Hérité de BitmapSource) |
| DownloadCompleted |
Se produit lorsque le contenu bitmap a été entièrement téléchargé. (Hérité de BitmapSource) |
| DownloadFailed |
Se produit lorsque le contenu bitmap n’a pas pu être téléchargé. (Hérité de BitmapSource) |
| DownloadProgress |
Se produit lorsque la progression du téléchargement du contenu bitmap a changé. (Hérité de BitmapSource) |
Implémentations d’interfaces explicites
| Nom | Description |
|---|---|
| IFormattable.ToString(String, IFormatProvider) |
Met en forme la valeur de l’instance actuelle à l’aide du format spécifié. (Hérité de ImageSource) |