Por que o QR Code Funciona Riscado, e o que Essa Folga Custa
Um QR Code colado no balcão vive uma vida difícil. Ele recebe dedo engordurado, respingo de bebida, dobra de papel, sol e às vezes um logo colado bem no meio. E continua funcionando. Isso não é sorte: está desenhado no formato desde o começo, e tem um preço que quase nunca é discutido.
De onde vem a folga
A DENSO WAVE, empresa que criou o QR Code, explica o mecanismo em uma frase:
The QR Code error correction feature is implemented by adding a Reed-Solomon Code to the original data.
O Reed-Solomon não guarda uma cópia dos dados. Ele calcula informação extra que permite reconstruir os pedaços perdidos, e a mesma página descreve a técnica como o método usado em CDs de música, “capaz de fazer correção no nível do byte” e “adequado a erros concentrados”. É por isso que um risco contínuo atravessando o código costuma ser tolerado: o dano fica concentrado, que é justamente o caso em que esse método é forte.
São quatro níveis, e a orientação oficial é escolher pelo ambiente:
Level Q or H may be selected for factory environment where QR Code get dirty, whereas Level L may be selected for clean environment.
O nível M aparece na mesma página como o mais frequentemente escolhido, associado a 15%. Os percentuais dos demais níveis estão numa imagem da página, não no texto, então este guia não os afirma.
O que a folga cobra
Peguei o payload de exemplo do gerador de QR Code Pix, com 125 caracteres, e gerei o mesmo código nos quatro níveis. Estes são os resultados medidos:
| Nível | Versão | Módulos | Área relativa |
|---|---|---|---|
| L | 5 | 37 × 37 | 1,00× |
| M | 6 | 41 × 41 | 1,23× |
| Q | 8 | 49 × 49 | 1,75× |
| H | 9 | 53 × 53 | 2,05× |
O mesmo dado, com o mesmo significado, ocupa o dobro da área no nível mais alto. Olhando pelo outro lado, fixando a versão 6 e variando só o nível, a capacidade cai de 134 caracteres em L para 58 em H. A redundância não aparece do nada: ela ocupa o lugar que seria dos dados.
O nível alto pode piorar a leitura
Aqui está a consequência que costuma passar despercebida. O papel disponível não cresce junto com o nível de correção. Se o adesivo do balcão tem 4 cm de lado, ele tem 4 cm em qualquer nível, e o que muda é o tamanho de cada módulo:
| Nível | Módulos | Tamanho do módulo em 4 cm |
|---|---|---|
| L | 37 | 1,08 mm |
| M | 41 | 0,98 mm |
| Q | 49 | 0,82 mm |
| H | 53 | 0,75 mm |
Módulo menor exige mais resolução da câmera, mais foco e mais proximidade. Para manter no nível H a mesma nitidez por módulo que o nível L tem em 4 cm, o código precisaria ser impresso com quase 5,7 cm.
Ou seja, subir o nível de correção sem aumentar o papel troca um problema por outro: ganha-se tolerância a sujeira e perde-se tolerância a distância. Em ambiente limpo e sob luz razoável, que é o caso da maioria dos balcões, o nível mais alto raramente compensa.
O logo no meio sai do mesmo orçamento
Colar uma marca no centro do código funciona pela mesma razão que um risco funciona: os módulos cobertos são reconstruídos pela redundância. O detalhe é que a folga é uma só. O que o logo consome deixa de estar disponível para a sujeira, a dobra e o desgaste que o adesivo vai sofrer depois.
Um código com logo grande e nível baixo lê bem no dia da impressão e começa a falhar semanas depois, quando o desgaste normal se soma à área já ocupada. Se a decisão for colocar logo, o caminho coerente é subir o nível de correção e aumentar o tamanho impresso junto, em vez de apenas um dos dois.
Como refazer o teste
O trecho abaixo roda com a mesma biblioteca usada pela ferramenta e imprime a versão e o número de módulos para cada nível:
const QR = require("qrcode");
const payload = "00020101021126390014br.gov.bcb.pix..."; // seu copia e cola
for (const nivel of ["L", "M", "Q", "H"]) {
const q = QR.create(payload, { errorCorrectionLevel: nivel });
console.log(nivel, "versão", q.version, "·", q.modules.size, "módulos");
}
Vale trocar o payload pelo seu código real antes de decidir o tamanho da impressão. Um Pix com valor, identificador e descrição preenchidos é bem mais longo que um código simples de chave, e pode subir de versão sozinho, sem que ninguém tenha mexido no nível de correção.
E o que a correção de erro não faz
Convém separar duas coisas que às vezes se confundem. A redundância protege o código contra dano físico, e só isso. Ela não protege contra um código trocado, porque um QR Code falso é um código íntegro que aponta para outro lugar.
Nesse caso a defesa é outra, e está na tela do aplicativo: o nome do recebedor que o banco exibe antes da confirmação vem da consulta ao cadastro de chaves do Pix, não do texto gravado dentro do código. Um código perfeitamente legível, com correção de erro no nível máximo, continua podendo levar o dinheiro para a conta errada.
Fontes e metodologia
A explicação do mecanismo de correção e as características de cada nível vêm da página oficial da DENSO WAVE, empresa que criou o QR Code, aberta na data indicada. A tabela de percentuais dessa página é uma imagem, e por isso só estão citados aqui os valores que aparecem no texto legível: 15% para o nível M e 25% num exemplo do nível Q. Os percentuais de L e de H não foram confirmados na fonte e por isso não são afirmados. Já os números de versão, de módulos e de capacidade foram MEDIDOS: gerei o mesmo payload Pix nos quatro níveis com a biblioteca qrcode usada pela ferramenta do site e li o resultado, e o mesmo teste pode ser refeito com o trecho de código reproduzido no texto. As medidas em milímetros por módulo são divisão simples do tamanho impresso pelo número de módulos.
- QRcode.com — Error Correction Feature DENSO WAVE Incorporated A afirmação de que o QR Code tem capacidade de correção para restaurar dados quando o código está sujo ou danificado; a implementação por meio de código Reed-Solomon somado aos dados originais; a existência de quatro níveis escolhidos conforme o ambiente de operação, com o nível M citado como o mais usado e associado a 15%; a orientação de escolher Q ou H em ambiente sujo e L em ambiente limpo; e a descrição do Reed-Solomon como método de correção usado em CDs de música, capaz de corrigir no nível do byte e adequado a erros concentrados. Consultado em
Perguntas frequentes
O que é a correção de erro do QR Code?
É uma redundância gravada dentro do próprio código. Segundo a DENSO WAVE, que criou o formato, o recurso é implementado somando um código Reed-Solomon aos dados originais, e serve para restaurar a informação quando o código está sujo ou danificado. Não é uma cópia de reserva: é um cálculo que permite reconstruir o que faltou.
Qual nível de correção devo usar?
A página da DENSO WAVE indica escolher pelo ambiente: níveis Q ou H para lugares em que o código fica sujo, e nível L para ambiente limpo. O nível M é apontado como o mais frequentemente escolhido, e é um meio-termo razoável para um QR Code Pix impresso e protegido.
Nível H é sempre melhor?
Não. No teste deste guia, o mesmo payload Pix passou de 37 por 37 módulos no nível L para 53 por 53 no nível H, mais que o dobro da área. Como o papel disponível costuma ser o mesmo, cada módulo fica menor e a câmera precisa chegar mais perto. Escolher H sem aumentar o tamanho impresso pode dificultar a leitura em vez de facilitar.
Por que um QR Code com logo no meio ainda funciona?
Porque o logo cobre módulos que a redundância consegue reconstruir. O espaço coberto sai do mesmo orçamento de correção que existiria para sujeira e riscos, então quanto maior o logo, menos folga sobra para o desgaste real do dia a dia.
A correção de erro protege contra QR Code falso?
Não, são coisas diferentes. A correção recupera dados danificados; ela não diz nada sobre quem gerou o código. No caso do Pix, a conferência que importa é o nome do recebedor que o aplicativo do banco mostra na tela antes da confirmação, que vem da consulta ao cadastro de chaves e não do texto dentro do QR Code.
Qual o tamanho mínimo para imprimir um QR Code Pix?
A regra prática de 3 a 4 cm de lado vale para os níveis mais baixos. Como o número de módulos cresce com o nível, o mesmo código no nível H em 4 cm tem módulos de 0,75 mm contra 1,08 mm no nível L. Se for usar um nível alto, aumente o papel na mesma proporção.
Mais dados deixam o QR Code maior?
Deixam. A versão do código cresce conforme os dados e a redundância pedidos. Um payload Pix com valor, identificador e descrição longa ocupa mais espaço que um código simples de chave, e pode empurrar o desenho para uma versão maior mesmo sem mudar o nível de correção.
Reed-Solomon é usado em outros lugares?
É. A própria DENSO WAVE descreve o método como uma correção matemática usada em CDs de música, entre outros, capaz de corrigir no nível do byte e adequada a erros concentrados. É o mesmo tipo de mecanismo que faz um CD riscado continuar tocando.