Páginas

quinta-feira, 2 de agosto de 2012

CIÊNCIA ANTÁRDIDA


 


Expedição russa confirma chegada à superfície de lago isolado há milhões de anos na Antártida

De acordo com o chefe da missão, tudo indica que lago não foi contaminado. Estudos com a água começam em dezembro

 Depois de 20 anos de perfuração, cientistas e engenheiros russos alcançaram a superfície do lago Vostok, localizado quase 4.000 metros abaixo do manto de gelo da Antártida. A informação foi finalmente confirmada pelo chefe da expedição, Valery Lukin, por meio de comunicado no site do Instituto Russo de Pesquisa Antártica. O lago Vostok é o maior lago subglacial — ou seja, abaixo de uma geleira — do mundo, com 250 quilômetros de extensão e 50 quilômetros de largura. O corpo de água está isolado pelo gelo há 15 milhões de anos e pode abrigar organismos vivos nunca antes estudados pela ciência. O lago também guarda segredos sobre o clima da Antártida de milhões de anos atrás.

Esclarecimento - A notícia foi divulgada um dia depois de Lukin ter afirmado à revista britânica Nature que seria "muito cedo" para confirmar a chegada da broca à superfície do lago subglacial. Por meio de nota enviada ao site do instituto russo, Lukin explicou que dados preliminares, obtidos no dia 4 de fevereiro, apontavam o contato da broca com água líquida, mas não houve confirmação visual. "Esse contato foi erroneamente noticiado por alguns veículos de comunicação como a confirmação de que tínhamos alcançado a superfície do lago", disse Lukin.

Na ocasião, a equipe percebeu que não havia mais gelo no caminho da broca. O canal foi preenchido por cerca de 40 litros de água, que se congelou enquanto os cientistas tentavam recuperá-la. "As amostras de água congelada que coletamos eram frescas", disse Lukin, indicando que o líquido teria vindo do lago. Contudo, isso não quer dizer que os especialistas tinham alcançado o gigantesco corpo de água subglacial. A perfuração continuou por mais um dia e, no dia 5 de fevereiro, a 3.769 metros de profundidade, a broca fez o primeiro contato com o lago. "Percebemos uma mudança brusca nos sensores do equipamento e um sinal de alerta foi enviado à superfície", disse o chefe da expedição.

Lago Vostok
Sem contaminação - De acordo com o comunicado, tudo indica que não houve contaminação do lago Vostok. "Como previsto em teoria há 11 anos, os resultados foram provados na prática", disse Lukin. O cientista se referiu à ideia de que, quando a broca chegasse à superfície do lago, a pressão da água faria com que o líquido inundasse o tubo de perfuração, empurrando o querosene usado para mantê-lo aberto em direção à superfície. Isso manteria o lago livre de contaminação. "Menos denso que a água, o fluido de perfuração subiu rapidamente pelo tubo", disse. "500 litros do líquido jorraram pela superfície e foram coletados por um sistema de bandejas até um barril". A declaração, contudo, não descarta a possibilidade de contaminação do lago.
Lukin finalizou o comunicado em tom de celebração: "A conquista dos pesquisadores e engenheiros russos foi um grande presente para o dia da ciência russa, celebrada pelo país no dia 8 de fevereiro", disse. Agora, a expedição retornará à Rússia. A próxima visita ao Vostok será em dezembro, durante o verão polar. Só então eles vão iniciar os estudos científicos com a água do Lago Vostok.
 LAGO VOSTOK
O Lago Vostok é o maior lago subglacial do mundo, ou seja, é um lago que se encontra sob uma geleira. Ele está localizado a quase 4 quilômetros abaixo do manto de gelo da Antártida, abaixo de uma estação russa de mesmo nome. O lago tem uma forma elíptica com 250 quilômetros de comprimento e 50 quilômetros de largura. Estima-se que o Lago Vostok tenha um volume de água doce equivalente a 5.400 quilômetros cúbicos. Isso equivale a três vezes o volume do Lago Ontário, um dos cinco grandes lagos americanos. Os cientistas acreditam que a água é mantida líquida pelo calor de uma fonte geotermal abaixo do lago e pela pressão 400 vezes superior à da superfície no nível do mar.

 

Expedição russa ameaça lago isolado há milhões de anos

Depois de perfurar mais de 4.000 metros, expedição está próxima de atingir o lago Vostok. Quais as consequências do contato com um santuário preservado por tantos milhões de anos?

 

Cerca de 4.000 metros abaixo da superfície da Antártida, o Lago Vostok permaneceu intocado por 15 milhões de anos. Por causa de fatores como pressão e temperatura, manteve-se em estado líquido todo esse tempo, abrigando formas de vida que jamais tiveram contato com o mundo exterior. Tudo isso pode acabar. Depois de várias tentativas de alcançar o lago — a primeira remonta há 20 anos — uma expedição russa está bem perto de ter êxito.
O que poderia ser uma notícia alvissareira para a ciência tem grandes chances, porém, de representar uma sentença de morte para o lago. Cientistas ouvidos pelo site de VEJA acreditam que a expedição pode contaminar um dos mais sensíveis ecossistemas do planeta de maneira irreversível. "Não há garantias de que o lago não será contaminado", afirma Jefferson Simões, cientista sênior do programa antártico-brasileiro e único brasileiro que trabalhou com amostras do poço que está sendo cavado em Vostok. 
Na opinião de Simões, essa é uma preocupação da comunidade científica há uma década. O pesquisador explica que poços de gelo profundos como o de Vostok precisam ser perfurados com querosene. "Como as perfurações são feitas apenas durante os verões da Antártida, é preciso usá-lo para manter o tubo aberto."
Isso quer dizer que o aparato que leva a broca russa até a superfície do lago está cheia do combustível. "Os russos têm dito que a pressão do lago é suficiente para fazer o querosene subir, em vez de ir para o fundo da água", diz. "O problema é que não há garantia total: o líquido pode vazar, impactar a química do lago e afetar os micro-organismos que porventura lá existam", disse. Se isso acontecer, afirma Simões, o lago pode perder grande parte do seu valor científico. "A contaminação pode desequilibrar um ambiente prístino e dificilmente saberíamos se os micro-organismos lá encontrados foram trazidos pelo homem ou existiam anteriormente."  

