Pular para o conteúdo
Vídeo

Como funcionam os QR codes: por que um código rasgado ainda é lido

Um QR code guarda a mensagem e mais bytes de reserva calculados a partir dela, então o leitor consegue reconstruir bytes rasgados, manchados ou cobertos por um logo. Quatro níveis, de cerca de 7 a 30% das palavras de código, e três quadrados nos cantos que você não deve cobrir. Um explicativo de 48 segundos, cada número com fonte.

Publicado em
Leitura
7 min
Tags
  • qr-codes
  • how-it-works
  • explainer
Neste post
  1. Rasgado, manchado, e ainda lido
  2. Bytes de reserva, calculados a partir da mensagem
  3. Dois bytes de reserva para cada byte corrigido
  4. Quatro níveis: de 7 a 30%
  5. Um logo é um dano que ele conserta
  6. Não cubra os cantos
  7. Conclusão
  8. Fontes

Em resumo: um QR code não guarda só a mensagem. Ele acrescenta bytes de reserva calculados a partir dela, a correção de erros Reed–Solomon, a mesma matemática dos CDs de música, então o leitor consegue reconstruir bytes que faltam ou estão errados. Você escolhe quantos: quatro níveis, L, M, Q e H, recuperam cerca de 7, 15, 25 e 30% das palavras de código, e mais bytes de reserva fazem um código maior. É por isso que um logo no meio pode funcionar: para o leitor, é um dano. Os três quadrados dos cantos são outra história: não são dados, servem para o leitor achar e endireitar o código, então a maioria dos leitores precisa deles.

Rasgado, manchado, e ainda lido

A DENSO WAVE, que desenvolveu o QR Code: "QR Code has error correction capability to restore data if the code is dirty or damaged." (o QR Code tem capacidade de correção de erros para recuperar os dados se o código estiver sujo ou danificado). E na lista de recursos: "Data can be restored even if the symbol is partially dirty or damaged." (os dados podem ser recuperados mesmo que o símbolo esteja parcialmente sujo ou danificado).

O código do vídeo é real: ele diz oliverz.dev. Rasgado num canto, manchado na borda e coberto por um logo no meio, 13 das suas 44 palavras de código estão erradas, e mesmo assim ele é decodificado (testamos com dois decodificadores, jsQR e ZXing).

Bytes de reserva, calculados a partir da mensagem

A DENSO WAVE: "The QR Code error correction feature is implemented by adding a Reed-Solomon Code… to the original data." (a correção de erros do QR Code é feita acrescentando um código Reed-Solomon aos dados originais). O Computer Science Field Guide da Universidade de Canterbury diz de um jeito mais simples: "it adds extra bits to the data so that errors can be corrected." (ele acrescenta bits extras aos dados para que os erros possam ser corrigidos).

A unidade é a palavra de código. A DENSO WAVE: "codeword is a unit that constructs the data area. One codeword of QR Code is equal to 8 bits." (a palavra de código é uma unidade que forma a área de dados. Uma palavra de código do QR Code equivale a 8 bits). E o CS Field Guide: "Each black or white square (“dot” or “module”) corresponds to one bit of data." (cada quadradinho preto ou branco, "ponto" ou "módulo", corresponde a um bit de dados). Então oito módulos formam um byte.

A matemática não é nova. A DENSO WAVE: "Reed-Solomon Code is a mathematical error correction method used for music CDs etc. The technology was originally developed as a measure against communication noise for artificial satellites and planetary probes." (o código Reed-Solomon é um método matemático de correção de erros usado em CDs de música, entre outros. A tecnologia foi criada originalmente contra o ruído nas comunicações de satélites artificiais e sondas planetárias).

Dois bytes de reserva para cada byte corrigido

A DENSO WAVE: "Reed-Solomon Code requires twice the amount of codewords to be corrected." (o código Reed-Solomon precisa do dobro de palavras de código a corrigir). O CS Field Guide: "The maximum number of errors that a Reed-Solomon code can correct is one half of the amount of extra error correcting data added to it." (o número máximo de erros que um código Reed-Solomon consegue corrigir é metade da quantidade de dados extras de correção acrescentados a ele).

O nosso código, no nível mais alto, tem 16 palavras de código da mensagem e 28 de reserva, 44 no total. Metade de 28 é 14, então ele consegue corrigir até 14 palavras de código erradas: 14 de 44 dá cerca de 32% (nossa conta), o "Approx. 30%" (aprox. 30%) da DENSO. No nosso teste o limite ficou exatamente aí: com 14 palavras de código erradas ainda lia, com 15 não dava resultado.

Nenhum resultado, e não um resultado errado. O CS Field Guide: "they won’t read the data incorrectly, instead they just refuse to give any data at all, rather than giving you incorrect data." (eles não leem os dados errado; em vez disso, simplesmente se recusam a dar qualquer dado, em vez de te dar dados incorretos).

Quatro níveis: de 7 a 30%

