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 можно использовать в качестве источника для рисования пикселей 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 обновления и отображения содержимого в заднем буфере.

Для большего контроля над обновлениями и многопотокового доступа к заднему буферу используйте следующий рабочий процесс.

  1. Вызовите метод , чтобы зарезервировать Lock задний буфер для обновлений.

  2. Получите указатель на задний буфер, перейдя к свойству BackBuffer .

  3. Запись изменений в задний буфер. Другие потоки могут записывать изменения в задний буфер, когда WriteableBitmap заблокирован.

  4. Вызовите метод , AddDirtyRect чтобы указать области, которые изменились.

  5. Вызовите метод , 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 значение true.

(Унаследовано от Freezable)
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. Если значение поставщика равно null, используется CurrentCulture.

(Унаследовано от ImageSource)
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)

Применяется к

См. также раздел