Caso os russos consigam chegar ao lago sem contaminá-lo, as amostras terão que receber o mesmo cuidado que se emprega às amostras vindas do espaço, explica Simões. 
Esse cuidado é justificado pelo valor das informações guardadas nas amostras do Lago Vostok. "O Vostok tem informações sobre o clima da Antártida de milhões de anos atrás, quando o lago foi coberto", diz Duarte. "Ele pode ser considerado uma das últimas fronteiras científicas", acrescenta Rosado. "Os micro-organismos encontrados lá podem servir como modelos para possíveis formas de vida extraterrestre, por causa das condições extremas do local."
Bactérias e vírus — Outra preocupação aventada, a de que o contato com o lago poderia liberar micro-organismos perigosos para o ser humano foi descartada pelos especialistas. 
De acordo com Alexandre Rosado, diretor do Instituto de Microbiologia Paulo de Góes, da UFRJ, os micro-organismos que habitam o lago são adaptados à vida em um ambiente frio, escuro e isolado. "É pouco provável que algum deles escape e provoque doenças em um hospedeiro de sangue quente, como o homem". Rosado trabalha com diversidade de micro-organismos, inclusive na Antártida.
Rubens Duarte, um dos coordenadores do laboratório de astrobiologia da USP (Universidade de São Paulo), explica que apesar de o gelo glacial ser capaz de abrigar bactérias nocivas ao homem, as chances de contaminação são muito pequenas. "Em tese, a possibilidade sempre existe, mas ela está mais para a ficção do que para a realidade", disse Rosado. "Não sabemos se os micro-organismos do Lago Vostok poderão causar doenças nos seres humanos", afirmou Duarte.
A pesquisa científica com as amostras só deve começar no fim do ano. Em entrevista ao periódico britânico Nature, o chefe da expedição, o russo Valery Lukin, disse que ainda é cedo para afirmar que a broca atingiu a superfície do lago. "Assim que tivermos a confirmação, vamos espalhar a notícia pela comunidade internacional."

 
 

Entenda o caso

O Lago Vostok é considerado uma das últimas fronteiras da ciência na Terra

  1. • Pesquisadores russos estão muito próximos de chegar à superfície do Lago Vostok, o maior corpo de água subglacial do mundo. Os russos tentam chegar ao subterrâneo da Antártida desde o fim da década de 50. Os dados coletados podem revelar segredos sobre o clima da Antártida e do planeta há milhões de anos e alterar completamente a visão que os cientistas têm do continente.
  2. • O Lago Vostok está a quase 4 quilômetros abaixo da superfície da Antártida isolado do restante do planeta há pelo menos cinco milhões de anos. Existem cerca de 170 lagos parecidos com o Vostok debaixo do Polo Sul, mas nenhum tão grande quanto ele. Outras duas expedições, uma inglesa e a outra americana, buscam chegar à superfície de outros dois lagos: Whillans e Ellsworth.
  3. • Os cientistas acreditam que os lagos do Polo Sul podem estar interligados por uma rede de drenagem formando uma área que pode chegar a 10 milhões de quilômetros quadrados, superior à da Bacia Amazônica. 

Opinião do especialista

 John Priscu

Doutor que microbiologia pela Universidade da California, nos Estados Unidos, especialista em vida associada com o gelo da Antártida e sua relação com a astrobiologia

"A chegada ao Lago Vostok representa o auge de mais de uma década de planejamento. Se os russos tiverem sucesso, estará provado, sob o ponto de vista da engenharia, que conseguimos retirar amostras de ambientes enterrados em camadas de 4 quilômetros de gelo. Isso também significa que as portas para a ciência subglacial estarão abertas. Acredito que os dados da expedição a Vostok, junto com as informações coletadas pelas expedições americana e inglesa, transformarão a forma como vemos o continente antártico e vai expandir os limites da vida na Terra. 
Espero que os russos confirmem, sem sombra de dúvidas, de que a vida microbiana exista no lago. Este é o centro de um longo debate que só pode ser resolvido com a coleta de amostra. Os outros dois projetos pretendem retirar amostras em 2013. Estamos vivendo uma época excelente para a ciência polar".

MUNDO CIÊNCIA


A Antártida já foi uma floresta "semi-tropical"

 
Um estudo levado a cabo por cientistas que, em 2010, fizeram uma expedição ao fundo do mar na Antártida, revela que esta região do planeta era uma floresta "semi-tropical" há 50 milhões de anos atrás. Os cientistas acreditam que esta descoberta ajuda a perceber as alterações climáticas atuais e o possível degelo do continente "no final do século".
 
A Antártida já foi uma floresta "semi-tropical"
Antártida hoje
 
O grupo de cientistas que, em 2010, realizou uma expedição ao fundo do mar na Antártida revelou, nesta quinta-feira, que a região era uma floresta há 50 milhões de anos atrás. Os cientistas realizaram perfurações junto à costa oriental do continente e recolheram fósseis de pólenes que faziam parte de uma floresta "semi-tropical" entre 36 a 50 milhões de anos atrás.
Assim, naquele período, as temperaturas atingiam os 20 graus - como vieram comprovar as análises a moléculas sensíveis à temperatura - e o cenário era completamente diferente do atual. "Havia florestas e não gelo e as temperaturas eram amenas", garante Kevin Welsh, cientista australiano que participou na expedição .
Os investigadores também garantem que a taxa de concentração de dióxido de carbono era muito superior à registada atualmente devido ao calor que se fazia sentir no continente há milhões de anos atrás e à falta de gelo.
Kevin Welsh relembra que o Painel Intergovernamental para as Alterações Climáticas projeta um novo degelo da Antártida "no final do século", mas acredita que este estudo, publicado na revista Nature, traz descobertas "muito significativas" para a compreensão das alterações climáticas que poderão ocorrer no futuro.


Antárctida estava coberta de florestas há 50 milhões de anos.

  Análises de moléculas sensíveis à temperatura mostram que, naquele período, as temperaturas atingiam os 20 graus celsius.

 O continente gelado da Antárctida estava coberto por florestas há mais de 50 milhões de anos, revelaram esta quinta-feira cientistas, que em 2010 participaram numa expedição ao fundo do mar nesta região.