Do resumo do padrão (ISO/IEC 18004) feito pela DENSO WAVE: "Level L Level M Level Q Level H Approx. 7% of codewords can be restored. Approx. 15% of codewords can be restored. Approx. 25% of codewords can be restored. Approx. 30% of codewords can be restored." (níveis L, M, Q e H: cerca de 7% das palavras de código podem ser recuperadas; cerca de 15%; cerca de 25%; cerca de 30%).

A porcentagem conta palavras de código, não a área que você vê: "*Data restoration rate for total codewords" … "QR Code therefore represents its error correction rate as a ratio of the total codewords." (*taxa de recuperação de dados sobre o total de palavras de código… por isso o QR Code expressa a sua taxa de correção de erros como uma proporção do total de palavras de código).

Mais bytes de reserva ocupam espaço. A DENSO WAVE: "Raising this level improves error correction capability but also increases the amount of data QR Code size." (subir esse nível melhora a capacidade de correção, mas também aumenta a quantidade de dados e o tamanho do QR Code). E: "as the amount of data increases, more modules are required to comprise QR Code, resulting in larger QR Code symbols." (conforme a quantidade de dados aumenta, são necessários mais módulos para formar o QR Code, e os símbolos ficam maiores). Os nossos quatro códigos de oliverz.dev, palavras de código da mensagem + de reserva:

  • L: 19 + 7, 21 × 21 módulos
  • M: 16 + 10, 21 × 21 módulos
  • Q: 13 + 13, 21 × 21 módulos
  • H: 16 + 28, 25 × 25 módulos (no H, os 11 bytes de "oliverz.dev" já não cabem em 21 × 21)

Um logo é um dano que ele conserta

Por isso um logo no meio pode funcionar: o leitor o trata como dano e reconstrói o que ele esconde. No nosso código H, um logo de 7 × 7 módulos deixa erradas 9 das suas 44 palavras de código, dentro do limite de 14.

Mas não sai de graça: ele gasta os bytes de reserva. O FAQ da DENSO WAVE, sobre códigos com cores ou com uma ilustração: "If it is deformed, the QR Code's error correction function is invoked where even a tiny missing or smeared part renders the reading operation impossible, or the response of the operation may become slow." (se ele estiver deformado, a correção de erros do QR Code entra em ação, e aí até uma pequena parte faltando ou borrada pode impedir a leitura, ou deixá-la lenta).

Não cubra os cantos

Os três quadrados grandes não são dados. A DENSO WAVE: "QR Code accomplishes this task through position detection patterns located at the three corners of the symbol." (o QR Code faz isso com padrões de detecção de posição localizados em três cantos do símbolo). A história do código conta que, com eles, "the orientation of their code could be determined regardless of the angle of scanning, which could be any angle out of 360°" (a orientação do código podia ser determinada qualquer que fosse o ângulo de leitura, qualquer um dos 360°).

O CS Field Guide: "Don’t colour in near the three large squares in the corners, as most QR scanners need these to align the image." (não pinte perto dos três quadrados grandes dos cantos, porque a maioria dos leitores de QR precisa deles para alinhar a imagem).

No nosso teste, um adesivo pequeno de 3 × 3 módulos no centro de um quadrado de canto bastou para os dois decodificadores falharem, sem tocar em nenhum byte de dados. O logo cobre 49 módulos e é lido; o adesivo cobre 9 e não é.

Conclusão

  1. Um QR code guarda a mensagem e mais bytes de reserva feitos a partir dela (Reed–Solomon), então o leitor reconstrói bytes rasgados, manchados ou cobertos.
  2. Você escolhe quantos: L, M, Q, H, cerca de 7 a 30% das palavras de código; mais bytes de reserva, um código maior. Um logo no meio é um dano que os bytes de reserva cobrem.
  3. Os três quadrados dos cantos não são dados: servem para o leitor achar e endireitar o código, então a maioria dos leitores precisa deles.

Fontes

O vídeo é animado com código, e o roteiro foi escrito com ajuda de IA; cada citação acima foi conferida com a fonte, e o número marcado como "nossa conta" é nosso. Os códigos são reais (gerados e depois decodificados com jsQR e ZXing), assim como os seus bytes e as contagens de palavras de código. Ilustrativo: o rasgo, a mancha e o logo (uma marca genérica, desenhada exatamente sobre os módulos que testamos), o visor da câmera e o código inclinado, que é o mesmo código desenhado em perspectiva. O desgaste real é menos certinho do que um dano desenhado seguindo os módulos. "QR Code" é marca registrada da DENSO WAVE INCORPORATED. O vídeo é narrado em inglês. Feito com o Shotloop, meu app gratuito para Mac de explicativos feitos com código, corrigidos uma cena de cada vez.

Mais de How It Works

Playlist no YouTube ↗
Acompanhe

Compartilho projetos, experimentos e aprendizados pelo caminho.

Vídeos novos no YouTube, notas curtas no X. Cada post aqui leva aos dois.

YouTube