Compartilhar via


WriteableBitmap Classe

Definição

Fornece um BitmapSource que pode ser gravado e atualizado.

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
Herança

Exemplos

O exemplo a seguir demonstra como um WriteableBitmap pode ser usado como a origem de um Image para desenhar pixels quando o mouse se move.

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);
        }
    }
}

Comentários

Use a WriteableBitmap classe para atualizar e renderizar um bitmap por quadro. Isso é útil para gerar conteúdo algorítmico, como uma imagem fractal e para visualização de dados, como um visualizador de música.

A WriteableBitmap classe usa dois buffers. O buffer de fundo é alocado na memória do sistema e acumula conteúdo que não é exibido no momento. O buffer frontal é alocado na memória do sistema e contém o conteúdo exibido no momento. O sistema de renderização copia o buffer frontal para a memória de vídeo para exibição.

Dois threads usam esses buffers. O thread da interface do usuário gera a interface do usuário, mas não a apresenta na tela. O thread da interface do usuário responde à entrada do usuário, temporizadores e outros eventos. Um aplicativo pode ter vários threads de interface do usuário. O thread de renderização compõe e renderiza alterações do thread da interface do usuário. Há apenas um thread de renderização por aplicativo.

O thread da interface do usuário grava conteúdo no buffer de fundo. O thread de renderização lê o conteúdo do buffer frontal e o copia para a memória de vídeo. As alterações no buffer de fundo são controladas com regiões retangulares alteradas.

Chame uma das WritePixels sobrecargas para atualizar e exibir o conteúdo no buffer de fundo automaticamente.

Para obter maior controle sobre as atualizações e para acesso multi-threaded ao buffer de fundo, use o fluxo de trabalho a seguir.

  1. Chame o Lock método para reservar o buffer de fundo para atualizações.

  2. Obtenha um ponteiro para o buffer de fundo acessando a BackBuffer propriedade .

  3. Gravar alterações no buffer de fundo. Outros threads podem gravar alterações no buffer de fundo quando o WriteableBitmap está bloqueado.

  4. Chame o AddDirtyRect método para indicar as áreas que foram alteradas.

  5. Chame o Unlock método para liberar o buffer de fundo e permitir a apresentação na tela.

Quando as atualizações são enviadas para o thread de renderização, o thread de renderização copia os retângulos alterados do buffer de fundo para o buffer frontal. O sistema de renderização controla essa troca para evitar deadlocks e redesenhar artefatos, como "rasgar".

Construtores

WriteableBitmap(BitmapSource)

Inicializa uma nova instância da classe WriteableBitmap usando a BitmapSource fornecida.

WriteableBitmap(Int32, Int32, Double, Double, PixelFormat, BitmapPalette)

Inicializa uma nova instância da classe WriteableBitmap com os parâmetros especificados.

Propriedades

BackBuffer

Obtém um ponteiro para o buffer de fundo.

BackBufferStride

Obtém um valor que indica o número de bytes em uma única linha de dados de pixel.

CanFreeze

Obtém um valor que indica se o objeto pode se tornar não modificável.

(Herdado de Freezable)
DependencyObjectType

Obtém o DependencyObjectType que encapsula o tipo CLR dessa instância.

(Herdado de DependencyObject)
Dispatcher

Obtém o Dispatcher ao qual este DispatcherObject está associado.

(Herdado de DispatcherObject)
DpiX

Obtém os pontos horizontais por polegada (dpi) da imagem.

(Herdado de BitmapSource)
DpiY

Obtém os pontos verticais por polegada (dpi) da imagem.

(Herdado de BitmapSource)
Format

Obtém o PixelFormat nativo dos dados de bitmap.

(Herdado de BitmapSource)
HasAnimatedProperties

Obtém um valor que indica se um ou mais objetos AnimationClock está associado a qualquer uma das propriedades de dependência do objeto.

(Herdado de Animatable)
Height

Obtém a altura do bitmap de origem em unidades independentes do dispositivo (1/96 polegada por unidade).

(Herdado de BitmapSource)
IsDownloading

Obtém um valor que indica se o conteúdo BitmapSource está sendo baixado no momento.

(Herdado de BitmapSource)
IsFrozen

Obtém um valor que indica se o objeto pode ser modificado no momento.

(Herdado de Freezable)
IsSealed

Obtém um valor que indica se essa instância está validada no momento (somente leitura).

(Herdado de DependencyObject)
Metadata

Obtém os metadados associados a esta imagem de bitmap.

(Herdado de BitmapSource)
Palette

Obtém a paleta de cores do bitmap, se especificada.

(Herdado de BitmapSource)
PixelHeight

Obtém a altura do bitmap em pixels.

(Herdado de BitmapSource)
PixelWidth

Obtém a largura do bitmap em pixels.

(Herdado de BitmapSource)
Width

Obtém a largura do bitmap em unidades independentes do dispositivo (1/96 polegada por unidade).

(Herdado de BitmapSource)

Métodos

AddDirtyRect(Int32Rect)

Especifica a área do bitmap que foi alterada.

ApplyAnimationClock(DependencyProperty, AnimationClock)