Perfurações realizadas pelos cientistas ao largo da costa oriental da Antárctida permitiram recuperar fósseis de pólenes provenientes de uma floresta "semi-tropical", que cobria o continente entre 34 a 56 milhões de anos atrás.

Análises de moléculas sensíveis à temperatura mostram que, naquele período, as temperaturas atingiam os 20 graus celsius, disse Kevin Welsh, um cientista australiano que participou na expedição, da qual resultou um estudo agora publicado pela revista britânica “Nature”.

"Havia florestas e não gelo e as temperaturas eram amenas", acrescentou.

Os investigadores garantem que os elevados níveis de dióxido de carbono na atmosfera tinham origem no calor e na inexistência de gelo na Antárctida e estimam que, na altura, a concentração de CO2 se situava entre os 990 e "alguns milhares" de partes por milhão (ppm).

Actualmente, a taxa de concentração está avaliada em 395 ppm e as previsões mais radicais do painel intergovernamental para as alterações climáticas (IPCC, sigla em inglês) projectam novo degelo "no final do século", lembra o cientista da Universidade de Queensland.

O investigador considerou que as descobertas "são muito significativas" para a compreensão das alterações climáticas futuras, nomeadamente no que respeita à importância da Antárctida e das reservas de água armazenadas à superfície sob a forma de gelo.

Fonte: Google.

 

 

 

O QUE É LIBRE OFFICE ?

O que é o LibreOffice?
  
