XAML PT
COMUNIDADE PORTUGUESA DE TECNOLOGIAS
DE APRESENTAÇÃO DA MICROSOFT: SILVERLIGHT, WPF E SURFACE.
Simples utilização de WritableBitmap

 

O Silverlight 3 introduziu o WritableBitmap que nos permite manipular os pixels directamente.

Eis um pequeno exemplo de utilização. Neste exemplo simula-se a chuva de uma televisão quando não tem emissão. Para o efeito preenche-se cada pixel da imagem com uma cor aleatória. A imagem está constantemente a ser redesenhada de modo a dar a noção da “chuva”.

 

        private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {

            Screen.Width = ScreenWidth;
            Screen.Height = ScreenHeight;

            //Criaco do object writablebitmap com o tamanho indicado.
            bitmap = new WriteableBitmap(ScreenWidth, ScreenHeight);
            //Indicao de qual o elemento que ira fazer a visualizao do writable bitmap.
            Screen.Source = bitmap;

            //registar o evento para fazer o render regular
            CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
        }

 

Após esta inicialização e na entrada em cada frame redesenha-se a “chuva” ao nível do pixel:

        
        void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            var index = MaxScreen;

            //Pintar cada pixel
            while (--index > -1)
            {
                //cor aleatoria para cada pixel
                var color = System.Convert.ToInt32(rnd.Next(0xffffff));
                bitmap.Pixels[index] = color > 0xffffff ? 0xffffff : color;
            }

            //força o bitmap a redesenhar
            bitmap.Invalidate();
        }

 

Utilizando o seguinte xaml com uma imagem de uma TV para dar enquadramento:

    <Grid x:Name="LayoutRoot" Background="#FFFFFFFF">
        <Image x:Name="tv" Source="tv.jpg" Margin="68,29.807,72,53.193" d:LayoutOverrides="Width, Height"/>
        <Image x:Name="Screen" OpacityMask="{x:Null}" Margin="99,57,100,0" Opacity="1" VerticalAlignment="Top" Height="216" Width="390"/>
    </Grid>

O resultado é:

WritableBitmapChuva

 

Fazer download do código fonte desta aplicação.

Ver Demo

Se agora brincarmos com a chuva através da posição do rato, conseguimos criar a noção de interferências feitas pelo rato. Para isso é preciso, para além do código abaixo, adicionar o evento para apanhar o movimento do rato, criar uma variável que contem a última posição do rato e actualiza-la cada vez que o rato mexe.

 

        //Repaint the screen regularly
        void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            var index = MaxScreen;

            //Paint each bitmap pixel.
            while (--index > -1)
            {
                if (index % (mouseLastPos.X/2 + mouseLastPos.Y/2)+rnd.Next(20) < 15)
                    bitmap.Pixels[index] = 0xffffff;
                    //bitmap.Pixels[index] = Convert.ToInt32(mouseLastPos.X * mouseLastPos.Y+5000);
                else
                {
                    //Random color for each pixel.
                    var color = System.Convert.ToInt32(rnd.Next(0xffffff));
                    bitmap.Pixels[index] = color > 0xffffff ? 0xffffff : color;
                }
            }
            
            //force bitmap repaint
            bitmap.Invalidate();
        }

 

Ver resultado


Posted 08-18-2009 10:38 by Tiago Andrade e Silva
Filed under:

Comments

Rui Santos wrote re: Simples utilização de WritableBitmap
on 08-26-2009 13:33

Muito bom Tiago,

Aproveito também para deixar um link de outro exemplo de  WritableBitmap

kodierer.blogspot.com/.../ye-olde-pixels-silverlight-3-old-movie.html

Gonçalo Chaves wrote re: Simples utilização de WritableBitmap
on 09-01-2009 9:02

Muito bom :)

Só falta mesmo o belo do Som super elucidativo que estamos habituados a ouvir :P

Tiago Andrade e Silva wrote BitmapEffects com WritableBitmap
on 09-09-2009 10:14

Na sequência deste post , eis mais um conjunto de efeitos visuais aplicados a uma imagem. Os efeitos

Patrocinado por FULLSIX
A comunidade agradece ao Tiago Pascoal pela disponibilização da licença do community Server :)