As 8 máscaras do QR Code e as regras de penalidade
Depois de preencher a matriz com os dados, o codificador ainda faz uma coisa que parece estranha: inverte parte dos módulos segundo uma fórmula. São oito fórmulas possíveis, as oito são testadas e vence a que produzir o símbolo mais fácil de ler.
Por que mascarar
Um conteúdo qualquer pode gerar, por azar, um símbolo com grandes áreas todas escuras, ou com uma sequência de módulos que imita um padrão de localização no meio do código. Nos dois casos o leitor se perde: no primeiro, perde a referência de contraste; no segundo, procura um canto onde não há.
A máscara embaralha esse padrão sem alterar a informação. Ela é aplicada com um XOR apenas sobre os módulos de dados — nunca sobre os localizadores, os temporizadores, os padrões de alinhamento ou as áreas de formato e versão. E o número da máscara usada é gravado na informação de formato, para o leitor desfazer a operação.
As oito fórmulas
Cada fórmula usa a linha (i) e a coluna (j) do módulo. Quando o
resultado é verdadeiro, o módulo é invertido. Aplicadas ao mesmo conteúdo
(https://www.qrcodeja.com.br/especificacao/mascaras, correção M), as oito produzem símbolos com penalidades bem
diferentes:
| Máscara | Condição de inversão | Penalidade | Módulos escuros |
|---|---|---|---|
| 0 | (i + j) mod 2 = 0 |
1.674 | 50% |
| 1 | i mod 2 = 0 |
1.585 | 52% |
| 2 | j mod 3 = 0 |
1.451 | 52% |
| 3 | (i + j) mod 3 = 0 |
1.544 | 50% |
| 4 | (⌊i/2⌋ + ⌊j/3⌋) mod 2 = 0 |
1.565 | 51% |
| 5 | (i·j) mod 2 + (i·j) mod 3 = 0 |
1.520 | 50% |
| 6 | ((i·j) mod 2 + (i·j) mod 3) mod 2 = 0 |
1.604 | 50% |
| 7 | ((i + j) mod 2 + (i·j) mod 3) mod 2 = 0 |
1.520 | 52% |
Neste exemplo, a máscara escolhida pelo codificador foi a 2, com penalidade 1.451 — a menor das oito. Trocar o conteúdo por qualquer outro provavelmente muda a vencedora.
As quatro regras de penalidade
A avaliação é definida pela norma e soma quatro penalidades:
| Regra | O que penaliza | Pontos |
|---|---|---|
| N1 | Cinco ou mais módulos da mesma cor em sequência, na linha ou na coluna. Cinco valem 3 pontos; cada módulo adicional vale mais 1. | 3 + 1 |
| N2 | Cada bloco 2×2 de módulos da mesma cor. | 3 |
| N3 | A sequência 1:1:3:1:1 (escuro-claro-escuro
triplo-claro-escuro) seguida ou precedida de quatro módulos claros — exatamente o padrão de um
localizador aparecendo onde não deveria. | 40 |
| N4 | Desvio da proporção de 50% de módulos escuros, a cada 5 pontos percentuais. | 10 |
A regra N3 tem peso 40 porque é a mais perigosa: um falso localizador no meio do símbolo faz o leitor tentar decodificar a partir do lugar errado. A N4 empurra o símbolo para perto do equilíbrio entre claro e escuro, o que ajuda a câmera a definir o limiar de binarização.
Consequências práticas
- Dois códigos com o mesmo conteúdo podem ter desenhos diferentes se o gerador escolher máscaras diferentes. Ambos são válidos e levam ao mesmo lugar.
- Mudar um caractere muda o desenho inteiro. Não é bug: um bit diferente muda a correção de erro, a intercalação e possivelmente a máscara vencedora.
- Não dá para escolher a máscara por estética. Alguns geradores permitem, mas forçar uma máscara pior aumenta a chance de falha de leitura — o critério da norma existe por um motivo.
Máscara não é criptografia
A confusão aparece com frequência: como o desenho muda completamente ao trocar a máscara, parece que o conteúdo foi embaralhado por segurança. Não foi. A máscara é uma operação de XOR pública, com fórmula publicada na norma, e o número da máscara usada está gravado no próprio símbolo, na informação de formato. Qualquer leitor desfaz a operação em microssegundos.
Isso tem uma consequência prática importante: não existe QR Code com conteúdo protegido. Tudo que entra no símbolo é público para quem tiver a imagem — senha de Wi-Fi, telefone, dados de contato, chave Pix. Se a informação não pode ser lida por terceiros, ela não pode estar dentro de um QR Code; o que pode estar ali é um endereço para um lugar que exige autenticação.
Como o leitor descobre a máscara
A sequência é esta: o leitor encontra os três localizadores pela proporção
1:1:3:1:1, determina a orientação e o tamanho do módulo pelos temporizadores, calcula
a versão pelo número de módulos (ou lê a informação de versão, da versão 7 em diante) e então lê
os 15 bits da informação de formato, que ficam num lugar fixo, ao lado do
localizador superior esquerdo.
Esses 15 bits carregam 5 bits de conteúdo — 2 do nível de correção e 3 do número da máscara — e
10 bits de um código BCH(15,5), capaz de corrigir até 3 bits errados. Depois disso, todo o campo
passa por um XOR com a máscara fixa 101010000010010. Esse XOR existe para evitar que
a informação de formato fique toda clara ou toda escura em alguma combinação — o que criaria uma
área uniforme justamente na região mais crítica do símbolo.
Só depois de decodificar esse campo o leitor sabe qual das oito fórmulas aplicar para desfazer a máscara e chegar aos codewords de dados.
Perguntas frequentes
Por que dois QR Codes do mesmo site são diferentes?
Porque conteúdo diferente (ainda que por um caractere), nível de correção diferente ou máscara diferente produzem matrizes diferentes. Os dois podem apontar para o mesmo endereço e ter desenhos que não se parecem.
Posso escolher a máscara?
A norma permite, e o codificador deste site aceita uma máscara fixa por parâmetro na API. Mas o padrão é deixar a avaliação automática decidir: ela escolhe o símbolo com menor risco de erro de leitura.
A máscara altera o conteúdo do código?
Não. É uma operação reversível de XOR sobre os módulos de dados; o leitor descobre qual máscara foi usada na informação de formato e a desfaz antes de decodificar.
O que acontece se a informação de formato for danificada?
Ela é gravada duas vezes, em lugares diferentes do símbolo, e protegida por um código BCH(15,5) que corrige até 3 bits errados. Só quando as duas cópias são destruídas o leitor desiste.