LibreOffice é um pacote de produtividade de escritórios totalmente funcional e disponível
gratuitamente. Seu formato de arquivo nativo é o OpenDocument, um padrão de formato aberto
que está sendo adotado, por governos do mundo inteiro, como um formato necessário para a
publicação e aceitação de documentos. O LibreOffice também pode abrir e salvar documentos em
muitos outros formatos, incluindo aqueles utilizados por várias versões do Microsoft Office.
O LibreOffice inclui os seguintes componentes:
Writer (processador de textos) 
O Writer é uma ferramenta riquíssima para criação de cartas, livros, relatórios, noticiários,
cadernos e outros tipos de documentos. Você pode inserir gráficos e objetos de outros
componentes dentro dos documentos do Writer. O Writer é capaz de exportar arquivos para os
formatos HTML, XHTML, XML, Portable Document Format (PDF) da Adobe, e várias versões de
arquivos do Microsoft Word. Ele também pode conectar-se ao seu programa de e-mail.
Calc (planilha de cálculo)
O Calc possui todas as funcionalidades avançadas de análise, gráficos e para tomada de
decisões que são esperadas de uma avançada ferramenta de planilha eletrônica. Ele inclui mais
de 300 funções financeiras, estatísticas e matemáticas, entre outras. O Gerenciador de Cenário
oferece análises do tipo “e se”. O Calc gera gráficos 2-D e 3-D, que podem ser integrados dentro
de outros documentos do LibreOffice. Você também pode abrir e trabalhar com planilhas do
Microsoft Excel e salvá-las no formato do Excel. O Calc pode exportar planilhas para os formatos
PDF da Adobe e HTML.
Impress (apresentações)
O Impress oferece todas as ferramentas mais comuns para apresentações multimídia, tais como
efeitos especiais, animação e ferramentas de desenho. Ele é integrado com as capacidades
gráficas avançadas do Draw e do Math. As apresentações de slides podem ser ainda melhoradas
com os efeitos especiais de texto do Fontwork, assim como sons e vídeos. O Impress é
compatível com o formato de arquivo do Microsoft PowerPoint e também pode salvar seus
trabalhos em vários formatos gráficos, incluindo o Macromedia Flash (SWF).
Draw (gráficos vetoriais)
O Draw é uma ferramenta de desenho vetorial que pode produzir tudo, desde simples diagramas
e fluxogramas até artes em 3-D. Sua função de Conectores Inteligentes permite que você defina
seus próprios pontos de conexão. Você pode utilizar o Draw para criar desenhos e usá-los em
qualquer um dos outros componentes do LibreOffice, e pode criar seus próprios cliparts e
adicioná-los à Galeria. O Draw pode importar gráficos de muitas dos formatos mais comuns e
salvá-los em mais de 20 formatos, incluindo PNG, HTML, PDF e Flash.
Base (banco de dados)
O Base oferece ferramentas para o trabalho diário com bancos de dados, dentro de uma interface
simples. Ele pode criar e editar formulários, relatórios, requisições, tabelas, visualizações e
relacionamentos, portanto, administrar seu banco de dados é bem semelhante a outras aplicações
de bancos de dados conhecidas. O Base oferece muitas funcionalidades novas, tais como a
capacidade de analisar e editar relacionamentos a partir de um diagrama. O Base incorpora o
HSQLDB como seu motor padrão de bancos de dados relacionais. Também pode ser utilizado o
12 Guia do Iniciante do LibreOffice 3.3
dBASE, o Microsoft Access, o MySQL, ou o Oracle, ou qualquer outro banco de dados
compatíveis com ODBC ou JDBC. O Base também oferece suporte ao subconjunto SQL ANSI-92.
Math (editor de fórmulas matemáticas)
O Math é o editor de fórmulas e equações do LibreOffice. Você pode utilizá-lo para criar equações
complexas que incluem símbolos ou caracteres não disponíveis nos conjuntos de fontes padrão.
Além de ser mais comumente utilizado para criar fórmulas para outros documentos, como o Writer
ou o Impress, o Math também pode trabalhar de forma isolada. Você pode salvar fórmulas no
formato padrão de Linguagem de Marcação Matemática (MathML) para inclusão em páginas da
internet e outros documentos não criados pelo LibreOffice.
As vantagens do LibreOffice
Abaixo vemos algumas das vantagens do LibreOffice sobre outros pacotes de escritório:
• Sem taxas de licenciamento. O LibreOffice é livre para qualquer um usá-lo e distribuí-lo
sem custos. Em outros pacotes de escritório, muitas funcionalidades são oferecidas
adicionalmente, a um custo extra (como exportação para o formato PDF), enquanto no
LibreOffice estão disponíveis gratuitamente. Não existem taxas ocultas, nem hoje, nem
nunca.
• Código aberto. Você pode distribuir, copiar e modificar o software o quanto quiser, de
acordo com as licenças de código aberto do LibreOffice.
• Multiplataforma. O LibreOffice roda em várias arquiteturas de hardware e múltiplos
sistemas operacionais, como o Microsoft Windows, Mac OS X e Linux.
• Extenso suporte a idiomas. A interface de usuário do LibreOffice está disponível em
mais de 40 idiomas, e o projeto LibreOffice oferece corretor ortográfico, hifenização e
dicionário léxico em mais de 70 dialetos. O LibreOffice também oferece suporte para
Layout de Texto Complexo (CTL) e layout para Idiomas da Direita para a Esquerda
(RTL),como o Urdu, Hebraico e Árabe).
• Interface de usuário consistente. Todos os componentes possuem uma aparência
semelhante, o que faz com que sejam fáceis de usar e controlar.
• Integração. Os componentes do LibreOffice estão bem integrados entre si..
– Todos os componentes compartilham um corretor ortográfico comum além de outras
ferramentas, que são utilizadas de maneira consistente por todo o pacote. Por
exemplo, as ferramentas de desenho disponível no Writer também são encontradas
no Calc, com versões parecidas, mas melhoradas no Impress e no Draw.
– Você não precisa saber qual aplicativo foi usado para criar um arquivo em particular.
Por exemplo, você pode abrir um arquivo do Draw direto no Writer.
• Granularidade. Normalmente, se você muda uma opção, isso afeta todos os
componentes. Entretanto, as opções do LibreOffice podem ser ajustadas a nível de
componente ou do documento.
• Compatibilidade com arquivos. Além dos formatos de Documentos Abertos nativos, o
LibreOffice tem a capacidade de exportar para os formatos PDF e Flash, assim como pode
abrir e salvar arquivos nos formatos mais populares, incluindo o Microsoft Office, HTML,
XML, WordPerfect, e Lotus 1-2-3 formats. Utilizando uma extensão (incluída): a
capacidade de importar e editar alguns arquivos PDF.
• Sem dependência do fornecedor. O LibreOffice usa os formatos de arquivo ODF, um
formato baseado em XML (eXtensible Markup Language) desenvolvido como um padrão
para a indústria pelo OASIS (Organization for the Advancement of Structured Information
Capítulo 1 Introdução ao LibreOffice 13
Standards). Esses arquivos podem ser facilmente descompactados e lidos por qualquer
editor de texto, e seu modelo é aberto e público.
• Você tem voz. Melhorias, correções e datas de lançamento são decididas pela
comunidade. Você pode se juntar à comunidade e influenciar o rumo do produto que
utiliza.
Você pode ler mais sobre o LibreOffice e The Document Foundation em suas páginas na internet:
http://pt-br.libreoffice.org/ e http://www.documentfoundation.org/.
Requisitos mínimos
O LibreOffice 3.x precisa de um dos seguintes sistemas operacionais:
• Microsoft Windows 2000 (Service Pack 4 ou superior), XP, Vista, ou 7
• GNU/Linux versão de Kernel 2.6.18 e glibc2 versão 2.5 ou superior
• Mac OS X 10.4 (Tiger) ou superior
Algumas das funcionalidades do LibreOffice (assistentes e o mecanismo de banco de dados
HSQLDB) necessita que o Java Runtime Environment (JRE) 1.6.x ou superior esteja instalado em
seu computador. Ainda que o LibreOffice funcione sem o suporte do Java, algumas
funcionalidades não estarão disponíveis. Se você possui um PC mais antigo ou não necessita das
funcionalidades que precisam do JRE, você pode desabilitá-lo para aumentar a velocidade de
carga do programa.
Para uma lista mais detalhada dos requerimentos, vá à página do LibreOffice na Internet,
https://pt-br.libreoffice.org/suporte/sistemas/.
Como conseguir uma cópia do software
O software pode ser baixado de https://pt-br.libreoffice.org/baixe-ja/. Você pode baixá-lo, também,
utilizando um cliente de redes Peer-to-Peer, como o BitTorrent, no mesmo endereço.
Usuários de Linux possuem o LibreOffice incluído nas últimas versões de muitas distribuições
(Ubuntu é um exemplo).
Como instalar o software
Informações sobre a instalação e configuração do LibreOffice nos vários sistemas operacionais
suportados são dadas aqui: https://pt-br.libreoffice.org/suporte/instalacao/.
Extensões e suplementos
Extensões e suplementos estão disponíveis para melhorar o LibreOffice. Várias extensões são
instaladas com o programa e outras estão disponíveis no repositório oficial de extensões,
http://extensions.libreoffice.org/. Veja o capítulo 14, Personalizando o LibreOffice, para mais
informações sobre como instalá-las.
14 Guia do Iniciante do LibreOffice 3.3
Como obter ajuda
Este livro, os outros guias de usuário do LibreOffice, o sistema de ajuda do programa, e os
sistemas de suporte assumem que você possui familiaridade com seu computador e com suas
funções básicas, como iniciar um programa, abrir e salvar arquivos.
Sistema de ajuda
O LibreOffice vem com um extenso Sistema de ajuda. Essa é sua primeira linha de suporte na
utilização do LibreOffice.
Para mostrar o sistema de ajuda completo, pressione F1 ou selecione a Ajuda do LibreOffice no
menu Ajuda. Você pode escolher, também, uma das Dicas e Dicas estendidas ativas, e o Agente
de Ajuda (utilizando Ferramentas → Opções → LibreOffice → Geral).
Se as dicas estiverem habilitadas, posicione o ponteiro do mouse sobre qualquer ícone para ver
uma pequena janela (“janela de dica”) com uma breve explicação da função do ícone. Para uma
explicação mais detalhada, selecione Ajuda → O que é isto? E segure o ponteiro do mouse sobre
o ícone.
Suporte online gratuito
A comunidade do LibreOffice não apenas desenvolve software, mas oferece suporte gratuito
através de voluntários. Usuários do LibreOffice podem obter suporte online da comunidade
através de listas de discussão e fóruns. Também existem outras páginas da internet, feitas por


 





