Silverlight 4 Dica do dia #4 – Capturando as imagens da Webcam

By rdorta at junho 18, 2010 13:54
Filed Under: Arquitetura, Silverlight
&g

Olá,

Hoje vou mostrar para vocês como capturar as imagens camera do usuário no Silverlight.

Primeiro vamos ao XAML:

   1: <UserControl x:Class="SLWebCam.MainPage"
   2:     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   5:     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   6:     mc:Ignorable="d"
   7:     d:DesignHeight="550"t; d:DesignWidth="700"
-CRLF-->
   8:     Loaded="UserControl_Loaded">
   9:  
  10:     <Grid x:Name="LayoutRoot" Background="White">
  11:         <StackPanel>
  12:             <Grid Width="640" Height="480">
  13:                 <Rectangle Name="Viewport" Stroke="Black" StrokeThickness="2" />
  14:             </Grid>
  15:             <Button Content="IniciarCaptura" HorizontalAlignment="Center" Click="Button_Click" />
  16:         </StackPanel>
  17:     </Grid>
  18: </UserControl>

 

Notem que temos neste XAML apenas 2 controles, 1 Rectangle, que servirá de ViewPort para a câmera ou seja, onde será exibida a imagem da camera e um obtão que irá disparar o início da captura.

Agora vamos ao código:

   1: using System.Windows;
   2: using System.Windows.Controls;
   3: using System.Windows.Media;
   4:  
   5: namespace SLWebCam
   6: {
   7:     public partial class MainPage : UserControl
   8:     {
   9:         CaptureSource cpsVideo;
  10:  
  11:         public MainPage()
  12:         {
  13:             InitializeComponent();
  14:         }
  15:  
  16:         private void UserControl_Loaded(object sender, RoutedEventArgs e)
  17:         {
  18:             // Instancia o objeto que manipula a WebCam
  19:             cpsVideo = new CaptureSource();
  20:             // Define qual webcam será o alvo do objeto, no caso a câmera padrão do Sistema
  21:             cpsVideo.VideoCaptureDevice = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();
  22:  
  23:             //Cria o objeto que recebe os dados do video
  24:             VideoBrush vbsVideo = new VideoBrush();
  25:             vbsVideo.SetSource(cpsVideo);
  26:             // Preenche o retangulo com os dados capturados do video
  27:             Viewport.Fill = vbsVideo;
  28:         }
  29:  
  30:         private void Button_Click(object sender, RoutedEventArgs e)
  31:         {
  32:             // Efetua a requisição de acesso a WebCam
  33:             if (CaptureDeviceConfiguration.RequestDeviceAccess())
  34:             {
  35:                 cpsVideo.Start();
  36:             }
  37:         }
  38:     }
  39: }

Os grandes objetos que fazem a mágica são o CaptureSource, CaptureDeviceConfiguration e o VideoBrush.

Primeiro, instanciamos o CaptureSource e definimos qual camera ele irá utilizar atraves do CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice().

Depois criamos o VideoBrush e informamos a ele que sua fonte de imagens é o recém-criado CaptureSource.

Definimos que a saída do VideoBrush será o retangulo que criamos no XAML.

Pedimos a permissão do usuário para usar a câmera e pronto!!!

Muito easy esse tal de Silverlight.

Grande novidade do PDC - Silverlight 4

By rdorta at novembro 19, 2009 13:59
Filed Under: Arquitetura, Silverlight

Olá amigos,

Mais uma vez a Microsoft se supera no PDC 2009. Quem quiser um acompanhamento técnico legal do PDC 2009, sugiro o blog do Waldemir Cambiucci (ver no meu blogroll).

Agora falando sobre o que mais me interessa, Silverlight 4 vem aí e com features que eu sempre dizia que faltavam ao Silvelright quando comparado ao Flash. Ou seja… Flash Down…

Vamos direto ao link e depois vou comentar

http://silverlight.net/getstarted/silverlight-4-beta/

Primeiro ponto legal, a utilização do Visual Studio 2010.

Vamos aos Tools:

Silverlight 4 Beta Tools for Visual Studio 2010

Segundo ponto legal:

Blend for .Net 4

http://www.microsoft.com/downloads/details.aspx?FamilyID=6806e466-dd25-482b-a9b3-3f93d2599699&displaylang=en

A Documentação:

Online Silverlight 4 Beta Documentation

E agora minha visão sobre as novas features:

  • Impressão direta do Silverlight – YES WE CAN!!! muito bom!!!
  • Inclusão de um RichTextbox para exibição de HTML – Outra feature que fazia falta… Muito bom
  • DataGrid com Sort e Resize e Copy e Paste de linhas.
  • RIA Services
  • Melhorias no sistema de Out-of Browser.
  • Integração com periféricos: leitor de códigos de barra, webcam e outros..

