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.