quarta-feira, 1 de agosto de 2012

Windows Imaging Component

Noções básicas de Windows Imaging Component



O Microsoft® Windows® Imaging Component (WIC) é uma estrutura extensível para codificar, decodificar e manipular imagens. Originalmente projetado para Windows Vista® e Windows Presentation Foundation (WPF), hoje o WIC não apenas acompanha o Windows Vista e o Microsoft .NET Framework 3.0 e versões posteriores, mas também está disponível como um download para o Windows XP e Windows Server® 2003 para uso em aplicativos nativos.
Uma das várias estruturas nativas eficientes que capacitam o WPF, o WIC, neste contexto, é a estrutura usada na implementação do namespace System.Windows.Media.Imaging. Ele é, no entanto, também perfeitamente adequado para aplicativos nativos escritos em C++ porque fornece uma API simples, mas eficiente, exposta por meio de um conjunto de interfaces COM.
O WIC suporta diferentes formatos de imagem usando um conjunto extensível de codecs de imagens. Cada codec suporta um formato de imagem diferente e normalmente fornece um codificador e um decodificador. O WIC inclui um conjunto de codecs internos para praticamente todos os principais formatos de imagens, incluindo PNG, JPEG, GIF, TIFF, HD Photo (HDP), ICO e, é claro, Windows BMP.
O HDP é o único formato de que você pode nunca ter ouvido falar. Ele era originalmente chamado de Windows Media Photo e foi desenvolvido em conjunto com o Windows Vista para superar algumas das limitações com formatos existentes e fornecer um melhor desempenho e qualidade de imagem superior. Para obter mais informações sobre HDP, consulte a especificação em microsoft.com/whdc/xps/wmphoto.mspx. Felizmente, o WIC fornece um excelente suporte para esse novo formato de imagem, de forma que os aplicativos não precisam saber as especificações dos formatos para usá-los.
Este mês, mostrarei a você como usar o WIC para codificar e decodificar diferentes formatos de imagens e algumas coisas intermediárias. Na próxima vez, explorarei alguns dos recursos mais avançados e mostrarei como estender o WIC com seus próprios codecs de imagens. 


Introdução
A API do WIC consiste de interfaces COM, funções, estruturas e códigos de erros, bem como GUIDs que identificam vários codecs, contêineres e formatos. Todas as declarações necessárias estão incluídas nos arquivos de cabeçalho wincodec.h e wincodecsdk.h fornecidos como parte do Windows SDK (e incluídas com o Visual Studio® 2008). Também será preciso que você vincule à biblioteca WindowsCodecs.lib, que fornece as várias definições necessárias. Você pode adicionar o seguinte ao cabeçalho pré-compilado do seu projeto para torná-lo totalmente disponível:
#include <wincodec.h>
#include <wincodecsdk.h>
#pragma comment(lib, "WindowsCodecs.lib")
Como a API do WIC consiste principalmente de interfaces COM, eu uso a classe CComPtr do ATL (Active Template Library) para tratar da criação e gerenciamento dos ponteiros de interface. Se você desejar fazer o mesmo, precisará incluir também o arquivo do cabeçalho atlbase.h que define a classe de modelo CComPtr:
#include <atlbase.h>
A API do WIC também usa a biblioteca COM, portanto a função CoInitializeEx deve ser chamada em qualquer segmento que usará a API.
Finalmente, a API do WIC usa HRESULTs para descrever erros. As amostras neste artigo usam a macro HR para identificar claramente onde os métodos retornam um HRESULT que precisa ser verificado. Você pode substituir isso por sua própria estratégia de tratamento de erros — seja lançando uma exceção ou retornando você mesmo o HRESULT.

Decodificando imagens
Os decodificadores são representados pela interface IWICBitmapDecoder. O WIC fornece algumas maneiras de criar um objeto decodificador, mas, no mínimo, você pode simplesmente usar um CLSID particular do decodificador para criar uma instância. O exemplo a seguir cria um decodificador para uma imagem TIFF:
CComPtr<IWICBitmapDecoder> decoder;
HR(decoder.CoCreateInstance(CLSID_WICTiffDecoder));
A Figura 1 lista os codecs incluídos com o WIC e os CLSIDs que você pode usar para criar os diferentes decodificadores. Depois que o decodificador é criado, ele precisa ser inicializado com um fluxo contendo os pixels e metadados opcionais em um formato entendido pelo decodificador:

Formato Decodificador Codificador
BMP CLSID_WICBmpDecoder CLSID_WICBmpEncoder
PNG CLSID_WICPngDecoder CLSID_WICPngEncoder
ICO CLSID_WICIcoDecoder Não disponível
JPEG CLSID_WICJpegDecoder CLSID_WICJpegEncoder
GIF CLSID_WICGifDecoder CLSID_WICGifEncoder
TIFF CLSID_WICTiffDecoder CLSID_WICTiffEncoder
HDP CLSID_WICWmpDecoder CLSID_WICWmpEncoder
CComPtr<IStream> stream;

// Create stream object here...

HR(decoder->Initialize(
  stream,
  WICDecodeMetadataCacheOnDemand));