Aplica um AnimationClock ao DependencyProperty especificado. Se a propriedade já tiver sido animada, o comportamento de entrega de SnapshotAndReplace será usado.

(Herdado de Animatable)
ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior)

Aplica um AnimationClock ao DependencyProperty especificado. Se a propriedade já for animada, o HandoffBehavior especificado será usado.

(Herdado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline)

Aplica uma animação ao DependencyProperty especificado. A animação é iniciada quando o próximo quadro for renderizado. Se a propriedade especificada já tiver sido animada, o comportamento de entrega de SnapshotAndReplace será usado.

(Herdado de Animatable)
BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior)

Aplica uma animação ao DependencyProperty especificado. A animação é iniciada quando o próximo quadro for renderizado. Se a propriedade especifica já for animada, o HandoffBehavior especificado será usado.

(Herdado de Animatable)
CheckAccess()

Determina se o thread de chamada tem acesso a este DispatcherObject.

(Herdado de DispatcherObject)
CheckIfSiteOfOrigin()

Verifica se o conteúdo de origem de bitmap é de um site conhecido de origem. Esse método é usado para certificar-se de que essas operações de cópia de pixel são seguras.

(Herdado de BitmapSource)
ClearValue(DependencyProperty)

Limpa o valor local de uma propriedade. A propriedade a ser limpa é especificada por um identificador DependencyProperty.

(Herdado de DependencyObject)
ClearValue(DependencyPropertyKey)

Limpa o valor local de uma propriedade somente leitura. A propriedade a ser limpa é especificada por um DependencyPropertyKey.

(Herdado de DependencyObject)
Clone()

Cria um clone modificável desse WriteableBitmap, fazendo cópias em profundidade dos valores do objeto. Ao copiar as propriedades de dependência, esse método copia associações de dados e referências de recurso (mas eles não podem mais resolver), mas não animações ou seus valores atuais.

CloneCore(Freezable)

Torna essa instância uma cópia profunda do BitmapSource especificado. Ao copiar as propriedades de dependência, esse método copia associações de dados e referências de recurso (mas eles não podem mais resolver), mas não animações ou seus valores atuais.

(Herdado de BitmapSource)
CloneCurrentValue()

Cria um clone modificável desse objeto ByteAnimationUsingKeyFrames, fazendo cópias em profundidade dos valores do objeto atual. Referências a recursos, vinculações de dados e animações não são copiadas, mas seus valores atuais são.

CloneCurrentValueCore(Freezable)

Torna essa instância uma cópia em profundidade modificável do BitmapSource especificado usando os valores de propriedade atuais. Referências a recursos, vinculações de dados e animações não são copiadas, mas seus valores atuais são.

(Herdado de BitmapSource)
CoerceValue(DependencyProperty)

Converte o valor da propriedade de dependência especificada. Isso é feito invocando qualquer função CoerceValueCallback especificada nos metadados de propriedade para a propriedade de dependência, visto que ela existe na chamada a DependencyObject.

(Herdado de DependencyObject)
CopyPixels(Array, Int32, Int32)

Copia os dados de pixel de bitmap para a matriz de pixes que tem a distância especificada, começando no deslocamento especificado.

(Herdado de BitmapSource)
CopyPixels(Int32Rect, Array, Int32, Int32)

Copia os dados de pixel de bitmap no retângulo especificado em uma matriz de pixels que tem a distância especificada começando no deslocamento especificado.

(Herdado de BitmapSource)
CopyPixels(Int32Rect, IntPtr, Int32, Int32)

Copia os dados de pixel do bitmap dentro do retângulo especificado.

(Herdado de BitmapSource)
CreateInstance()

Inicializa uma nova instância da classe Freezable.

(Herdado de Freezable)
CreateInstanceCore()

Quando implementado em uma classe derivada, cria uma nova instância da classe derivada Freezable.

(Herdado de Freezable)
Equals(Object)

Determina se um DependencyObject fornecido é equivalente ao DependencyObject atual.

(Herdado de DependencyObject)
Freeze()

Torna o objeto atual não modificável e define sua propriedade IsFrozen para true.

(Herdado de Freezable)
FreezeCore(Boolean)

Torna uma instância de BitmapSource ou uma classe derivada imutável.

(Herdado de BitmapSource)
GetAnimationBaseValue(DependencyProperty)

Retorna o valor não animado do DependencyProperty especificado.

(Herdado de Animatable)
GetAsFrozen()

Cria uma cópia congelada o Freezable usando valores de propriedade base (não animadas). Já que a cópia está congelada, quaisquer subobjetos congelados são copiados por referência.

(Herdado de Freezable)
GetAsFrozenCore(Freezable)

Torna essa instância um clone do objeto BitmapSource especificado.

(Herdado de BitmapSource)
GetCurrentValueAsFrozen()

Cria uma cópia congelada do Freezable usando valores de propriedade atuais. Já que a cópia está congelada, quaisquer subobjetos congelados são copiados por referência.

(Herdado de Freezable)
GetCurrentValueAsFrozenCore(Freezable)

Torna essa instância um clone congelado do BitmapSource especificado. Referências a recursos, vinculações de dados e animações não são copiadas, mas seus valores atuais são.

