WriteableBitmap Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Fornece um BitmapSource que pode ser escrito 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
-
WriteableBitmap
Exemplos
O exemplo seguinte demonstra como a WriteableBitmap pode ser usado como fonte de an Image para desenhar píxeis quando o rato 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);
}
}
}
Observações
Use a WriteableBitmap classe para atualizar e renderizar um bitmap por frame. Isto é útil para gerar conteúdo algorítmico, como uma imagem fractal, e para visualização de dados, como um visualizador musical.
A WriteableBitmap classe utiliza dois buffers. O back buffer é alocado na memória do sistema e acumula conteúdo que não está atualmente exibido. O buffer frontal é alocado na memória do sistema e contém o conteúdo atualmente exibido. O sistema de renderização copia o buffer frontal para a memória de vídeo para exibição.
Dois fios usam estes buffers. O tópico da interface do utilizador (UI) gera a interface mas não a apresenta ao ecrã. O tópico da interface responde a entradas do utilizador, temporizadores e outros eventos. Uma aplicação pode ter múltiplos threads de interface. O thread de renderização compõe e renderiza as alterações do thread da interface. Existe apenas um thread de renderização por aplicação.
O tópico da interface escreve conteúdo no buffer de trás. O thread de renderização lê o conteúdo do buffer frontal e copia-o para a memória de vídeo. As alterações ao buffer de trás são acompanhadas com regiões retangulares alteradas.
Chama uma das WritePixels sobrecargas para atualizar e mostrar automaticamente o conteúdo no backbuffer.
Para maior controlo sobre as atualizações e para acesso multithread ao back buffer, utilize o seguinte fluxo de trabalho.
Chama o Lock método para reservar o back buffer para atualizações.
Obtenha um ponteiro para o back buffer ao aceder à BackBuffer propriedade.
Escreve alterações no back buffer. Outras threads podem escrever alterações no back buffer quando este WriteableBitmap está bloqueado.
Ligue ao AddDirtyRect método para indicar áreas que mudaram.
Chama o Unlock método para libertar o back buffer e permitir a apresentação no ecrã.
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 traseiro para o buffer frontal. O sistema de renderização controla esta troca para evitar bloqueios e artefactos de redesenho, como o "rasgamento".
Construtores
| Name | Description |
|---|---|
| WriteableBitmap(BitmapSource) |
Inicializa uma nova instância da WriteableBitmap classe usando o dado BitmapSource. |
| WriteableBitmap(Int32, Int32, Double, Double, PixelFormat, BitmapPalette) |
Inicializa uma nova instância da WriteableBitmap classe com os parâmetros especificados. |
Propriedades
| Name | Description |
|---|---|
| BackBuffer |
Recebe um ponteiro para o buffer de trás. |
| BackBufferStride |
Recebe um valor que indica o número de bytes numa única linha de dados de pixels. |
| CanFreeze |
Obtém um valor que indica se o objeto pode ser tornado inmodificável. (Herdado de Freezable) |
| DependencyObjectType |
Obtém o DependencyObjectType que envolve o tipo CLR desta instância. (Herdado de DependencyObject) |
| Dispatcher |
Percebe o Dispatcher que isto 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 os dados nativos PixelFormat do bitmap. (Herdado de BitmapSource) |
| HasAnimatedProperties |
Obtém um valor que indica se um ou mais AnimationClock objetos estão associados a alguma das propriedades de dependência deste objeto. (Herdado de Animatable) |
| Height |
Obtém a altura do bitmap de origem em unidades independentes do dispositivo (1/96 de polegada por unidade). (Herdado de BitmapSource) |
| IsDownloading |
Recebe um valor que indica se o BitmapSource conteúdo está a ser descarregado no momento. (Herdado de BitmapSource) |
| IsFrozen |
Recebe um valor que indica se o objeto é atualmente modificável. (Herdado de Freezable) |
| IsSealed |
Recebe um valor que indica se esta instância está atualmente selada (apenas leitura). (Herdado de DependencyObject) |
| Metadata |
Obtém os metadados associados a esta imagem bitmap. (Herdado de BitmapSource) |
| Palette |
Obtém a paleta de cores do bitmap, se for 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 de polegada por unidade). (Herdado de BitmapSource) |
Métodos
| Name | Description |
|---|---|
| AddDirtyRect(Int32Rect) |
Especifica a área do bitmap que mudou. |
| ApplyAnimationClock(DependencyProperty, AnimationClock, HandoffBehavior) |
Aplica-se a AnimationClock um ao especificado DependencyProperty. Se a propriedade já estiver animada, utiliza-se a especificada HandoffBehavior . (Herdado de Animatable) |
| ApplyAnimationClock(DependencyProperty, AnimationClock) |
Aplica-se a AnimationClock um ao especificado DependencyProperty. Se a propriedade já estiver animada, utiliza-se o SnapshotAndReplace comportamento de handoff. (Herdado de Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline, HandoffBehavior) |
Aplica uma animação ao especificado DependencyProperty. A animação é iniciada quando o frame seguinte é renderizado. Se a propriedade especificada já estiver animada, é usada a especificada HandoffBehavior . (Herdado de Animatable) |
| BeginAnimation(DependencyProperty, AnimationTimeline) |
Aplica uma animação ao especificado DependencyProperty. A animação é iniciada quando o frame seguinte é renderizado. Se a propriedade especificada já estiver animada, utiliza-se o SnapshotAndReplace comportamento de handoff. (Herdado de Animatable) |
| CheckAccess() |
Determina se o thread que chama tem acesso a este DispatcherObject. (Herdado de DispatcherObject) |
| CheckIfSiteOfOrigin() |
Verifica se o conteúdo de origem do bitmap é de um local de origem conhecido. Este método é utilizado para garantir que as operações de cópia de píxeis são seguras. (Herdado de BitmapSource) |
| ClearValue(DependencyProperty) |
Limpa o valor local de uma propriedade. A propriedade a ser limpa é especificada por um DependencyProperty identificador. (Herdado de DependencyObject) |
| ClearValue(DependencyPropertyKey) |
Limpa o valor local de uma propriedade de apenas leitura. O imóvel a ser limpo é especificado por um DependencyPropertyKey. (Herdado de DependencyObject) |
| Clone() |
Cria um clone modificável deste WriteableBitmap, fazendo cópias profundas dos valores deste objeto. Ao copiar propriedades de dependência, este método copia referências de recursos e ligações de dados (mas podem deixar de se resolver), mas não as animações nem os seus valores atuais. |
| CloneCore(Freezable) |
Faz desta instância uma cópia profunda do especificado BitmapSource. Ao copiar propriedades de dependência, este método copia referências de recursos e ligações de dados (mas podem deixar de se resolver), mas não as animações nem os seus valores atuais. (Herdado de BitmapSource) |
| CloneCurrentValue() |
Cria um clone modificável deste ByteAnimationUsingKeyFrames objeto, fazendo cópias profundas dos valores atuais desse objeto. Referências de recursos, ligações de dados e animações não são copiadas, mas os seus valores atuais são. |
| CloneCurrentValueCore(Freezable) |
Faz desta instância uma cópia profunda modificável do especificado BitmapSource usando valores atuais da propriedade. Referências de recursos, ligações de dados e animações não são copiadas, mas os seus valores atuais são. (Herdado de BitmapSource) |
| CoerceValue(DependencyProperty) |
Coage o valor da propriedade de dependência especificada. Isto é conseguido invocando qualquer CoerceValueCallback função especificada nos metadados da propriedade para a propriedade de dependência tal como existe na chamada DependencyObject. (Herdado de DependencyObject) |
| CopyPixels(Array, Int32, Int32) |
Copia os dados do pixel bitmap para um array de píxeis com o passo especificado, começando no deslocamento especificado. (Herdado de BitmapSource) |
| CopyPixels(Int32Rect, Array, Int32, Int32) |
Copia os dados do pixel bitmap dentro do retângulo especificado numa matriz de píxeis que tem o passo especificado a partir do deslocamento especificado. (Herdado de BitmapSource) |
| CopyPixels(Int32Rect, IntPtr, Int32, Int32) |
Copia os dados do pixel bitmap dentro do retângulo especificado. (Herdado de BitmapSource) |
| CreateInstance() |
Inicializa uma nova instância da Freezable classe. (Herdado de Freezable) |
| CreateInstanceCore() |
Quando implementado numa classe derivada, cria-se uma nova instância da Freezable classe derivada. (Herdado de Freezable) |
| Equals(Object) |
Determina se um fornecido DependencyObject é equivalente à corrente DependencyObject. (Herdado de DependencyObject) |
| Freeze() |
Torna o objeto atual immodificável e define a sua IsFrozen propriedade como |
| FreezeCore(Boolean) |
Torna uma instância de BitmapSource ou uma classe derivada imutável. (Herdado de BitmapSource) |
| GetAnimationBaseValue(DependencyProperty) |
Devolve o valor não animado do especificado DependencyProperty. (Herdado de Animatable) |
| GetAsFrozen() |
Cria uma cópia congelada do Freezable, usando valores base (não animados) da propriedade. Como a cópia está congelada, quaisquer subobjetos congelados são copiados por referência. (Herdado de Freezable) |
| GetAsFrozenCore(Freezable) |
Faz desta instância um clone do objeto especificado BitmapSource . (Herdado de BitmapSource) |
| GetCurrentValueAsFrozen() |
Cria uma cópia congelada do Freezable usando os valores atuais das propriedades. Como a cópia está congelada, quaisquer subobjetos congelados são copiados por referência. (Herdado de Freezable) |
| GetCurrentValueAsFrozenCore(Freezable) |
Faz desta instância um clone congelado do especificado BitmapSource. Referências de recursos, ligações de dados e animações não são copiadas, mas os seus valores atuais são. (Herdado de BitmapSource) |
| GetHashCode() |
Obtém um código de hash para isto DependencyObject. (Herdado de DependencyObject) |
| GetLocalValueEnumerator() |
Cria um enumerador especializado para determinar quais as propriedades de dependência que têm valores localmente definidos neste DependencyObject. (Herdado de DependencyObject) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| GetValue(DependencyProperty) |
Devolve o valor efetivo atual de uma propriedade de dependência nesta instância de um DependencyObject. (Herdado de DependencyObject) |
| InvalidateProperty(DependencyProperty) |
Reavalia o valor efetivo da propriedade de dependência especificada. (Herdado de DependencyObject) |
| Lock() |
Reserva o backbuffer para atualizações. |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| OnChanged() |
Chamada quando o objeto atual Freezable é modificado. (Herdado de Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject, DependencyProperty) |
Este membro suporta a infraestrutura Windows Presentation Foundation (WPF) e não foi concebido para ser usado diretamente a partir do seu código. (Herdado de Freezable) |
| OnFreezablePropertyChanged(DependencyObject, DependencyObject) |
Assegura que os apontadores de contexto apropriados são estabelecidos para um DependencyObjectType membro de dados que acabou de ser definido. (Herdado de Freezable) |
| OnPropertyChanged(DependencyPropertyChangedEventArgs) |
Sobrepõe a DependencyObject implementação de OnPropertyChanged(DependencyPropertyChangedEventArgs) para também invocar quaisquer Changed manipuladores em resposta a uma alteração da propriedade de dependência do tipo Freezable. (Herdado de Freezable) |
| ReadLocalValue(DependencyProperty) |
Devolve o valor local de uma propriedade de dependência, se esta existir. (Herdado de DependencyObject) |
| ReadPreamble() |
Garante que está a ser acedido Freezable a partir de um thread válido. Os herdeiros de Freezable devem chamar este método no início de qualquer API que leia membros de dados que não são propriedades de dependência. (Herdado de Freezable) |
| SetCurrentValue(DependencyProperty, Object) |
Define o valor de uma propriedade de dependência sem alterar a sua fonte de valor. (Herdado de DependencyObject) |
| SetValue(DependencyProperty, Object) |
Define o valor local de uma propriedade de dependência, especificado pelo seu identificador de propriedade de dependência. (Herdado de DependencyObject) |
| SetValue(DependencyPropertyKey, Object) |
Define o valor local de uma propriedade de dependência somente de leitura, especificado pelo DependencyPropertyKey identificador da propriedade de dependência. (Herdado de DependencyObject) |
| ShouldSerializeProperty(DependencyProperty) |
Devolve 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 em cadeia deste objeto com base na cultura atual. (Herdado de ImageSource) |
| ToString(IFormatProvider) |
Cria uma representação string deste objeto com base no IFormatProvider passed in. Se o fornecedor for |
| TryLock(Duration) |
Tenta bloquear o bitmap, esperando por não mais tempo do que o tempo especificado. |
| Unlock() |
Liberta o buffer traseiro para o tornar disponível para exibição. |
| VerifyAccess() |
Faz cumprir que o thread que chama tem acesso a este DispatcherObject. (Herdado de DispatcherObject) |
| WritePixels(Int32Rect, Array, Int32, Int32, Int32) |
Atualiza os píxeis na região especificada do bitmap. |
| WritePixels(Int32Rect, Array, Int32, Int32) |
Atualiza os píxeis na região especificada do bitmap. |
| WritePixels(Int32Rect, IntPtr, Int32, Int32, Int32, Int32) |
Atualiza os píxeis na região especificada do bitmap. |
| WritePixels(Int32Rect, IntPtr, Int32, Int32) |
Atualiza os píxeis na região especificada do bitmap. |
| WritePostscript() |
Eleva o Changed evento para o Freezable e invoca o seu OnChanged() método. As classes que derivam de Freezable devem chamar este método no final de qualquer API que modifique membros de classe que não estejam armazenados como propriedades de dependência. (Herdado de Freezable) |
| WritePreamble() |
Verifica se o Freezable não está congelado e que está a ser acedido a partir de um contexto de threading válido. Freezable os herdeiros devem chamar este método no início de qualquer API que escreva para membros de dados que não sejam propriedades de dependência. (Herdado de Freezable) |
evento
| Name | Description |
|---|---|
| Changed |
Ocorre quando o Freezable ou um objeto que contém é modificado. (Herdado de Freezable) |
| DecodeFailed |
Ocorre quando a imagem não carrega, devido a um cabeçalho de imagem corrompido. (Herdado de BitmapSource) |
| DownloadCompleted |
Ocorre quando o conteúdo bitmap foi completamente descarregado. (Herdado de BitmapSource) |
| DownloadFailed |
Ocorre quando o conteúdo bitmap não foi descarregado. (Herdado de BitmapSource) |
| DownloadProgress |
Ocorre quando o progresso de download do conteúdo bitmap mudou. (Herdado de BitmapSource) |
Implementações de Interface Explícita
| Name | Description |
|---|---|
| IFormattable.ToString(String, IFormatProvider) |
Formata o valor da instância atual usando o formato especificado. (Herdado de ImageSource) |