Discutirei os fluxos mais tarde neste artigo, mas IStream é apenas a interface de fluxo COM tradicional usada por várias APIs, incluindo o analisador XmlLite de que falei na edição de abril de 2007 da MSDN® Magazine (msdn.microsoft.com/msdnmag/issues/07/04/Xml).
O segundo parâmetro para o método Initialize descreve como você gostaria que o decodificador lesse as informações da imagem a partir do fluxo. WICDecodeMetadataCacheOnDemand indica que o decodificador deve apenas ler as informações da imagem a partir do fluxo, conforme necessário. Isso pode ser particularmente útil se o formato da imagem contiver ou suportar vários quadros. A alternativa é WICDecodeMetadataCacheOnLoad, que indica que o decodificador deve armazenar em cache todas as informações da imagem imediatamente. Todas as solicitações subseqüentes para o decodificador seriam então preenchidas diretamente a partir da memória. Isso possui algumas implicações adicionais para códigos gerenciados sobre o que falarei posteriormente.
Com o decodificador inicializado, você pode livremente consultar o decodificador em busca de informações. A coisa mais comum que provavelmente você irá perguntar é o conjunto de quadros que formam uma imagem. Os quadros são os bitmaps reais que contêm os pixels. Você pode pensar no formato da imagem como um contêiner para quadros. Como mencionei, alguns formatos de imagens suportam vários quadros.
A função GetFrameCount é usada para determinar o número de quadros na imagem:
UINT frameCount = 0;
HR(decoder->GetFrameCount(&frameCount));
Dado o número de quadros, quadros individuais podem ser recuperados usando o método GetFrame:
for (UINT index = 0; index < frameCount; ++index)
{
    CComPtr<IWICBitmapFrameDecode> frame;

    HR(decoder->GetFrame(index, &frame));
}
A interface IWICBitmapFrameDecode retornado por GetFrame deriva da interface IWICBitmapSource que representa um bitmap somente leitura. IWICBitmapFrameDecode fornece informações associadas com o quadro, como metadados e perfis de cor. IWICBitmapSource fornece o tamanho e a resolução do bitmap, o formato do pixel e outras características opcionais, como sua tabela de cores. IWICBitmapSource também fornece o método CopyPixels que pode ser usado para realmente ler pixels do bitmap.
Você pode obter as dimensões do quadro expressas em pixels usando o método GetSize:
UINT width = 0;
UINT height = 0;
HR(frame->GetSize(&width, &height));
E pode obter a resolução do quadro expressa em pontos por polegada (dpi) usando o método GetResolution:
double dpiX = 0;
double dpiY = 0;
HR(frame->GetResolution(&dpiX, &dpiY));
Embora a resolução não exerça impacto nos pixels em si, ela afeta como a imagem pode ser exibida ao usar um sistema de coordenadas lógico, como o usado pelo WPF.
O último atributo crítico do quadro é o formato do pixel. Ele descreve o layout dos pixels na memória e também implica o intervalo de cores ou espaço de cor que ele suporta. O método GetPixelFormat retorna o formato do pixel:
GUID pixelFormat = { 0 };
HR(frame->GetPixelFormat(&pixelFormat));
Os formatos do pixel são definidos como GUIDs cujos nomes descrevem bem claramente o layout da memória. Por exemplo, o formato GUID_WICPixelFormat24bppRGB indica que cada pixel usa 24 bits (3 bytes) de armazenamento com canal de 1 byte por cor. Além disso, a ordem das letras R (vermelho), G (verde) e B (azul) indica a ordem dos bytes do menos significativo para o mais significativo. Como um exemplo, o formato GUID_WICPixelFormat32bppBGRA indica que cada pixel usa 32 bits (4 bytes) de armazenamento com canal de 1 byte por cor, bem como 1 byte para o canal alfa. Neste caso, os canais são ordenados com o canal azul (B) sendo menos significativo e o canal alfa (A) sendo o mais significativo.
Os pixels reais podem ser recuperados usando o método CopyPixels.
HRESULT CopyPixels(
  const WICRect* rect,
  UINT stride,
  UINT bufferSize,
  BYTE* buffer);
O parâmetro rect especifica um retângulo dentro do bitmap a copiar. Você pode definir esse parâmetro como zero e ele copiará o bitmap inteiro. Falarei do stride em breve. Os parâmetros buffer e bufferSize indicam onde os pixels serão escritos e quanto espaço há disponível.
O stride pode ser um dos aspectos mais confusos de bitmaps. Stride é a contagem de bytes entre verificações de linha. De modo geral, os bits que formam os pixels de um bitmap são incluídos em linhas. Uma única linha deve ser longa o suficiente para armazenar uma linha dos pixels do bitmap. O stride é o comprimento de uma linha medido em bytes, arredondado para o DWORD mais próximo (4 bytes). Isso permite que bitmaps com menos de 32 bits por pixel (bpp) consumam menos memória enquanto ainda fornecem um bom desempenho. É possível usar a seguinte função para calcular o stride para um determinado bitmap:
UINT GetStride(
  const UINT width, // image width in pixels
  const UINT bitCount) { // bits per pixel
  ASSERT(0 == bitCount % 8);

  const UINT byteCount = bitCount / 8;
  const UINT stride = (width * byteCount + 3) & ~3;

  ASSERT(0 == stride % sizeof(DWORD));
  return stride;
}
Com isso concluído, você pode chamar o método CopyPixels como a seguir, supondo que o quadro representa um bitmap de 32 bpp:
const UINT stride = GetStride(width, 32);
CAtlArray<BYTE> buffer;
VERIFY(buffer.SetCount(stride * height));

HR(frame->CopyPixels(
  0, // entire bitmap
  stride,
  buffer.GetCount(),
  &buffer[0]));
Meu exemplo usa a classe de coleção CAtlArray do ATL para alocar o buffer, mas você pode obviamente usar o armazenamento que desejar. Para tratar de maiores bitmaps com mais eficiência, você pode chamar CopyPixels várias vezes para ler diferentes partes do bitmap.

Codificando imagens
Os codificadores são representados pela interface IWICBitmapEncoder. Como ocorre com os decodificadores, o WIC fornece algumas maneiras de criar codificadores, mas, no mínimo, você pode simplesmente usar um CLSID particular do codificador para criá-lo. Esse código, por exemplo, cria um codificador para uma imagem PNG:
CComPtr<IWICBitmapEncoder> encoder;
HR(encoder.CoCreateInstance(CLSID_WICPngEncoder));
A Figura 1 lista os CLSIDs que você pode usar para criar os diferentes codificadores incluídos com o WIC. Depois que o codificador é criado, ele precisa ser inicializado com um fluxo que finalmente receberá os pixels codificados e metadados opcionais:
CComPtr<IStream> stream;

// Create stream object here...

HR(encoder->Initialize(
  stream,
  WICBitmapEncoderNoCache));
