Neste artigo, comento sobre minha experiência com o QRCode, um código de barras de duas dimensões desenvolvido e muito utilizado no Japão.
Eu estava trabalhando em um sistema que gerava um comprovante que continha um código de autenticação de 1024bits. Para conferir se o mesmo era válido, seria extremamente entediante ter que digitar 2048 caracteres de um código hexadecimal, além das informações de data, horário e código do cliente. O QRCode foi a solução.
Ensinarei como gerar o QRCode utilizando um script PHP ou Perl disponível livremente, e como realizar sua leitura posteriormente a partir de uma foto do código impresso. Essa foto pode ser tirada inclusive com uma câmera VGA de celular de baixa qualidade.
INTRODUÇÃO AO QRCODE
Uma das características do QRCode é a alta velocidade de leitura - a sigla "QR" vem de "Quick Response". O QRCode é muito popularizado no Japão, e a maioria dos celulares japoneses hoje são fabricados com leitor embutido para QRCode. Existem também aplicativos J2ME disponíveis livremente na Internet para permitir que celulares que não venham com esse recurso já embutido também possam ler o QRCode.
CAPACIDADE DE ARMAZENAMENTO
O QRCode codifica os dados de maneira diferente dependendo do tipo de dados que for fornecido. A seguir, temos a capacidade de armazenamento para cada tipo de dados.
- Dados numéricos ([0-9])
Capacidade máxima: 7089 dígitos.
- Dados alfanuméricos ([0-9A-Z$%*+./:-])
Capacidade máxima: 4296 caracteres.
- Bytes raw (caracteres de 8-bit)
Capacidade máxima: 2953 bytes.
- Escrita em Kanji
Capacidade máxima: 1817 caracteres.
CORREÇÃO DE ERROS
Existem quatro níveis de correção de erros em QRCode. Dependendo do nível escolhido na codificação, uma porcentagem máxima diferente de erros de leitura pode ser corrigida sem perda dos dados.
- Nível L: Correção de até 7% de erros.
- Nível M: Correção de até 15% de erros.
- Nível Q: Correção de até 25% de erros.
- Nível H: Correção de até 30% de erros.
GERANDO UM QRCODE COM UM SCRIPT PHP
Agora que já sabemos das características básicas do QRCode, podemos gerar nossos primeiros códigos. Existe um script escrito por Y. Swetake com versões em PHP e em Perl que gera uma imagem com o QRCode a partir de uma entrada. Esse script é disponível livremente sob uma licença BSD-like, bastante permissiva e não-viral. Nos concentraremos aqui na versão em PHP.
Os requisitos mínimos do script são bastante modestos: PHP4.1 e gd1.6. Ele está disponível no site de Y. Swetake, em http://www.swetake.com/qr/qr_cgi_e.html.
O script dá como saída uma imagem gerada a partir dos seguintes parâmetros, que devem ser passados via GET ao mesmo:
- d=dados: Dados a serem codificados.
- e=nivel: Nível de correção de erros desejado (L, M, Q ou H).
- s=tamanho: Tamanho em pixels de cada quadradinho do código.
- t=tipo: Tipo de imagem - P para PNG ou J para JPEG.
O único parâmetro obrigatório é o "d". O nível de correção de erros utilizado por padrão é o M, o tamanho padrão é de 4 pixels por quadradinho, e o tipo de imagem gerada padrão é PNG.
Abaixo, alguns exemplos de uso do script:
LENDO UM QRCODE
Realizei testes com dois softwares de leitura distintos. Um deles é opensource, e disponível em http://qrcode.sourceforge.jp. O outro é um software comercial de uma empresa chamada Tasman. A Tasman vende um SDK de leitura de diversos tipos de códigos de barra para desenvolvedores Java, mas disponibiliza gratuitamente um software sem limitações (não se engane pelo nome "demo") que usa esse SDK em http://www.tasman.co.uk/bars/bardemo.jar.
As fotos dos QRCodes foram tiradas com uma câmera VGA (640×480) de baixa qualidade, demonstrando a facilidade de leitura desse tipo de código.
O leitor opensource ainda não possui boas capacidades de processamento da imagem antes da decodificação, e portanto precisa de uma imagem mais limpa para funcionar. Abaixo um screenshot do reconhecimento a partir de uma foto tirada de um QRCode exibido no monitor de um computador:

O leitor da Tasman foi capaz de fazer um melhor tratamento da imagem antes da decodificação. Abaixo um screenshot do reconhecimento a partir de uma foto tirada de um QRCode impresso em uma folha de papel por uma impressora jato de tinta convencional:

CONCLUSÃO
Para aplicações que necessitam armazenar uma quantidade relativamente grande de dados em forma impressa, o QRCode é uma excelente solução. Existe software livre de qualidade para lidar com o código, que pode ser utilizado facilmente.
Outra das vantagens é o uso sem preocupação com patentes. A companhia na qual o QRCode foi desenvolvido, e que é dona de suas patentes, cedeu permissão para que qualquer um utilizasse o QRCode livremente, sem pagar royalties.