SVG vs Canvas

Postado por: Pedro Rogério em
SVG vs Canvas

A medida em que os browsers vão evoluindo, novas tecnologias surgem, como, por exemplo, o Canvas, um possível concorrente para o SVG (mas atente-se, são tecnologias diferentes), onde inclusive a Microsoft anunciou suporte no IE9. O objetivo desse post é explorar as diferenças entre essas tecnologias, que são voltadas a criar gráficos no navegador, dando-lhe conhecimentos necessários para utilizar SVG ou Canvas de forma eficaz.

O que é SVG?

SVG é a abreviatura de Scalable Vectorial Graphics, que traduzido para o português significa gráficos vetoriais escaláveis. SVG é uma linguagem XML para descrever gráficos bidimensionais sejam eles de forma dinâmica, estática ou animada. Seu diferencial em relação as outros formatos vetoriais é de ser um formato aberto, não pertencendo a nenhuma empresa. Ele foi originalmente criado pelo W3C, responsável pela definição de outros padrões como HTML, XHTML, XML.

Você pode aplicar estilos ao SVG facilmente com o uso de CSS e adicionar comportamento dinâmico com o uso de SVG DOM, e no final pode ‘embedar’ de forma simples arquivos SVG no HTML através da tag object.

Um exemplo simples é do SVG abaixo embedado do HTML:

Saia daqui pois seu browser não possui suporte a SVG.

O código é bem simples, semelhante a inserir vídeos no HTML:

<object data="url/do/arquivo/svg" type="image/svg+xml" width="200" height="200">Seu browser não possui suporte a SVG.</object>

O que é mais complexo é desenhar o SVG, acessem a seguinte URL e vejam o código fonte. Reparem que cada parte do desenho é um elemento no DOM, por isso é recomendado utilizá-lo para interatividade (pois responde melhor a todos os eventos do mouse). Mas devido a criatividade dos desenvolvedores, já criaram até jogos em SVG

O que é Canvas?

O elemento canvas permite no HTML através de uma área determinada na página criar desenhos através de scripts, desenhar e renderizar imagens, permitindo aos desenvolvedores criarem coisas que até então eram possíveis somente com a utilização do Flash, com a vantagem de que com o uso de canvas não precisamos de nenhum plugin de terceiros instalado no navegador.

O canvas foi desenvolvido inicialmente pela Apple para uso dentro do MAC OS X, alimentando aplicações como Widgets do Dashboard e o Safari. Posteriormente foi adotado pelos browsers baseados no motor Gecko e Opera e padronizado pelo WHATWG.

Existem 2 formas de desenhar com canvas, utilizando um contexto 2d ou utilizando um contexto de desenho 3d com WebGL. A primeira opção está mais elaborada e todos os navegadores modernos, incluindo o IE9 dão pleno suporte a essa opção. Já a segunda ainda está em desenvolvimento e na web hoje só se encontram algumas implementações em forma de experimento.

Abaixo você vê um exemplo do código canvas do HTML5:

<canvas id="meu-canvas" width="200" height="200">
Seu browser não possui suporte a tag canvas do HTML5
</canvas>

Agora, com a utilização de JavaScript podemos desenhar qualquer coisa dento do canvas:

var canvas = document.getElementById('meu-canvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = "rgb(255,0,0)";
ctx.fillRect(60, 60, 50, 50);

O resultado do código acima será um quadrado com tamanho de 50×50 px, localizado a 60px do topo e 60 px do laretal dentro da área de desenho do canvas. Veja o mesmo abaixo:

Seu browser não possui suporte a tag canvas do HTML5

Comparativo SVG vs Canvas

Abaixo você tem uma visão geral das vantagens e desvantagens na utilização de SVG e Canvas:

Vantagens
Canvas SVG
  • Alta performance de desenho em contextos 2d
  • Desempenho constante. Tudo é pixel. Só ocorre degradação com o aumento da resolução da imagem.
  • Você pode salvar o resultado em uma imagem png ou jpg por exemplo.
  • Adequado para a geração de gráficos, edição de imagens e manipulações de pixels.
  • Resolução independente – Isso faz do SVG ideal para interfaces multiplataforma, pois permite alterar a escala para qualquer resolução de tela.
  • SVG possui um bom suporte a animações. Os elementos podem ser animados utilizando uma sintaxe declarativa ou via JavaScript.
  • Você tem controle total sobre todos os elementos utilizando a API SVG DOM em JavaScript.
  • SVG é formato de arquivo baseado em XML, o que significa que dependendo da aplicação, a acessibilidade dos documentos pode ser maior do que com a utilização de canvas. Isso faz de SVG a melhor utilização para interfaces de aplicações web
Desvantagens
Canvas SVG
  • Não existem nós DOM para você manipular, tudo alí é pixel.
  • Não existem APIs para animação, você deve recorrer a contadores e outros eventos para atualizar a tela quando necessário.
  • Recursos de renderização de textos ainda são pobres.
  • Pode não ser a melhor opção onde a acessibilidade é o essencial. O canvas lhe fornece uma superfície de desenho sob o contexto que você escolher. Essencialmente isso significa que tudo são pixels. A menos que futuramente seja criada uma API que adicione recursos adicionais para acessibilidade. Por enquanto você pode fornecer o retorno do conteúdo dentro do elemento canvas para aqueles user-agents que não possuem suporte.
  • Canvas não é adequado para Web Sites ou interfaces de aplicativos para o usuário final. Isso occorre porque as interfaces dos aplicativos precisam ser dinâmicas e interativas, e canvas exige que você desenhe manulamente cada elemento da interface.
  • Processamento lento a medida em que aumeta a complexidade do documento. Qualquer coisa que usa muito o DOM acaba se tornando lenta.
  • SVG não é adequado por si só para a criação de jogos. Talvez, a melhor escolha seria a combinação entre SVG e Canvas.

Quais deles escolher?

Cada tecnologia hoje tem seu uso próprio, você não precisa largar agora o SVG em favor do Canvas, ou vice-versa. Você pode usar Canvas para:

  • Interatividade com edição de imagens: cortar, redimensionar, aplicar filtros.
  • Geração de gráficos.
  • Análise de imagens para gerar por exemplo, histogramas.
  • Renderização de jogos.

Você pode usar SVG para:

  • Criar um aplicativo web que independe da resolução do usuário.
  • Criar intefaces interativas.
  • Criação de gráficos.
  • Edição de imagem baseada em vetores.

Como podem ver, cada tecnologia possui seus prós e contras, uní-las em uma aplicação web podem lhe render ótimos resultados.

Referências

Posts Relacionados

Confira também outros artigos interessantes postados aqui no blog.

Gostou desse post?

Assine o nosso Feed RSS, siga-nos no Twitter, ou simplesmente nos recomende a seus amigos!

Sobre Pedro Rogério

Pedro Rogério é desenvolvedor web por paixão, não saberia fazer melhor outra coisa. Além de escrever para o Pinceladas da Web também escreve para o CSS no Lanche, blog voltado ao desenvolvimento front-end.

10 Responses to “SVG vs Canvas”

  1. @Vitor42 disse:

    Excelente post, comparativo bem interessante e ótimas referências. Abraço!

  2. Evandro Oliveira disse:

    Resumo básico: Canvas está para o Photoshop assim como SVG está para o Ilustrator.

  3. Gustavo BOtega disse:

    Ótimo post. Procurei algo a tempos atrás para ler e não encontrei. Mais uma vez trazendo novidade! Parabéns.

  4. [...] código é bem simples, semelhante a inserir vídeos no HTML: view sourceprint? 1.<object data="url/do/arquivo/svg" type="image/svg+xml" width="200" height="200">Seu [...]

  5. [...] os browsers modernos hoje possuem suporte a tag <canvas>, menos o Internet Explorer, portanto, se você quer utilizar a tag canvas e precisa dar suporte ao [...]

  6. Pedro,
    Como sou um entusiasta do SVG nunca entendi porque ele definitivamente nunca explodiu em utilização(talvez por causa da falta de suporte nativo no IE) então como te acompanho a muito tempo, seja pelos blogs quanto twitter…te pergunto:
    – Tu achas que realmente o SVG um dia vai ter o seu lugar ao sol de destaque que acredito que ele mereça ? E isto pode estar próximo de chegar com o IE 9 ?

    Um abraço,
    Leandro.

    • Leandro,

      O SVG já existe desde 1999, se até hoje não emplacou, não vai ser agora que vai emplacar. As pessoas estão cada vez mais entusiasmadas com o poder do Canvas, isso também é um ponto a ser levado em consideração.

  7. [...] código é bem simples, semelhante a inserir vídeos no HTML: view sourceprint? 1.<object data="url/do/arquivo/svg" type="image/svg+xml" width="200" height="200">Seu [...]

  8. Excelente post!!!! Obrigado por compartilhar!
    Abç.

Leave a Reply