O segundo parâmetro para o método Initialize é menos interessante, uma vez que WICBitmapEncoderNoCache é o único sinalizador suportado agora.
Com o codificador inicializado, você pode agora começar a adicionar quadros. O método CreateNewFrame cria um novo quadro que você pode configurar e no qual é possível escrever pixels:
CComPtr<IWICBitmapFrameEncode> frame;
CComPtr<IPropertyBag2> properties;

HR(encoder->CreateNewFrame(
  &frame,
  &properties));
CreateNewFrame retorna uma interface IWICBitmapFrameEncode representando o novo quadro e uma interface IPropertyBag2. A última é opcional e pode ser usada para determinar qualquer propriedade específica do codificador, como a qualidade da imagem para JPEG ou o algoritmo de compactação para TIFF. Por exemplo, veja como você pode definir a qualidade da imagem para uma imagem JPEG:
PROPBAG2 name = { 0 };
name.dwType = PROPBAG2_TYPE_DATA;
name.vt = VT_R4;
name.pstrName = L"ImageQuality";

CComVariant value(0.75F);

HR(properties->Write(
  1, // property count
  &name,
  &value));
O valor para a qualidade da imagem deve estar entre 0,0 para a qualidade mais baixa possível e 1,0 para a qualidade mais alta possível.
Com as propriedades do codificador definidas, você precisa chamar o método Initialize antes de configurar e escrever no quadro:
HR(frame->Initialize(properties));
A próxima etapa é definir as dimensões e o formato do pixel do novo quadro antes que você possa escrever pixels nele:
HR(frame->SetSize(width, height));
GUID pixelFormat = GUID_WICPixelFormat24bppBGR;
HR(frame->SetPixelFormat(&pixelFormat));
ASSERT(GUID_WICPixelFormat24bppBGR == pixelFormat);
O parâmetro SetPixelFormat é um parâmetro de entrada/saída [in, out]. Na entrada, ele especifica o formato de pixel desejado. Na saída, ele contém o formato de pixel suportado mais próximo. Isso normalmente não é um problema a menos que o formato seja definido em runtime, talvez com base no formato de pixel de outro bitmap.
Escrever pixels no quadro é realizado usando-se o método WritePixels, como exibido aqui:
HRESULT WritePixels(
  UINT lineCount,
  UINT stride,
  UINT bufferSize,
  BYTE* buffer);
O parâmetro lineCount especifica quantas linhas de pixels devem ser escritas. Isso implica que você pode chamar WritePixels várias vezes para escrever o quadro completo. O parâmetro stride indica como os pixels do buffer são incluídos em linhas. Eu descrevi como você pode calcular o stride na seção anterior.
Após ter chamado WritePixels uma ou mais vezes para escrever o quadro completo, você precisa informar ao codificador que o quadro está pronto chamando o método Commit do quadro. E depois de ter confirmado todos os quadros que formam a imagem, você precisa dizer ao codificador que a imagem está pronta para ser salva chamando o método Commit do codificador.
Até aqui, eu tratei das noções básicas da codificação e decodificação de imagens. Antes de seguir adiante, quero concluir com um exemplo simples. A Figura 2 mostra uma função CopyIconToTiff que demonstra como ler os bitmaps individuais que formam um ícone e como copiá-los para uma imagem TIFF com vários quadros.
 HRESULT CopyIconToTiff(
   IStream* sourceStream,
   IStream* targetStream) {

  // Prepare the ICO decoder

  CComPtr<IWICBitmapDecoder> decoder;
  HR(decoder.CoCreateInstance(CLSID_WICIcoDecoder));

  HR(decoder->Initialize(
    sourceStream,
    WICDecodeMetadataCacheOnDemand));

  // Prepare the TIFF encoder

  CComPtr<IWICBitmapEncoder> encoder;
  HR(encoder.CoCreateInstance(CLSID_WICTiffEncoder));

  HR(encoder->Initialize(
    targetStream,
    WICBitmapEncoderNoCache));

  UINT frameCount = 0;
  HR(decoder->GetFrameCount(&frameCount));

  for (UINT index = 0; index < frameCount; ++index) {
    // Get the source frame info

    CComPtr<IWICBitmapFrameDecode> sourceFrame;

    HR(decoder->GetFrame(index, &sourceFrame));

    UINT width = 0;
    UINT height = 0;
    HR(sourceFrame->GetSize(&width, &height));

    GUID pixelFormat = { 0 };
    HR(sourceFrame->GetPixelFormat(&pixelFormat));

    // Prepare the target frame

    CComPtr<IWICBitmapFrameEncode> targetFrame;

    HR(encoder->CreateNewFrame(
      &targetFrame,
      0)); // no properties

    HR(targetFrame->Initialize(0)); // no properties

    HR(targetFrame->SetSize(width, height));
    HR(targetFrame->SetPixelFormat(&pixelFormat));

    // Copy the pixels and commit frame

    HR(targetFrame->WriteSource(sourceFrame, 0));
    HR(targetFrame->Commit());
  }

  // Commit image to stream

  HR(encoder->Commit());

  return S OK;
}

Neste exemplo, eu simplifiquei as coisas ainda mais me aproveitando de uma alternativa ao método WritePixels. Em vez de primeiro copiar os pixels do quadro de origem e, em seguida, escrevê-los no quadro de destino, estou usando o método WriteSource que lê os pixels diretamente a partir de uma interface IWICBitmapSource fornecida. Como a interface IWICBitmapFrameDecode deriva de IWICBitmapSource, isso fornece uma solução distinta.

O Imaging Factory do WIC
O WIC fornece um recurso chamado Imaging Factory para criar vários objetos relacionados a ele. Ele é exposto por meio de uma interface IWICImagingFactory e pode ser criado da seguinte maneira:
CComPtr<IWICImagingFactory> factory;
HR(factory.CoCreateInstance(CLSID_WICImagingFactory));
Já mostrei como você pode criar um decodificador para um formato de imagem específico, dado um CLSID que identifica uma implementação. É claro que, como se pode deduzir, seria muito mais útil se não fosse preciso especificar uma implementação particular ou, até mesmo, codificar o formato da imagem.
Felizmente, o WIC fornece a solução. Antes de criar um decodificador, o WIC pode examinar um determinado fluxo em busca de padrões que possam identificar o formato da imagem. Quando uma melhor correspondência for encontrada, ele irá criar o decodificador apropriado e inicializá-lo com o mesmo fluxo. Essa funcionalidade é fornecida pelo método CreateDecoderFromStream:
CComPtr<IWICBitmapDecoder> decoder;

