Qual é o tamanho máximo do logotipo em um código QR? Medimos
"Correção de erros de 30%" não é um orçamento de logotipo. Fizemos buracos crescentes em códigos em cada nível de EC até um decodificador real desistir e registramos onde quebrou.
O que há de novo aqui: O maior patch centralizado que um código QR tolerou em cada nível de correção de erros, medido fazendo um buraco crescente em um símbolo real e decodificando com jsQR — 4% em L, 7% em M, 12% em Q, 17% em H — além de dois resultados que ninguém publica: danos dispersos quebram um código em 4% onde um blob contíguo sobrevive 17%, e o mesmo patch sobre um padrão de localização quebra em 1%.
Todo guia sobre como colocar um logo em um código QR diz as mesmas duas coisas: use o nível de correção de erros H e lembre-se de que ele pode recuperar 30% do código. A segunda parte é repetida com tanta frequência que se tornou um briefing de design — cobrindo até 30% — mas não é isso que o número significa.
Fomos e medimos o que ele realmente significa.
# O que “correção de erro de 30%” realmente significa
Um código QR não armazena seus dados como pixels que você pode perder alguns. Ele armazena palavras-código: blocos de oito módulos, protegidos pela correção de erros Reed–Solomon. O número principal do Nível H descreve aproximadamente quantas dessas palavras-código podem ser reconstruídas — e parte dessa capacidade é consumida pela sobrecarga da própria codificação antes de você tocar em qualquer coisa.
Duas consequências que importam mais que o número:
- O dano é contado por palavra-código, não por módulo. Arruinar um módulo arruína toda a palavra-código a que pertence.
- Os padrões de localização, padrões de temporização e informações de formato não são cobertos pela correção de erros. É assim que o decodificador encontra o símbolo em primeiro lugar, e não há nada para reconstruí-los.
Então “30%” é um fato sobre a matemática e não uma justificativa sobre a imagem. Aqui está a justificativa real.
# O orçamento de logo medido, por nível
O método, para que você possa executá-lo novamente: codifique https://mqr.sh/AB12CD com o codificador que o MostlyQR fornece (buildMatrix, envolvendo node-qrcode do MIT), fixado na versão 3 do símbolo (29 módulos) em cada nível de correção de erros para que EC seja a única variável. Renderize a 8 pixels por módulo com a zona silenciosa de 4 módulos completa. Pinte de branco um quadrado centralizado, começando em 1% da área do símbolo e crescendo 1% de cada vez, e forneça os pixels para jsQR 1.4.0 após cada etapa. O número registrado é o último tamanho que foi decodificado antes da primeira falha.
| Correção de erros | Maior área branca centralizada que ainda decodificou |
|---|---|
| L | 4% da área do símbolo |
| M | 7% |
| Q | 12% |
| H | 17% |
O Nível H vale aproximadamente quatro vezes o Nível L — uma diferença real, e a razão pela qual todo guia diz para usá-lo. Também está bem longe de 30%.
Como regra prática desses números: no nível H, um logo centralizado ocupando aproximadamente 15% da área do código — um quadrado com aproximadamente 39% da largura do código — está dentro do limite medido com um pouco de espaço de sobra. O limite medido no nível M é 7%, que é um quadrado com cerca de 26% da largura, então aplique a mesma redução e você fica em torno de um quinto.
Nós executamos tudo novamente a 16 pixels por módulo e obtemos resultados idênticos, o que é o resultado esperado: esta é uma propriedade do símbolo, não da renderização.
# Por que um blob é mais barato do que confete
Em vez de um patch contíguo, nós invertemos módulos de dados individuais aleatoriamente no símbolo — deixando cada padrão de localização, temporização e alinhamento intocado — e aumentamos a taxa até a decodificação falhar. Mesmo payload, mesma versão, mesmo decodificador, cinco sementes aleatórias diferentes:
| Correção de erros | Dano máximo espalhado (mediana de 5 execuções) |
|---|---|
| L | 1% de 567 módulos de dados |
| M | 3% |
| Q | 3% |
| H | 4% |
(O símbolo v3 tem 841 módulos, dos quais 567 carregam dados; o resto são padrões de localização, temporização, alinhamento e formato, que este teste deixou intocado.)
Quatro por cento espalhados, contra dezessete por cento em um blob, no mesmo nível.
A razão é a palavra-código. Um quadrado contíguo de 17% arruína um pequeno número de palavras-código completamente. A mesma quantidade de dano espalhado uniformemente arruína uma parte de muitas palavras-código — e uma palavra-código com um módulo ruim está tão quebrada quanto uma palavra-código com oito. A correção de erros contabiliza as perdas de palavras-código, não o dano total.
Isso inverte o instinto usual. Uma única forma limpa em um lugar é a forma mais barata de gastar sua correção de erros. Pintas, uma textura, uma marca d’água semi-transparente ou um filtro de foto em todo o código são o mais caro, mesmo quando parece menos dano.
# Os três cantos que você não deve cobrir
Mesmo teste, mesmo quadrado crescente, movido para duas outras posições:
| Posição do patch | Ponto de falha do Nível H |
|---|---|
| centro | 17% |
| canto inferior direito (sobre o padrão de alinhamento) | 5% |
| canto superior esquerdo (sobre um padrão de localização) | 1% |
No nível L, o caso do canto superior esquerdo falhou na primeira etapa — abaixo de 1%.
Esses cantos são estrutura, não conteúdo. Os três grandes quadrados concêntricos são os padrões de localização, e o menor inserido perto do canto inferior direito é um padrão de alinhamento; entre eles, o decodificador descobre onde o símbolo está, o quão grande é e como está rotacionado ou distorcido. Cubra um e não há como chegar à etapa de decodificação. O nível de correção de erros faz quase nenhuma diferença, porque a correção de erros nunca os protegeu.
É por isso que o lugar seguro para um logo é o meio, e por que “apenas torne-o menor e coloque-o em um canto” é precisamente o oposto.
# O que uma câmera adiciona que este teste não
Tudo acima é um caso limpo, sintético, ideal:
- Um decodificador. jsQR é um decodificador bom e amplamente usado, mas a pilha de câmera de um telefone não é jsQR. Leitores reais variam em como tentam agressivamente um código danificado.
- Pixels perfeitos. Sem desfoque, sem brilho, sem perspectiva, sem impressão. Cada um desses reduz o orçamento.
- Uma área branca limpa. Um logo real tem cor, bordas e suavização contra os módulos por baixo. A placa branca atrás de um logo não é decoração — é o que torna a área coberta inequívoca.
Trate a tabela como um limite superior medido em condições ideais, não um alvo para projetar. Nosso próprio conselho é gastar cerca de dois terços disso.
# Executando isto você mesmo
Cada número acima é impresso por um script em vez de digitado no artigo: draft/mostlyqr/seo/benchmarks/logo.js em nosso repositório. Renderiza o símbolo em cada nível, aumenta cada patch um por cento de cada vez, executa a comparação de dano espalhado em cinco sementes, e executa tudo novamente em uma segunda escala de pixel. Também testa nosso próprio validador para o limite citado no final deste artigo.
# O que fazer de verdade
- Use nível de correção de erros H quando há um logo. Aproximadamente quadruplica seu orçamento, e custa cerca de quatro módulos extras por lado em um link curto — que é uma decisão de tamanho que você pode calcular em vez de adivinhar.
- Mantenha o logo centralizado, e mantenha-o abaixo de cerca de 15% da área do código. Isso é um quadrado com cerca de 39% da largura do código, no nível H.
- Coloque-o em uma placa sólida, para que a área coberta seja limpa em vez de ambígua.
- Nunca deixe nada tocar os três quadrados dos cantos — nem o logo, nem um quadro, nem um corte de canto arredondado.
- Teste a impressão real com um telefone ruim. Cada número aqui diz quais designs valem a pena testar. Apenas o teste diz se funciona.
Se você quiser que a imagem seja o código inteiro em vez de um patch no meio, essa é uma técnica diferente com um orçamento diferente — medimos códigos QR fotográficos separadamente, e eles acabam não gastando nenhuma correção de erros. E se você apenas quer um código com seu logo nele, o gerador do MostlyQR força a correção de erros até o nível H no momento em que um logo é adicionado, mantém a zona silenciosa de 4 módulos, e define o tamanho padrão do logo como 22% da largura do código — 4,8% de sua área, confortavelmente dentro de tudo medido acima.
Uma nota honesta sobre nosso próprio código, já que estamos publicando os números: o código que recusa um logo grande demais usa a figura nominal de 30% de recuperação com uma redução de 15%, então aceitará um logo cobrindo cerca de 25% da área no nível H. Nossa medição diz que o teto real é mais próximo de 17%. O padrão que ninguém muda é seguro por uma margem larga, mas o limite permite mais do que a evidência suporta, e isso é um bug em nosso validador em vez de uma sutileza dos códigos QR, e está na lista de coisas a corrigir.
Perguntas frequentes
Um logotipo pode cobrir 30% de um código QR?
Não. O "30%" no nível de correção de erros H refere-se a palavras de código — blocos de oito módulos que Reed-Solomon pode reconstruir — e parte desse orçamento já é gasta na codificação, não reservada para você. Em nosso teste, o maior quadrado centralizado que pudemos branquear de um código de nível H e ainda decodificar era 17% da área do símbolo. No nível L era 4%. Trate 30% como uma descrição da matemática, não como um subsídio de design.
Qual nível de correção de erros devo usar para um código QR com logotipo?
H, se você puder arcar com o tamanho. Em nossa medição, ele aproximadamente quadruplicou o patch centralizado tolerável em comparação com o nível L (17% contra 4%) ao custo de quatro módulos extras por lado em um link curto. A única ressalva é que a correção de erros e um tamanho impresso pequeno competem pelo mesmo orçamento — um código de nível H com logotipo precisa ser impresso maior, não menor.
Por que meu código QR para de funcionar quando cobro um canto?
Porque os cantos não são dados. Os três quadrados grandes são padrões de localização, o quadrado menor próximo ao canto inferior direito é um padrão de alinhamento, e ambos são como um leitor localiza e alinha o símbolo antes de decodificar qualquer coisa. Eles não são protegidos por correção de erros — não há nada para reconstruir. Em nosso teste, um patch sobre um padrão de localização quebrou a decodificação em 1% da área do símbolo, contra 17% no meio.
Um logotipo em um código QR precisa de uma borda branca?
Na prática, sim, e nossos números assumem uma. Testamos branqueando um quadrado, que é o melhor caso: um buraco limpo, de alto contraste com bordas nítidas que o decodificador pode tratar como uniformemente claro. Um logotipo colocado diretamente nos módulos sem uma placa atrás produz módulos semi-escuros ambíguos ao seu redor, que custam mais do que a mesma área de branco limpo.
- Os códigos QR de foto realmente funcionam? Nossos resultados de teste de decodificaçãoUm código QR que é uma fotografia parece que deve funcionar pior. Medimos o nosso com um decodificador real — desfocado, reduzido e lido da forma como um leitor lê.
- Qual é o tamanho mínimo que um código QR pode ser impresso? Os tamanhos, calculadosNão há um único tamanho mínimo para um código QR. Passamos cinco cargas úteis reais pelo nosso próprio codificador para obter as contagens de módulos e depois convertemos em milímetros.