(Herdado de BitmapSource)
GetHashCode()

Obtém o código hash para esse DependencyObject.

(Herdado de DependencyObject)
GetLocalValueEnumerator()

Cria um enumerador especializado para determinar quais propriedades de dependência têm valores definidos localmente nessa DependencyObject.

(Herdado de DependencyObject)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
GetValue(DependencyProperty)

Retorna o valor efetivo atual de uma propriedade de dependência nessa instância de um DependencyObject.

(Herdado de DependencyObject)
InvalidateProperty(DependencyProperty)

Reavalia o valor efetivo para a propriedade de dependência especificada.

(Herdado de DependencyObject)
Lock()

Reserva o buffer de fundo para atualizações.

MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
OnChanged()

Chamado quando o objeto Freezable atual é modificado.

(Herdado de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject)

Garante que os ponteiros de contexto apropriados sejam estabelecidos para um membro de dados DependencyObjectType que foi recém-definido.

(Herdado de Freezable)
OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty)

Esse membro dá suporte à infraestrutura de Windows Presentation Foundation (WPF) e não se destina a ser usado diretamente do seu código.

(Herdado de Freezable)
OnPropertyChanged(DependencyPropertyChangedEventArgs)

Substitui a implementação DependencyObject de OnPropertyChanged(DependencyPropertyChangedEventArgs) para também invocar quaisquer manipuladores Changed em resposta à alteração de uma propriedade de dependência do tipo Freezable.

(Herdado de Freezable)
ReadLocalValue(DependencyProperty)

Retorna o valor local de uma propriedade de dependência, local, se houver.

(Herdado de DependencyObject)
ReadPreamble()

Garante que o Freezable esteja sendo acessado de um thread válido. Herdeiros do Freezable devem chamar esse método no início de qualquer API que lê membros de dados que não são propriedades de dependência.

(Herdado de Freezable)
SetCurrentValue(DependencyProperty, Object)

Define o valor da propriedade de dependência sem alterar a origem do valor.

(Herdado de DependencyObject)
SetValue(DependencyProperty, Object)

Define o valor local de uma propriedade de dependência, especificada pelo identificador da propriedade de dependência.

(Herdado de DependencyObject)
SetValue(DependencyPropertyKey, Object)

Define o valor de uma propriedade de dependência somente leitura, especificada pelo identificador DependencyPropertyKey da propriedade de dependência.

(Herdado de DependencyObject)
ShouldSerializeProperty(DependencyProperty)

Retorna um valor que indica se os processos de serialização devem serializar o valor da propriedade de dependência fornecida.

(Herdado de DependencyObject)
ToString()

Cria uma representação de cadeia de caracteres desse objeto com base na cultura atual.

(Herdado de ImageSource)
ToString(IFormatProvider)

Cria uma representação de cadeia de caracteres desse objeto com base na IFormatProvider passada. Se o provedor for null, o CurrentCulture será usado.

(Herdado de ImageSource)
TryLock(Duration)

Tenta bloquear o bitmap, aguardando não mais do que o tempo especificado.

Unlock()

Libera o buffer de fundo para torná-lo disponível para exibição.

VerifyAccess()

Impõe que o thread de chamada tenha acesso a este DispatcherObject.

(Herdado de DispatcherObject)
WritePixels(Int32Rect, Array, Int32, Int32)

Atualiza os pixels na região especificada do bitmap.

WritePixels(Int32Rect, Array, Int32, Int32, Int32)

Atualiza os pixels na região especificada do bitmap.

WritePixels(Int32Rect, IntPtr, Int32, Int32)

Atualiza os pixels na região especificada do bitmap.

WritePixels(Int32Rect, IntPtr, Int32, Int32, Int32, Int32)

Atualiza os pixels na região especificada do bitmap.

WritePostscript()

Aciona o evento Changed para o Freezable e invoca o respectivo método OnChanged(). Classes que derivam de Freezable devem chamar este método no final de qualquer API que modifica os membros de classe que não são armazenados como propriedades de dependência.

(Herdado de Freezable)
WritePreamble()

Verifica se o Freezable não está congelado e está sendo acessado de um contexto de threading válido. Herdeiros do Freezable devem chamar esse método no início de qualquer API que grava em membros de dados que não são propriedades de dependência.

(Herdado de Freezable)

Eventos

Changed

Ocorre quando o Freezable ou um objeto nele contido é modificado.

(Herdado de Freezable)
DecodeFailed

Ocorre há uma falha de carregamento da imagem devido a um cabeçalho da imagem corrompido.

(Herdado de BitmapSource)
DownloadCompleted

Ocorre após o download completo do conteúdo do bitmap.

(Herdado de BitmapSource)
DownloadFailed

Ocorre quando há falha no download do conteúdo do bitmap.

(Herdado de BitmapSource)
DownloadProgress

Ocorre quando há alteração no andamento do download do conteúdo do bitmap.

(Herdado de BitmapSource)

Implantações explícitas de interface

IFormattable.ToString(String, IFormatProvider)

Formata o valor da instância atual usando o formato especificado.

(Herdado de ImageSource)

Aplica-se a

Confira também