HR(factory->CreateDecoderFromStream(
  stream,
  0, // vendor
  WICDecodeMetadataCacheOnDemand,
  &decoder));
O segundo parâmetro identifica o fornecedor do decodificador. Ele é opcional, mas pode ser útil se você preferir um codec particular do fornecedor. Tenha em mente que isso é apenas uma dica e, se um fornecedor particular não possuir um decodificador adequado instalado, um decodificador ainda será escolhido independentemente do fornecedor.
IWICImagingFactory também fornece os métodos CreateDecoderFromFilename e CreateDecoderFromFileHandle que fornecem a mesma funcionalidade, dado um caminho para um arquivo e um manipulador de arquivos, respectivamente. Como alternativa, você pode criar um decodificador sem especificar um CLSID ou um fluxo, mas em vez disso indicando o formato da imagem. O método CreateDecoder faz exatamente isso:
CComPtr<IWICBitmapDecoder> decoder;

HR(factory->CreateDecoder(
  GUID_ContainerFormatIco,
  0, // vendor
  &decoder));

HR(decoder->Initialize(
  stream,
  WICDecodeMetadataCacheOnDemand));
Da mesma forma, o método CreateEncoder permite que você crie um codificador para um formato de imagem particular sem considerar sua implementação, assim:
CComPtr<IWICBitmapEncoder> encoder;

HR(factory->CreateEncoder(
  GUID_ContainerFormatBmp,
  0, // vendor
  &encoder));

HR(encoder->Initialize(
  stream,
  WICBitmapEncoderNoCache));
A Figura 3 lista os GUIDs identificando os formatos de imagem independentes de implementação, também conhecidos como formatos de contêiner.

Formato GUID
BMP GUID_ContainerFormatBmp
PNG GUID_ContainerFormatPng
ICO GUID_ContainerFormatIco
JPEG GUID_ContainerFormatJpeg
GIF GUID_ContainerFormatGif
TIFF GUID_ContainerFormatTiff
HDP GUID_ContainerFormatWmp

Trabalhando com fluxos
Você é livre para fornecer qualquer implementação IStream válida para usar com o WIC. Você pode, por exemplo, usar as funções CreateStreamOnHGlobal ou SHCreateStreamOnFile que descrevi no meu artigo sobre XmlLite ou até mesmo escrever sua própria implementação. O WIC também fornece uma implementação IStream flexível que pode ser útil.
Usando o Imaging Factory que apresentei na seção anterior, você pode criar um objeto de fluxo não-inicializado da seguinte forma:
CComPtr<IWICStream> stream;
HR(factory->CreateStream(&stream));
A interface IWICStream herda de IStream e fornece alguns métodos para associar o fluxo com diferente armazenamento de backup. Por exemplo, você pode usar InitializeFromFilename para criar um fluxo apoiado por um determinado arquivo:
HR(stream->InitializeFromFilename(
  L"file path",
  GENERIC_READ));
Você pode usar também InitializeFromIStreamRegion para criar um fluxo como um subconjunto de outro fluxo ou usar InitializeFromMemory para criar um fluxo sobre um bloco de memória.

WIC via WPF
Como já mencionei, o WIC fornece a estrutura na qual a funcionalidade de imagem do WPF é baseada. As várias classes de imagens são definidas no namespace System.Windows.Media.Imaging. Para mostrar como é fácil usar a partir de código gerenciado, a Figura 4 mostra a função CopyIconToTiff da Figura 2 reescrita em C# usando as classes wrapper do WPF.
static void CopyIconToTiff(Stream sourceStream,
                           Stream targetStream) {

  IconBitmapDecoder decoder = new IconBitmapDecoder(
    sourceStream,
    BitmapCreateOptions.None,
    BitmapCacheOption.OnDemand);

  TiffBitmapEncoder encoder = new TiffBitmapEncoder();

  foreach (BitmapFrame frame in decoder.Frames) {
    encoder.Frames.Add(frame);
  }

  encoder.Save(targetStream);
}

O valor de BitmapCacheOption.OnDemand corresponde à opção do decodificador WICDecodeMetadataCacheOnDemand usada em código nativo. E, de forma semelhante, o valor de BitmapCacheOption.OnLoad corresponde à opção do decodificador WICDecodeMetadataCacheOnLoad.
Já descrevi como essas opções influenciam quando o decodificador lê as informações da imagem na memória. Existe, no entanto, um efeito colateral adicional do qual você deve estar ciente ao tratar dessas opções em código gerenciado. Considere o que acontece quando você especifica BitmapCacheOption.OnDemand. O decodificador manterá uma referência ao fluxo subjacente e poderá ler a partir dele em algum ponto após o objeto de decodificador do bitmap tiver sido criado. Isso supõe que o fluxo ainda estará disponível. É preciso ter cuidado para que seu aplicativo não feche o fluxo prematuramente. É uma questão de gerenciar a vida útil do fluxo de forma que ele não seja fechado antes que o decodificador tenha terminado com ele.
Isso não afeta o código nativo porque a interface IStream é uma interface COM padrão cuja vida útil é controlada pela contagem de referência. Seu aplicativo pode ter lançado todas as suas referências a ele, mas o decodificador manterá uma enquanto ela for necessária. Além disso, o fluxo é fechado apenas após todos os ponteiros de interface terem sido lançados.


O que vem a seguir?
O WIC fornece uma estrutura incrivelmente eficiente e flexível na qual baseará suas necessidades de imagens. Com um conjunto generoso de codecs e uma API simples, você pode começar a aproveitar vários de seus recursos rapidamente.
Na minha próxima coluna, explorarei alguns dos recursos mais avançados oferecidos pelo WIC. Mostrarei como você pode desenvolver seus próprios codecs e ilustrarei o processo de registro e descoberta, incluindo os recursos de correspondência de padrões, em detalhes. Ainda, corrigirei uma limitação em um dos codecs internos.