Como Funcionam os Códigos QR: A Engenharia Por Trás de Cada Leitura
Você quase certamente escaneou um código QR esta semana. Menus de restaurantes, ingressos para eventos, embalagens de produtos e telas de pagamento dependem desses familiares quadrados em preto e branco. Mas você já se perguntou por que pode colocar o logotipo de uma empresa no centro de um código QR e ele ainda assim ser lido perfeitamente? A resposta está no fundo de um ramo da matemática chamado correção de erros Reed-Solomon, e entendê-la revela quão elegantemente esses símbolos são projetados.
Este artigo explica como os códigos QR funcionam desde o início: sua origem, sua anatomia, os quatro modos de codificação, os níveis de correção de erros, os padrões de mascaramento e por que alguns códigos QR se recusam a ser lidos. Nenhum conhecimento prévio de engenharia é necessário.
Uma Breve História das Origens
Os códigos QR foram inventados em 1994 por Masahiro Hara, um engenheiro da Denso Wave, uma subsidiária da Toyota. O caso de uso original era simples: rastrear peças automotivas no chão de uma fábrica. Os códigos de barras da época só podiam conter cerca de 20 caracteres alfanuméricos e exigiam alinhamento preciso com o scanner. A equipe de Hara precisava de algo que pudesse conter um número de peça completo, ser lido de qualquer ângulo e decodificar aproximadamente dez vezes mais rápido do que um código de barras padrão.
O nome "QR" significa Quick Response (resposta rápida), uma referência a esse objetivo de velocidade. A Denso Wave lançou o padrão publicamente e optou por não impor sua patente, razão pela qual os códigos QR se espalharam globalmente sem atritos de licenciamento.
A Anatomia de um Código QR
Um código QR não é uma disposição aleatória de quadrados pretos e brancos. Cada região tem um propósito específico.
Padrões de Localização
Os três grandes padrões de localização, os símbolos de quadrado dentro de um quadrado em três cantos de cada código QR, são a primeira coisa que um scanner procura. Sua proporção característica 1:1:3:1:1 de módulos escuro-claro-escuro-claro-escuro pode ser detectada em qualquer ângulo de rotação, a qualquer distância e mesmo quando o código está ligeiramente distorcido. Eles informam ao scanner: aqui está o código, aqui está sua orientação e aqui está sua escala.
Um quarto canto é deixado vazio intencionalmente. Essa assimetria informa ao scanner qual lado está para cima.
Padrões de Alinhamento
Códigos QR maiores (Versão 2 e superiores) incluem padrões de alinhamento menores espalhados pelo símbolo. Sua função é corrigir superfícies curvas ou distorcidas. Se você já escaneou um código QR impresso em uma garrafa cilíndrica ou em relevo em uma superfície arredondada, foram os padrões de alinhamento que tornaram isso possível.
Padrões de Temporização
Entre os padrões de localização correm padrões de temporização: tiras alternadas de um módulo de largura em preto e branco. Funcionam como uma régua, permitindo ao scanner contar linhas e colunas com precisão, mesmo que a imagem esteja ligeiramente inclinada.
Informações de Formato
Duas tiras envolvendo os padrões de localização armazenam as informações de formato: o nível de correção de erros e o padrão de mascaramento em uso. De forma crucial, esses dados são codificados usando um código BCH (15,5), um tipo de código corretor de erros, para que o formato possa ser lido mesmo que grandes porções do símbolo principal estejam danificadas. Antes de o scanner poder decodificar qualquer dado, ele deve ler as informações de formato.
Módulos de Dados
O restante do símbolo consiste em módulos de dados: a carga útil codificada real. Os dados são armazenados em bytes de 8 bits e lidos em um padrão de zigue-zague específico, começando pelo canto inferior direito e movendo-se para cima em colunas de dois módulos de largura. A ordem de leitura evita as regiões funcionais (padrões de localização, padrões de alinhamento, faixas de temporização e faixas de formato).
Os Quatro Modos de Codificação
Os códigos QR suportam quatro maneiras de representar dados, cada uma com um conjunto de caracteres e capacidade diferentes. Na Versão 1 (o menor código QR possível, 21x21 módulos) com o Nível de Correção de Erros M, os limites são:
| Modo |
Conjunto de Caracteres |
Capacidade |
| Numérico |
Dígitos 0-9 |
34 dígitos |
| Alfanumérico |
0-9, A-Z, espaço e 9 símbolos |
20 caracteres |
| Byte |
Quaisquer dados de 8 bits, incluindo UTF-8 |
14 bytes |
| Kanji |
Caracteres japoneses de byte duplo |
8 caracteres |
Os codificadores escolhem o modo (ou a combinação de modos) que comprime mais dados no menor número de módulos. Uma URL como https://morefreetools.com usa o modo Byte porque contém letras minúsculas que não estão no conjunto alfanumérico.
Correção de Erros Reed-Solomon: Por Que os Códigos QR Sobrevivem a Danos
Este é o coração do artigo. Entender a correção de erros Reed-Solomon explica o truque do logo e muito mais.
Reed-Solomon não é exclusivo dos códigos QR. O mesmo algoritmo protege dados em CDs, DVDs, discos Blu-ray, unidades de armazenamento usando arranjos RAID e até sinais enviados de volta pelas sondas Voyager no espaço profundo. Toda vez que você toca um CD riscado e não ouve falhas, Reed-Solomon está trabalhando em segundo plano.
Como Funciona (Conceitualmente)
Pense em um arranjo de discos RAID-5. Se você tem quatro unidades e uma falha completamente, o sistema RAID pode reconstruir cada byte que estava na unidade com falha usando dados de paridade distribuídos pelas outras três. Nenhum dado é perdido mesmo que toda uma unidade tenha desaparecido.
Reed-Solomon funciona com um princípio semelhante, mas matematicamente. O codificador trata os bytes de dados como coeficientes de um polinômio. Em seguida, avalia esse polinômio em um conjunto de pontos adicionais e acrescenta esses valores à mensagem como palavras de código de verificação. A mensagem codificada agora é mais longa do que os dados originais, mas carrega redundância suficiente para que um decodificador possa reconstruir o polinômio original, e portanto os dados originais, mesmo que algumas palavras de código tenham sido corrompidas ou apagadas completamente.
De forma crucial, Reed-Solomon não apenas detecta erros. Ele os corrige. Desde que o número de palavras de código danificadas permaneça dentro do orçamento de correção de erros, os dados originais são completamente recuperáveis sem perda.
Os Quatro Níveis de Correção de Erros
Os códigos QR oferecem quatro níveis de correção de erros. Níveis mais altos sacrificam capacidade (mais módulos são usados para palavras de código de verificação) em troca de resiliência.
| Nível |
Nome |
Capacidade de Recuperação |
| L |
Baixo |
7% das palavras de código |
| M |
Médio |
15% das palavras de código |
| Q |
Quartil |
25% das palavras de código |
| H |
Alto |
30% das palavras de código |
Por Que os Códigos QR com Logos Funcionam
Esta é a percepção fundamental. Quando um designer coloca um logo no centro de um código QR, o logo cobre fisicamente módulos de dados. Do ponto de vista do scanner, esses módulos simplesmente estão ausentes, exatamente como uma unidade com falha na analogia RAID.
Se o código QR foi gerado no Nível H, até 30% do símbolo pode ser destruído e os dados ainda são completamente recuperáveis. O logo substitui dados que a camada Reed-Solomon pode reconstruir a partir das palavras de código de verificação restantes. Isso não é um hack ou a exploração de alguma falha. É um design intencional: o padrão foi construído com exatamente esse tipo de dano físico em mente. A Denso Wave estava pensando em códigos de barras impressos em pisos de fábricas sujas, não em equipes de marketing adicionando logos, mas a matemática não se importa com a intenção.
A regra prática: se o seu código QR terá um logo, sempre gere-o no Nível H. Mantenha o logo cobrindo menos de 30% da área do símbolo e centralize-o para evitar obscurecer os padrões de localização nos cantos.
Padrões de Mascaramento: Prevenindo a Confusão do Scanner
Depois que as palavras de código de dados são colocadas no símbolo, o codificador aplica um padrão de mascaramento. Existem 8 máscaras padrão, cada uma definida como uma fórmula XOR simples aplicada a cada módulo de dados. Por exemplo, o padrão de máscara 0 inverte cada módulo em uma posição onde (linha + coluna) mod 2 == 0.
Por quê? Os scanners podem ter dificuldade com grandes regiões uniformes da mesma cor. Um bloco de branco ou um bloco de preto confunde algoritmos que procuram as proporções específicas dos padrões de localização. O mascaramento decompõe essas regiões introduzindo um padrão alternado controlado.
O codificador testa todas as 8 máscaras e avalia cada resultado em relação a 4 regras de penalidade que penalizam coisas como: sequências de módulos da mesma cor com mais de 5 seguidos, blocos 2x2 da mesma cor, padrões que se assemelham aos padrões de localização e proporções desequilibradas de módulos escuros em relação aos claros. A máscara com a pontuação de penalidade total mais baixa é a usada no símbolo final.
Versão e Capacidade: Da Versão 1 à Versão 40
Os códigos QR existem em 40 versões. A Versão 1 tem 21x21 módulos. Cada incremento de versão adiciona 4 módulos tanto à largura quanto à altura, portanto a Versão 40 tem 177x177 módulos.
Na Versão 40 com o Nível L de correção de erros (a menor redundância, a maior capacidade):
- 7.089 dígitos numéricos
- 4.296 caracteres alfanuméricos
- 2.953 bytes (cerca de 2,9 KB de dados binários)
- 1.817 caracteres Kanji
Níveis de correção de erros mais altos reduzem essas capacidades porque mais módulos são consumidos pelas palavras de código de verificação. O gerador de código QR que você escolher selecionará automaticamente a versão mínima que se encaixa nos seus dados no nível de correção de erros escolhido.
Por Que Alguns Códigos QR Falham na Leitura
Nem todo código QR é lido na primeira tentativa. Estas são as causas mais comuns de falha:
Contraste insuficiente. Um código QR precisa de forte contraste entre módulos escuros e claros. Imprimir cinza escuro sobre cinza médio, ou usar uma cor muito clara sobre branco, reduz a proporção de contraste abaixo do que a maioria dos scanners consegue processar. O padrão recomenda uma proporção de contraste mínima de 4:1.
Zona silenciosa ausente ou estreita. Todo código QR deve ser cercado por uma borda em branco chamada zona silenciosa, com pelo menos 4 módulos de largura em todos os lados. Imprimir o código muito próximo a outros elementos de design, ou até a borda de um rótulo, elimina a zona silenciosa e causa falhas de leitura.
Dados demais para a versão. Se o codificador for forçado a usar uma versão muito pequena com um nível alto de correção de erros para manter o código compacto, os módulos ficam muito pequenos. Impressos em tamanhos físicos pequenos, os módulos podem ser refinados demais para a câmera de um telefone resolver.
Superfícies reflexivas. Imprimir um código QR em papel brilhante, metal ou vidro pode causar reflexo que apaga partes do símbolo. Acabamentos foscos são muito mais confiáveis para leitura.
Ângulo de leitura extremo. Escanear em um ângulo maior do que cerca de 45 graus introduz distorção de perspectiva suficiente para que os padrões de localização e alinhamento não consigam compensar. Mantenha a leitura o mais perpendicular possível na prática.
Símbolo danificado ou sujo. Além do orçamento de correção de erros, o dano físico realmente impede a decodificação. Um código QR no Nível H pode sobreviver a 30% de danos; um código no Nível L só pode sobreviver a 7%.
Códigos QR Dinâmicos vs. Estáticos
Existe uma distinção prática importante entre dois tipos de códigos QR encontrados no cotidiano.
Um código QR estático codifica a URL de destino final (ou outros dados) diretamente no símbolo. Se a URL mudar, você precisa gerar e reimprimir um novo código QR completamente. Códigos estáticos são simples e não têm dependências de infraestrutura contínuas.
Um código QR dinâmico codifica uma URL de redirecionamento curta (geralmente hospedada por um serviço de código QR). Quando alguém o escaneia, seu telefone busca a URL de redirecionamento, que aponta para o destino real. O destino real pode ser alterado no painel do serviço a qualquer momento sem regenerar ou reimprimir o código QR. Códigos dinâmicos são úteis para campanhas impressas onde o destino pode precisar de atualização após os materiais serem distribuídos.
Observe que os códigos dinâmicos dependem do serviço de redirecionamento permanecer operacional. Um código estático funciona indefinidamente, enquanto a URL de destino estiver ativa.
Perguntas Frequentes
Por que um código QR com um logo ainda é lido?
Um logo colocado sobre um código QR destrói fisicamente alguns módulos de dados. No entanto, os códigos QR gerados no Nível de Correção de Erros H podem recuperar até 30% das palavras de código danificadas usando a matemática Reed-Solomon. O logo essencialmente aciona o mesmo mecanismo de recuperação que o dano físico. Enquanto o logo cobrir menos de 30% do símbolo e estiver centralizado para evitar os padrões de localização nos cantos, o código será lido.
O que é o algoritmo Reed-Solomon em termos simples?
Reed-Solomon é uma técnica matemática para adicionar redundância estruturada aos dados. O codificador representa seus dados como um polinômio e calcula valores de verificação adicionais em pontos extras desse polinômio. Se alguns dados forem perdidos ou corrompidos posteriormente, o decodificador usa esses valores de verificação extras para reconstruir matematicamente o polinômio original, recuperando os dados perdidos. A mesma técnica protege CDs, DVDs e a telemetria de naves espaciais.
Qual é a quantidade máxima de dados que um código QR pode armazenar?
Um código QR de Versão 40 no Nível de Correção de Erros L pode armazenar até 7.089 dígitos numéricos, 4.296 caracteres alfanuméricos ou 2.953 bytes de dados binários. Na prática, a maioria dos códigos QR codifica URLs curtas e usa muito menos do que a capacidade máxima, o que permite uma versão menor e uma leitura mais fácil.
Devo usar o Nível H de correção de erros para todos os códigos QR?
Não necessariamente. O Nível H produz um símbolo mais denso e maior para a mesma carga útil de dados porque mais módulos são usados para palavras de código de verificação. Se o seu código QR não tiver logo e for impresso de forma limpa em um tamanho razoável, o Nível M (15% de recuperação) geralmente é suficiente e produz um código mais fácil de ler. Use o Nível H ao adicionar um logo, ao imprimir em uma superfície potencialmente suja ou quando o código precisar ser muito pequeno.
O que é a zona silenciosa e por que ela importa?
A zona silenciosa é a borda branca em branco que circunda o símbolo do código QR. Deve ter pelo menos 4 módulos de largura em todos os lados. Sem a zona silenciosa, um scanner não consegue determinar onde o símbolo termina e onde o design circundante começa. Os padrões de localização dependem da detecção de uma transição do branco (zona silenciosa) para o primeiro módulo escuro. Elimine a zona silenciosa e até um código QR perfeitamente formado não será lido de forma confiável.
Pronto para gerar um código QR com todo esse conhecimento em mãos? Use o Gerador de Código QR no MoreFreeTools para criar códigos em qualquer nível de correção de erros, adicionar um logo e baixar um arquivo pronto para impressão.