Explicação
O que é um QR code?
Um QR code é um código de barras bidimensional que guarda texto numa grade de quadradinhos pretos e brancos. Este guia desmonta um deles — as marcas dos cantos, a área de dados, a informação de reparo — e explica por que essa estrutura decide quanto cabe lá dentro.
Um QR code é uma grade de quadradinhos pretos e brancos que guarda texto. É só isso. Não é um link, não é uma imagem e não é uma conta em lugar nenhum: é uma forma de escrever caracteres de um jeito que uma câmera consiga ler.
A sigla vem de Quick Response, resposta rápida, e descreve o problema para o qual ele foi inventado. Em 1994, na fábrica da Denso Wave, um código de barras comum obrigava a alinhar o leitor com as listras e cabiam apenas uns vinte caracteres. A equipe de Masahiro Hara procurava algo que pudesse ser lido de qualquer ângulo e que guardasse bastante mais. A solução foi passar de uma dimensão para duas: em vez de listras de larguras diferentes, uma malha em que cada célula — cada módulo — vale um bit.
Por que eles estão em todo lugar no Brasil
Vale começar por aqui, porque a resposta brasileira é diferente da de quase todo o resto do mundo.
Em muitos países o QR code passou vinte anos sendo uma curiosidade de marketing, apareceu em cartazes que ninguém escaneava e só virou hábito durante a pandemia, por causa dos cardápios. No Brasil aconteceu outra coisa: o PIX transformou o formato num gesto de pagamento cotidiano. Escanear um código para pagar deixou de ser novidade tecnológica e virou algo que se faz na feira, na barraca de praia, no salão e no aplicativo de banco, várias vezes por semana.
Isso muda duas coisas de forma prática. A primeira é que a habilidade está distribuída: quase ninguém precisa de instrução para apontar a câmera. A segunda, menos confortável, é que a familiaridade também virou superfície de ataque — e é por isso que o golpe do QR code existe aqui em escala, o que tem um guia inteiro só para ele neste site.
O que é cada parte do desenho
Se você olhar um QR code de perto vai ver que nem tudo é aleatório. Há áreas com função específica.
Os três quadrados grandes dos cantos são os padrões de posicionamento. São a primeira coisa que o leitor procura, e a proporção de anéis deles — preto, branco, preto, na relação 1:1:3:1:1 — é um padrão que quase nunca aparece por acaso numa fotografia. Ao encontrar três, o celular sabe onde estão três dos quatro cantos e, portanto, em que ângulo o código está. É por isso que você consegue escanear um código torto, ou de cabeça para baixo, e funciona igual: a orientação é deduzida de qual canto não tem quadrado.
O quadrado pequeno perto do quarto canto é o padrão de alinhamento. Corrige a deformação quando o código está sobre uma superfície curva ou é fotografado em ângulo. Os códigos menores não têm esse padrão porque não precisam; a partir de certo tamanho aparecem vários.
As duas linhas de módulos alternados que ligam os quadrados dos cantos são os padrões de temporização. Elas dizem ao leitor o tamanho exato de um módulo, que é o que permite dividir a malha corretamente mesmo com a foto um pouco fora de foco.
O resto são dados e correção de erros, misturados segundo uma ordem que a norma define.
Como o texto vira quadradinhos
O processo tem três passos e vale entendê-los porque eles explicam quase todas as decisões práticas.
Primeiro, o texto é codificado em bits usando o modo mais compacto que servir. Se só houver dígitos, cada caractere ocupa cerca de 3,3 bits. Se houver maiúsculas e alguns símbolos, 5,5 bits. Se houver minúsculas, acentos ou cedilha, passa-se ao modo byte e cada caractere custa oito bits ou mais. É por isso que um texto em português com acentuação gera um código mais denso do que o mesmo texto sem ela — e por que «cardápio» custa mais que «cardapio» dentro de um padrão.
Segundo, acrescenta-se a informação de correção de erros por meio de um algoritmo chamado Reed-Solomon. Não é um extra: é o que permite que um código continue funcionando com uma parte tampada, riscada ou mal impressa. Há quatro níveis — L, M, Q e H — que recuperam aproximadamente 7%, 15%, 25% e 30% do conteúdo. Quanto mais alto o nível, mais módulos o reparo ocupa e menos espaço sobra para dados.
Terceiro, tudo é posicionado na malha seguindo um percurso em ziguezague e recebe uma máscara: um padrão que se combina com os dados para evitar manchas uniformes grandes ou formas parecidas com os quadrados dos cantos. O codificador testa as oito máscaras possíveis e fica com a que produz o desenho mais equilibrado. Por isso dois códigos com o mesmo conteúdo podem parecer diferentes se forem gerados por ferramentas diferentes: os dois estão corretos.
Por que o tamanho não é você quem decide
O número de módulos por lado não é uma preferência, é uma consequência. O formato tem quarenta versões: a 1 tem 21×21 módulos e cada versão seguinte acrescenta quatro fileiras e quatro colunas, até a 40, de 177×177. O codificador escolhe a menor versão em que os seus dados caibam com o nível de correção que você pediu.
Daí saem as duas regras práticas mais úteis que existem sobre QR code:
- Menos texto, código mais grosso. E módulos grossos são os que sobrevivem a uma impressão pequena, a uma câmera mediana e a um papel que absorve tinta.
- Mais correção de erros, código mais fino. Subir de M para H com o mesmo conteúdo pode aumentar bastante o número de módulos, então só compensa quando você realmente espera dano ou vai cobrir parte do código com um logo.
O que acontece no segundo do escaneamento
Quando você aponta a câmera, o celular faz tudo isso em alguns milissegundos: localiza os três quadrados, deduz a orientação, calcula o tamanho de módulo com os padrões de temporização, corrige a perspectiva, lê os bits, desfaz a máscara, aplica a correção de erros para reparar o que faltar e obtém o texto original.
E então — e só então — decide o que fazer com esse texto. Se começar com
https://, oferece abrir. Se começar com WIFI:, oferece conectar. Se começar
com BEGIN:VCARD, oferece salvar um contato. Esse prefixo é a única diferença
entre um «QR code de Wi-Fi» e um «QR code de link»: os quadradinhos funcionam
exatamente igual, o que muda é o que está escrito neles.
Entender isso é o que evita o erro mais comum do formato, que é esperar que um código faça algo que o conteúdo dele não pede.