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 |
Получает горизонтальные точки на дюйм (dpi) изображения. (Унаследовано от 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, HandoffBehavior) |
Применяется к указанному объекту AnimationClockDependencyProperty. Если свойство уже анимировано, используется указанный HandoffBehavior параметр. (Унаследовано от Animatable) |
| ApplyAnimationClock(DependencyProperty, AnimationClock) |
Применяется к указанному объекту AnimationClockDependencyProperty. Если свойство уже анимировано, SnapshotAndReplace используется поведение передачи. (Унаследовано от Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
Применяет анимацию к указанному DependencyProperty. Анимация запускается при отрисовки следующего кадра. Если указанное свойство уже анимировано, используется указанный HandoffBehavior параметр. (Унаследовано от Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline) |
Применяет анимацию к указанному DependencyProperty. Анимация запускается при отрисовки следующего кадра. Если указанное свойство уже анимировано, SnapshotAndReplace используется поведение передачи. (Унаследовано от 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, DependencyProperty) |
Этот член поддерживает инфраструктуру Windows Presentation Foundation (WPF) и не предназначен для использования непосредственно из кода. (Унаследовано от Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
Убедитесь, что для элемента данных, который только что был установлен, установлены DependencyObjectType соответствующие указатели контекста. (Унаследовано от 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, Int32) |
Обновляет пиксели в указанной области растрового изображения. |
| WritePixels(Int32Rect, Array, Int32, Int32) |
Обновляет пиксели в указанной области растрового изображения. |
| WritePixels(Int32Rect, IntPtr, Int32, Int32, Int32, Int32) |
Обновляет пиксели в указанной области растрового изображения. |
| WritePixels(Int32Rect, IntPtr, 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) |