WriteableBitmap Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет объект BitmapSource, в который можно осуществить запись и обновить.
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
- Наследование
-
WriteableBitmap
Примеры
В следующем примере показано, как WriteableBitmap можно использовать в качестве источника для рисования пикселей Image при перемещении мыши.
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);
}
}
}
Комментарии
Используйте класс для WriteableBitmap обновления и отрисовки растрового изображения для каждого кадра. Это полезно для создания алгоритмического содержимого, например фрактального изображения, и для визуализации данных, например для визуализатора музыки.
Класс WriteableBitmap использует два буфера. Задний буфер выделяется в системной памяти и накапливает содержимое, которое в настоящее время не отображается. Передний буфер выделяется в системной памяти и содержит содержимое, которое отображается в данный момент. Система отрисовки копирует передний буфер в видеопамять для отображения.
Эти буферы используются в двух потоках. Поток пользовательского интерфейса создает пользовательский интерфейс, но не отображает его на экране. Поток пользовательского интерфейса реагирует на ввод данных пользователем, таймеры и другие события. Приложение может иметь несколько потоков пользовательского интерфейса. Поток отрисовки создает и отрисовывает изменения из потока пользовательского интерфейса. Для каждого приложения существует только один поток отрисовки.
Поток пользовательского интерфейса записывает содержимое в задний буфер. Поток отрисовки считывает содержимое из переднего буфера и копирует его в видеопамять. Изменения в заднем буфере отслеживаются с помощью измененных прямоугольных областей.
Вызовите одну из перегрузок для автоматического WritePixels обновления и отображения содержимого в заднем буфере.
Для большего контроля над обновлениями и многопотокового доступа к заднему буферу используйте следующий рабочий процесс.
Вызовите метод , чтобы зарезервировать Lock задний буфер для обновлений.
Получите указатель на задний буфер, перейдя к свойству BackBuffer .
Запись изменений в задний буфер. Другие потоки могут записывать изменения в задний буфер, когда WriteableBitmap заблокирован.
Вызовите метод , AddDirtyRect чтобы указать области, которые изменились.
Вызовите метод , Unlock чтобы освободить задний буфер и разрешить презентацию на экране.
При отправке обновлений в поток отрисовки поток отрисовки копирует измененные прямоугольники из заднего буфера в передний. Система отрисовки управляет этим обменом, чтобы избежать взаимоблокировок и перерисовки артефактов, таких как "разрыв".
Конструкторы
WriteableBitmap(BitmapSource) |
Инициализирует новый экземпляр класса WriteableBitmap с использованием заданного типа BitmapSource. |
WriteableBitmap(Int32, Int32, Double, Double, PixelFormat, BitmapPalette) |
Инициализирует новый экземпляр класса WriteableBitmap с заданными параметрами. |
Свойства
BackBuffer |
Возвращает указатель на задний буфер. |
BackBufferStride |
Возвращает значение, указывающее количество байтов в одной строке данных о пикселях. |
CanFreeze |
Возвращает значение, которое указывает, можно ли сделать объект неизменяемым. (Унаследовано от Freezable) |
DependencyObjectType |
Возвращает объект , DependencyObjectType который заключает в оболочку тип СРЕДЫ CLR данного экземпляра. (Унаследовано от DependencyObject) |
Dispatcher |
Возвращает объект Dispatcher, с которым связан этот объект DispatcherObject. (Унаследовано от DispatcherObject) |
DpiX |
Получает горизонтальные точки на дюйм (точек на дюйм) изображения. (Унаследовано от BitmapSource) |
DpiY |
Возвращает вертикальные точки на дюйм (dpi) изображения. (Унаследовано от BitmapSource) |
Format |
Возвращает исходный формат PixelFormat данных растрового изображения. (Унаследовано от BitmapSource) |
HasAnimatedProperties |
Возвращает значение, которое указывает, сопоставлены ли один или несколько объектов AnimationClock любому из свойств зависимостей этого объекта. (Унаследовано от Animatable) |
Height |
Возвращает высоту исходного растрового изображения в независимых от устройства единицах (1/96 дюйма на единицу). (Унаследовано от BitmapSource) |
IsDownloading |
Получает значение, указывающее, находится ли содержимое BitmapSource в процессе загрузки. (Унаследовано от BitmapSource) |
IsFrozen |
Получает значение, указывающее, доступен ли объект для изменения в настоящее время. (Унаследовано от Freezable) |
IsSealed |
Получает значение, указывающее, является ли этот экземпляр в данный момент запечатанным (доступным только для чтения). (Унаследовано от DependencyObject) |
Metadata |
Получает метаданные, связанные с данным растровым изображением. (Унаследовано от BitmapSource) |
Palette |
Получает цветовую палитру растрового изображения, если она задана. (Унаследовано от BitmapSource) |
PixelHeight |
Получает высоту растрового изображения в пикселях. (Унаследовано от BitmapSource) |
PixelWidth |
Получает ширину растрового изображения в пикселях. (Унаследовано от BitmapSource) |
Width |
Возвращает ширину растрового изображения в независимых от устройства единицах (1/96 дюйма на единицу). (Унаследовано от BitmapSource) |
Методы
AddDirtyRect(Int32Rect) |
Указывает измененную область растрового изображения. |
ApplyAnimationClock(DependencyProperty, AnimationClock) |
Применяет AnimationClock к заданному DependencyProperty. Если свойство уже анимировано, используется эстафетное поведение SnapshotAndReplace. (Унаследовано от Animatable) |
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior) |
Применяет AnimationClock к заданному DependencyProperty. Если свойство уже является анимированным, используется указанное поведение HandoffBehavior. (Унаследовано от Animatable) |
BeginAnimation(DependencyProperty, AnimationTimeline) |
Применяет анимацию к указанному DependencyProperty. Анимация начинается при отрисовке следующего кадра. Если указанное свойство уже анимировано, используется поведение перемещения SnapshotAndReplace. (Унаследовано от Animatable) |
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
Применяет анимацию к указанному DependencyProperty. Анимация начинается при отрисовке следующего кадра. Если указанное свойство уже является анимированным, используется указанное поведение HandoffBehavior. (Унаследовано от Animatable) |
CheckAccess() |
Определяет, имеет ли вызывающий поток доступ к этому DispatcherObject. (Унаследовано от DispatcherObject) |
CheckIfSiteOfOrigin() |
Проверяет, получено ли исходное содержимое точечного рисунка из известного узла источника. Этот метод позволяет проверить безопасность операций копирования пикселей. (Унаследовано от BitmapSource) |
ClearValue(DependencyProperty) |
Очищает локальное значение свойства. Очищаемое свойство задается идентификатором DependencyProperty. (Унаследовано от DependencyObject) |
ClearValue(DependencyPropertyKey) |
Очищает локальное значение доступного только для чтения свойства. Очищаемое свойство задается ключом DependencyPropertyKey. (Унаследовано от DependencyObject) |
Clone() |
Создает изменяемый клон данного объекта WriteableBitmap, делая глубокие копии значений этого объекта. При копировании свойств зависимостей этот метод копирует ссылки на ресурсы и привязки данных (которые могут уже не быть разрешимыми), но не копирует анимации и их текущие значения. |
CloneCore(Freezable) |
Делает этот экземпляр глубокой копией указанного объекта BitmapSource. При копировании свойств зависимостей этот метод копирует ссылки на ресурсы и привязки данных (которые могут уже не быть разрешимыми), но не копирует анимации и их текущие значения. (Унаследовано от BitmapSource) |
CloneCurrentValue() |
Создает модифицируемый клон данного объекта ByteAnimationUsingKeyFrames, делая глубокие копии текущих значений этого объекта. Ссылки на ресурсы, привязки данных и анимации не копируются, но копируются их текущие значения. |
CloneCurrentValueCore(Freezable) |
Делает этот экземпляр изменяемой глубокой копией указанной коллекции BitmapSource с использованием текущих значений свойств. Ссылки на ресурсы, привязки данных и анимации не копируются, но копируются их текущие значения. (Унаследовано от BitmapSource) |
CoerceValue(DependencyProperty) |
Приводит значение указанного свойства зависимостей. Это осуществляется путем вызова какой-либо функции CoerceValueCallback, указанной в метаданных свойства зависимостей, которое существует в вызывающем объекте DependencyObject. (Унаследовано от DependencyObject) |
CopyPixels(Array, Int32, Int32) |
Копирует данные пикселей растрового изображения в массив пикселей с заданным шагом начиная с заданного смещения. (Унаследовано от BitmapSource) |
CopyPixels(Int32Rect, Array, Int32, Int32) |
Копирует данные пикселей растрового изображения из заданного прямоугольника в массив пикселей с заданным шагом начиная с заданного смещения. (Унаследовано от BitmapSource) |
CopyPixels(Int32Rect, IntPtr, Int32, Int32) |
Копирует данные пикселей растрового изображения в пределах заданного прямоугольника. (Унаследовано от BitmapSource) |
CreateInstance() |
Инициализирует новый экземпляр класса Freezable. (Унаследовано от Freezable) |
CreateInstanceCore() |
Если реализуется в производном классе, создает новый экземпляр производного класса Freezable. (Унаследовано от Freezable) |
Equals(Object) |
Определяет, является ли указанный DependencyObject эквивалентом текущего DependencyObject. (Унаследовано от DependencyObject) |
Freeze() |
Делает текущий объект неизменяемым и присваивает его свойству IsFrozen значение |
FreezeCore(Boolean) |
Делает экземпляр BitmapSource или производный класс постоянным. (Унаследовано от BitmapSource) |
GetAnimationBaseValue(DependencyProperty) |
Возвращает не анимированное значение указанного объекта DependencyProperty. (Унаследовано от Animatable) |
GetAsFrozen() |
Создает фиксированную копию объекта Freezable, используя базовые (не анимационные) значения свойств. Так как копия является фиксированной, копируются только ссылки на фиксированные вложенные объекты. (Унаследовано от Freezable) |
GetAsFrozenCore(Freezable) |
Делает этот экземпляр клоном указанного объекта BitmapSource. (Унаследовано от BitmapSource) |
GetCurrentValueAsFrozen() |
Создает фиксированную копию объекта Freezable с использованием текущих значений свойств. Так как копия является фиксированной, копируются только ссылки на фиксированные вложенные объекты. (Унаследовано от Freezable) |
GetCurrentValueAsFrozenCore(Freezable) |
Делает этот экземпляр зафиксированным клоном указанного объекта BitmapSource. Ссылки на ресурсы, привязки данных и анимации не копируются, но копируются их текущие значения. (Унаследовано от BitmapSource) |
GetHashCode() |
Возвращает хэш-код для данного объекта DependencyObject. (Унаследовано от DependencyObject) |
GetLocalValueEnumerator() |
Создает специализированный перечислитель для определения свойств зависимостей, которые локально установили значения для данного DependencyObject. (Унаследовано от DependencyObject) |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
GetValue(DependencyProperty) |
Возвращает текущее действующее значение свойства зависимостей в этом экземпляре DependencyObject. (Унаследовано от DependencyObject) |
InvalidateProperty(DependencyProperty) |
Повторно вычисляет действующее значение для указанного свойства зависимостей. (Унаследовано от DependencyObject) |
Lock() |
Резервирует задний буфер для обновлений. |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
OnChanged() |
Вызывается при изменении текущего объекта Freezable. (Унаследовано от Freezable) |
OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
Обеспечивает создание соответствующих указателей контекста для элемента данных типа DependencyObjectType, который был только что задан. (Унаследовано от Freezable) |
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty) |
Этот элемент поддерживает инфраструктуру Windows Presentation Foundation (WPF) и не предназначен для использования непосредственно из кода. (Унаследовано от Freezable) |
OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Переопределяет реализацию DependencyObject для OnPropertyChanged(DependencyPropertyChangedEventArgs), чтобы также вызвать любой обработчик Changed в ответ на изменение свойства зависимостей типа Freezable. (Унаследовано от Freezable) |
ReadLocalValue(DependencyProperty) |
Возвращает локальное значение свойства зависимостей, если таковое существует. (Унаследовано от DependencyObject) |
ReadPreamble() |
Обеспечивает доступ к Freezable из допустимого потока. Наследники объекта Freezable должны вызывать данный метод в начале любого API, который считывает элементы данных, не являющиеся свойствами зависимостей. (Унаследовано от Freezable) |
SetCurrentValue(DependencyProperty, Object) |
Задает значение свойства зависимостей, не меняя источник значения. (Унаследовано от DependencyObject) |
SetValue(DependencyProperty, Object) |
Задает локальное значение свойства зависимостей, указанного идентификатором этого свойства. (Унаследовано от DependencyObject) |
SetValue(DependencyPropertyKey, Object) |
Задает локальное значение свойства зависимости только для чтения, определяемое идентификатором DependencyPropertyKey свойства зависимостей. (Унаследовано от DependencyObject) |
ShouldSerializeProperty(DependencyProperty) |
Возвращает значение, которое указывает, следует ли процессам сериализации выполнять сериализацию значения для предоставленного свойства зависимостей. (Унаследовано от DependencyObject) |
ToString() |
Создает строковое представление данного объекта на базе языка и региональных параметров. (Унаследовано от ImageSource) |
ToString(IFormatProvider) |
Создает строковое представление данного объекта на основе переданного объекта IFormatProvider. Если значение поставщика равно |
TryLock(Duration) |
Пытается заблокировать растровое изображение, ожидая не больше указанного периода времени. |
Unlock() |
Освобождает задний буфер, чтобы сделать его доступным для отображения. |
VerifyAccess() |
Обеспечивает наличие у вызывающего потока доступ к этому DispatcherObject. (Унаследовано от DispatcherObject) |
WritePixels(Int32Rect, Array, Int32, Int32) |
Обновляет пиксели в заданной области растрового изображения. |
WritePixels(Int32Rect, Array, Int32, Int32, Int32) |
Обновляет пиксели в заданной области растрового изображения. |
WritePixels(Int32Rect, IntPtr, Int32, Int32) |
Обновляет пиксели в заданной области растрового изображения. |
WritePixels(Int32Rect, IntPtr, Int32, Int32, Int32, Int32) |
Обновляет пиксели в заданной области растрового изображения. |
WritePostscript() |
Вызывает событие Changed для объекта Freezable и вызывает его метод OnChanged(). Классы, производные от Freezable, должны вызывать этот метод в конце любого API, который изменяет члены класса, не сохраненные в виде свойств зависимостей. (Унаследовано от Freezable) |
WritePreamble() |
Проверяет, что объект Freezable не заморожен и доступ к нему осуществляется из допустимого контекста потока. Наследники объекта Freezable должны вызывать данный метод в начале любого API, который выполняет запись в элементах данных, не являющихся свойствами зависимостей. (Унаследовано от Freezable) |
События
Changed |
Происходит, когда изменяется класс Freezable или объект, который входит в его состав. (Унаследовано от Freezable) |
DecodeFailed |
Происходит при неудаче загрузки изображения вследствие повреждения его заголовка. (Унаследовано от BitmapSource) |
DownloadCompleted |
Происходит при полном завершении загрузки содержимого точечного рисунка. (Унаследовано от BitmapSource) |
DownloadFailed |
Происходит при невозможности загрузки содержимого точечного рисунка. (Унаследовано от BitmapSource) |
DownloadProgress |
Происходит при изменении состояния хода загрузки содержимого точечного рисунка. (Унаследовано от BitmapSource) |
Явные реализации интерфейса
IFormattable.ToString(String, IFormatProvider) |
Форматирует значение текущего экземпляра, используя указанный формат. (Унаследовано от ImageSource) |