Vou realziar alguns testes com a ferramenta em breve e posto mais comentários´

Até a próxima arqinovação.

Arquitetura de Aplicações Silverlight

By rdorta at setembro 17, 2009 11:05
Filed Under: Silverlight, Arquitetura

Ultimamente tenho visto diversas discussões sobre como criar aplicações Silverlight e como adequar essa tecnologias em algum design pattern comum no mercado como MVC, MVP, MVVM.

Vou tentar ilustrar nesse post como eu imagino uma aplicação Silverlight do ponto de vista de um arquiteto de software.

Web ou Client-side

Uma das coisas mais legais de Silverlight, é que apesar de ser uma tecnologia Web, ela roda em cima de um plugin que é instalado no computador do Cliente, portanto eu considero o paradigma de desenvolvimento Silverlight muito pais parecido com o desenvolvimento de aplicações Desktop do que com  o desenvolvimento de aplicações Web.

Sempre que criamos uma aplicação Silverlight no VS 2008 o próprio VS já se propõe a criar uma aplicação Web para que você possa testar sua aplicação.

Isso está mais do que correto, você pode estruturar seu desenvolvimento em dois lados:

image

Você deve sempre pensar que o seu Client de Silverlight é REALMENTE uma aplicação Client, portanto, você pode desenvolver utilizando qualquer pattern interessante ao momento, como Singleton, Abstract Factory e Observer(esse muito recomendado).

Já seu lado Server-Side, ou seja sua aplicação Web, você também pode estruturar utilizando as melhores práticas voltadas para web, como a criação de serviços ou handlers.

Nos meus próximos posts vou tentar abordar como utilizar as melhores práticas de arquitetura com o Silverlight e em quais cenários eles se aplicam.

Até a próxima Arqinovação!!!

Silverlight + Deep Zoom = RIA Experiences Parte 2 – Deep Zoom Dinamico – YES WE CAN

By rdorta at setembro 14, 2009 12:11
Filed Under: Silverlight

No meu post anterior, Silverlight + DeepZoom = RIA Experiences Parte 1 - Utilizando o Deep Zoom Composer, mostrei como podemos criar experiências simples com o Deep Zoom Composer.

Uma das grandes reclamações que eu costumo ouvir sobre o deep zoom é que não conseguimos criar experiências onde os dados sejam dinamicos, e a obrigatoriedade de utilizar o Deep Zoom Composer.

Esse meu post é dedicado a acabar com essa “crença”. Deep Zoom dinamico? YES WE CAN!!!

Criando o projeto

Para começar vamos precisar das seguintes ferramentas:

Siverlight 2 + Tools (também funciona com o 3, só estou usando o 2 porque estou finalizando um projeto que começou com ele)

Um pouco de conhecimento sobre imagens e tratamento de imagens com C# (google it!!!)

Deep Zoom Composer ( Leitor diz: nããããããõ!!!!…. Dorta diz: Calma!! é só pra pegar uma dll!!!!)

DeepZoomTools.dll

Bom, pra começar, vamos falar dessa dll. Você não vai achar praticamente nenhuma documentação sobre essa dll.

Ela foi criada pela própria equipe do Expression e foi divulgada nesse post do blog deles. Essa dll foi divulgada para que os desenvolvedores pudessem simular o funcionamento do Deep Zoom Composer em suas aplicações.

Abaixo segue os objetos que vamos utilizar e sua função:

ImageCreator: É o objeto de imagem utilizado pelo Deep Zoom.
CollectionCreator: Objeto responsável por criar aquelas diversas imagens para cada nível de zoom do nosso Deep Zoom

O que eu preciso saber de Deep Zoom?

Você deve ter conhecimento de como o Deep Zoom Composer trabalha, sugiro seguir meu post anterior Silverlight + DeepZoom = RIA Experiences Parte 1 - Utilizando o Deep Zoom Composer e criar algumas aplicações estáticas para entender alguns conceitos como:

Ao criar uma composição de Deep Zoom, são gerados inúmeros arquivos, com imagens e xmls que definem o comportamento de zoom da composição. (Pasta GeneratedImages)

Os xmls que são gerados definem os caminhos das imagens que serão utilizadas a cada nível de zoom

Vamos ao que interessa.

Crie um projeto do tipo Silverlight Application no VS 2008 e Peça para que seja criada uma aplicação WEB de testes. (Arquitetura em Siverlight vai dar um excelente post em breve).

image

Adiciona a sua pasta ClientBin do projeto WEB uma pasta chamada Generated Images

