Поделиться через


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

Получает горизонтальные точки на дюйм (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()

Делает текущий объект неизменяемым и задает для свойства значение IsFrozentrue.

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

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

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

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