Adicione ao seu projeto WEB uma referencia a dll do DeepZoomTools : [Program Files]\Microsoft Expression\Deep Zoom Composer\DeepZoomTools.dll

O serviço que cria as imagens e xmls

Adicione ao seu projeto web, na pasta ClientBin, um Generic Handler, vamos chama-lo de ImageHandler:

image

 

Nosso serviço, vai ler as imagens de uma pasta (poderia ler qualquer imagem) e utiliza-las para montar um composição deep zoom.

O código que utilizei para buscar as imagens é bem simples:

private static List<string> ObterImagensDiretorio(DirectoryInfo pdiInformacaoDiretorio)
        {
            List<string> lstImagens = new List<string>();
            foreach (var finInformacaoImagem in pdiInformacaoDiretorio.GetFiles("*.jpg"))
            {
                lstImagens.Add(finInformacaoImagem.FullName);
            }
            return lstImagens;
        }

Agora no método ProcessRequest do nosso serviço, vamos inicializar as nossas variáveis:

1)Caminho para onde serão enviadas as imagens e XMLs

string strCaminhoImagensGeradas = context.Server.MapPath("~/ClientBin/GeneratedImages/");

2) Imagens que serão utilizadas no DeepZoom

           List<string> lstImagens = ObterImagensDiretorio(new DirectoryInfo(context.Server.MapPath("~/Imagem/")));

3) Lista de XMLs que serão gerados

          List<string> lstXMLs = new List<string>();

Por fim, mas não menos importante, criamos os objetos de imagem do Deep Zoom e a coleção:

O objeto ImageCreator e o objeto CollectionCreator possuem propriedades muito parecidas entre as quais podemos destacar:

TileSize – O tamanho que cada “tira” da composição deve assumir
TileFormat – O formato de arquivo de  cada “tira” (PNG, JPG, etc…)
ImageQuality – Como qualquer bom editor de imagem, você pode editar qual a qualidade de exportação da imagem, sendo 1 = 100%.

Ambos os objetos também possuem o método create:

ImageCreator.Create([Caminho original da imagem], [Caminho onde a imagem deve ser criada]);  - Cria as imagens e xmls referentes as imagens
ColectionCreator.Create([Lista dos caminhos dos xmls que contém as informações das imagens], [Caminho onde ele deve gerar a coleção completa]); Cria a estrutura completa de XML e imagens da composição

Segue o código abaixo:

foreach (string strImagem in lstImagens)
            {

                ImageCreator ic = new ImageCreator();

                ic.TileSize = 256;

                ic.TileFormat = ImageFormat.Jpg;

                ic.ImageQuality = 1;

                string target = strCaminhoImagensGeradas + "output_images\\" + Path.GetFileNameWithoutExtension(strImagem);

                ic.Create(strImagem, target);

                lstXMLs.Add(Path.ChangeExtension(target, ".xml"));

            }

            cc.TileSize = 256;

            cc.TileFormat = ImageFormat.Jpg;

            cc.MaxLevel = 8;

            cc.ImageQuality = 1;

            cc.Create(lstXMLs, strCaminhoImagensGeradas + "output");

WELL DONE!!! NOSSO SERVIÇO ESTA PRONTO!!! Agora vamos ao Silverlight:

DE VOLTA AO SILVERLIGHT

Agora vamos criar o DeepZoom utilizando o MultiScaleImage, no Silverlight.

Dentro dos seu LayoutRoot na sua Page.xaml crie os seguintes componentes:

<MultiScaleImage x:Name="msi" Height="Auto" Width="589"/>
        <Button Content="Embaralhar" HorizontalAlignment="Center" VerticalAlignment="Top" Click="Button_Click"/>

E agora no código Page.xaml.cs no método construtor, vamos invocar nosso serviço de geração de imagens:

WebClient wbc = new WebClient();
            wbc.OpenReadAsync(new Uri(“
http://localhost:3585/ClientBin/ImageHandler.ashx”));
            wbc.OpenReadCompleted += new OpenReadCompletedEventHandler(wbc_OpenReadCompleted);

E ao terminar o serviço vamos popular o nosso MultiScaleImage:

this.msi.Source = new DeepZoomImageTileSource(new Uri("http://localhost:3585/ClientBin/GeneratedImages/output.xml"));

DONE!!!

Espero que essas dicas ajudem a iluminar os passos para nova experiências com Silverlight e Deep Zoom.

Aqui está o link para o código fonte com imagens, um evento para capturar Mouse Wheel muito bom e um efeito de embaralhamento randomico nota 100000:

DeepZoomDinamico.zip (13,36 mb)

Nos vemos na próxima Arqinovação!!!

Silverlight + DeepZoom = RIA Experiences Parte 1 - Utilizando o Deep Zoom Composer

By rdorta at setembro 01, 2009 01:06
Filed Under: Silverlight

Estreando o novo blog, vou mostrar como criar experiências de Silverlight e DeepZoom para suas aplicações.

Introdução ao DeepZoom

O Deep Zoom é uma ferramenta poderosa que foi introduzida com o Silverlight 2. Com essa ferramenta é possível criar contextos de visualização de imagem muito interessantes.

Abaixo segue o link de um exemplo muito legal de aplicação criada utilizando Deep Zoom.

http://www.autotrader.co.nz/New/Search#keywords=&categories=Coupe 

Acredito que o Deep Zoom pode trazer uma grande vantagem em aplicações de E-commerce, fazendo com que possamos trazer uma experiência diversificada aos usuários de nossas aplicações, trazendo como benefícios uma nova forma de navegar por entre os produtos, sem necessitar de paginação e mostrando inicialmente para o cliente apenas informações que realmente interessam aos clientes.

 

Utilizando o Deep Zoom Composer

 

Para criar esta aplicação estou utilizando as seguintes ferramentas:

 

Visual Studio 2008

Silverlight 3
Silverlight Toolkit 3

Deep Zoom Composer

 

Como primeira parte dentre dois posts, vou mostrar como criar uma aplicação Silverlight com DeepZoom utilizando o Deep Zoom Composer.

 

Após a instalação do Deep Zoom Composer, você o encontra no seu Menu Iniciar -> Programas -> Microsoft Expression -> Deep Zoom Composer

Após a abertura do programa, vamos criar um novo projeto e denominá-lo de TesteDeepZoom.

A tela inicial do Deep Zoom Composer mostra o primeiro de três passos que é a escolha das imagens. Clique no botão Add Image no canto superior direito e adicione quantas imagens quiser.

No meu caso, adicionei 3 imagens de exemplo do Windows 7, note que as imagens aparecem na lista ao seu lado direito, e uma pré-visualização é exibida no painel principal.

 

Após estar satifisteito com as imagens que vai utilizar, clique no segundo passo que é a composição das imagens

Nesta tela, você tem diversos componentes que estão descritos no diagrama abaixo. Você pode arrastar as imagens da parte inferior da tela e adiciona-las a composição. Logo após basta redimensionar as imagens e posicioná-las de acordo com seu gosto. Note que você tem a barra de visualização no canto inferior esquerdo que é muito útil quando você estiver criando uma composição com muitas imagens. 

Legenda:
1) Definição de camadas da composição
2) Painel de Visualização Geral
3) Área de escolha de imagens

 Agora, vamos exortar o nosso projeto para uma aplicação Silverlight:

Nesta tela, você verá imediatamente um preview de como ficará nossa composição. Temos diversas formas de exportação.

Clique na aba Custom no canto direito.

Você verá no painel Output Types as opções:
1) Images (Exportas as imagens da composição)
2) Silverligh Deep Zoom (Projeto de Silverlight com o Deep Zoom aplicado em Multi Scale Image) Vou abordar esse assunto mais profundamente em outro post
3) Seadragon Ajax (Outra solução muito interessante que pretendo abordar em outro post mais pra frente)

Escolha a opção Silverligh Deep Zoom. Coloque um nome para a aplicação. Ex.: TesteDeepZoom
Escolha aond eo projeto será criado

No painel abaixo mantenha as configurações padrões e troque apenas o Template para Deep Zoom Classic + Source (pretendo criar um post avançado sobre o DeepZoomComposer também, onde irei abordar mais funcionalidades da ferramenta)

Clique em exportar, aguarde a exportação e você verá a janela abaixo com as opções de Ver no Broeser, abrir a pasta do projeto,  abrir a pasta com as imagens geradas pelo Composer.

Clique em abrir a pasta do projeto e você verá a solução de Visual Studio criada e pode reaproveitar os controles e códigos criados em sua aplicação Silverlight.

Sua primeira aplicação Deep Zoom está pronta!!!

Agora é a parte em que o desenvolvedor me pergunta:

"Legal! Mas como eu faço isso dinamicamente com as imagens da minha base relacionadas com meus produtos???"

Isso meus amigos... é assunto para meu próximo post, onde mostrarei como criar uma aplicação Deep Zoom dinamicamente com C# e base de dados.

Espero que o post seja útil para que você comece a ver como funciona o Deep Zoom e comece a enxergar novas maneira de criar suas aplicações.

Até a próxima Arqinovação!!!

Sobre mim

Ricardo Dorta

Ricardo Dorta

Arquiteto de sistemas da Makesys, atua na área de desenvolvimento de aplicações .NET há 5 anos.
MCP, MCAD e MCSD.