Texto, imagens e quantidade de informação

ASCII, Unicode, UTF-8 e cálculo do tamanho de imagens raster e de paletas.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

O byte 41 pode ser o inteiro 65, a letra A em ASCII ou um canal de um píxel. O formato determina as unidades, a sua largura e o significado dos códigos.

ASCII e Unicode

ASCII define 128 códigos, portanto 7 bits, incluindo letras latinas sem acentos, dígitos, pontuação e controlos. O código de A é 65, ou 0x41; o de a é 97, ou 0x61. Os dígitos 0 a 9 têm códigos consecutivos de 48 a 57, por isso para obter o valor do carácter 7 subtrai o código de 0: 55−48=755-48=7.

Unicode atribui pontos de código a caracteres, mas um ponto de código ainda não é uma sequência de bytes. UTF-8 e UTF-16 são formas de o codificar.

UTF-8 usa de 1 a 4 bytes por ponto de código. Os caracteres ASCII mantêm os mesmos códigos num byte. á, ponto de código U+00E1, usa dois bytes: C3 A1. UTF-16 usa uma unidade de 16 bits para muitos pontos de código e um par de unidades para outros. Não assumes um tamanho fixo de dois bytes para qualquer carácter.

Uma letra visível também pode corresponder a mais de um ponto de código, como uma letra seguida de um acento combinatório. Por isso, número de bytes, pontos de código e símbolos visíveis podem diferir.

Ler uma sequência UTF-8

Nos bytes de dois caracteres ASCII A7, temos 41 37. Em UTF-8, Aá é 41 C3 A1: três bytes. A sequência inicial 110 de C3 anuncia um carácter de dois bytes. O byte seguinte começa por 10 e continua o mesmo ponto; não inicia outra letra.

Um programa que avança um byte de cada vez conta bytes corretamente, mas não necessariamente letras. Em Aá (41 C3 A1), há 3 bytes e 2 pontos de código: um contador de bytes devolve 3, enquanto um contador de pontos UTF-8 reconhece C3 como início de 2 bytes e salta o byte de continuação A1. Nas rotinas simples desta cadeira, a classificação de letras e dígitos trabalha sobre ASCII, e essa hipótese faz parte do contrato da rotina.

Ponto de códigoBytes hexadecimaisBits do código transportados
A, U+0041410 1000001, um byte ASCII
á, U+00E1C3 A1110 00011 e 10 100001

Em á, retira os prefixos 110 e 10: os bits úteis são 00011 100001, que valem 0xE1. O primeiro byte indica a largura; o segundo continua o mesmo ponto de código, não inicia outra letra.

Imagens raster e vetoriais

Uma imagem raster é uma grelha de píxeis. Uma imagem vetorial descreve formas, posições e atributos. Aumentar muito uma raster expõe a grelha. Uma forma vetorial pode ser redesenhada à nova resolução.

Em RGB, os canais vermelho, verde e azul são aditivos. Com 8 bits por canal, 00 00 00 é preto e FF FF FF é branco. São 24 bits por píxel, com 2242^{24} combinações. Um canal alfa adicional de 8 bits dá 32 bits por píxel.

CMYK descreve tintas subtrativas usadas na impressão. O suporte branco corresponde à ausência de tinta, e o canal preto permite obter preto sem depender apenas da mistura dos outros três canais. Não troques o modelo de luz emitida pelo de tinta sobre papel.

Calcular o tamanho

Uma raster de 640 por 480 píxeis, com 24 bits por píxel e sem compressão, requer

640×480×24/8=921 600 bytes=900 KiB,640\times480\times24/8=921\,600\ \text{bytes}=900\ \text{KiB},

que é o tamanho dos dados dos píxeis; um formato pode acrescentar cabeçalho, alinhamento das linhas, metadados e outros campos.

Numa imagem indexada de 8 bits por píxel, cada píxel guarda um índice para uma paleta de até 256 cores. Para a mesma imagem, os índices ocupam 307 200 bytes, e se a paleta usar 3 bytes por cor, acrescentam-se 256×3=768256\times3=768 bytes: total 307 968, antes do cabeçalho. A paleta não garante que a imagem original tenha só 256 cores, por isso convertê-la pode perder cores.

Compressão sem perdas permite reconstruir os dados exatamente; compressão com perdas pode alterar os valores para reduzir o tamanho. JPEG é normalmente usado com perdas em fotografias, por isso o tamanho final não se obtém só por largura vezes altura. TIFF admite diferentes modos de armazenamento e compressão, por isso a extensão não determina uma razão de compressão fixa.

Exercícios

Comprimento e terminação

A string Aá7 em UTF-8 é guardada com byte zero final. Quantos bytes ocupa? Distingue-os dos pontos de código.

Pista

A e 7 são ASCII; á usa dois bytes.

Mais uma pista

O terminador ocupa espaço mas não é uma letra.

Solução

São 1+2+1+1=5 bytes: 41 C3 A1 37 00. Há três pontos de código no texto. O zero final é uma convenção da string terminada, não faz parte dos três caracteres. Uma rotina que conta bytes até zero dá 4, não 3.

Confere a tua resposta:

  • Cinco bytes, incluindo o terminador: 41 C3 A1 37 00.
  • Três pontos de código no texto, quatro bytes antes do terminador.

Erros frequentes

Não assumas um byte por letra acentuada.

Voltar à explicação
Dados e paleta

Uma imagem 320×200 tem 4 bits por píxel e paleta de 16 cores RGB de 24 bits. Sem cabeçalho nem padding, quantos bytes ocupa?

Pista

Calcula os índices e a paleta separadamente.

Mais uma pista

Dois índices de 4 bits cabem num byte.

Solução

Índices: 320×200×4/8=32000320\times200\times4/8=32000 bytes. Paleta: 16×3=4816\times3=48 bytes. Total 32048 bytes. Os 4 bits não guardam RGB diretamente, guardam um índice de 0 a 15.

Erros frequentes

Não multipliques todos os píxeis por 3 bytes quando o armazenamento é indexado, porque cada píxel guarda um índice, não um tripleto RGB.

Voltar à explicação
O tamanho de uma JPEG

Uma fotografia RGB 800×600 é gravada como JPEG. Consegues determinar o tamanho exato do ficheiro só pela resolução? Calcula apenas os dados RGB sem compressão.

Pista

A conta de píxeis dá a versão sem compressão.

Mais uma pista

A compressão depende do conteúdo e dos parâmetros.

Solução

O tamanho RGB sem compressão é 800×600×3=1440000800\times600\times3=1440000 bytes. O ficheiro JPEG pode ser diferente conforme o conteúdo, qualidade e metadados; a resolução não permite determinar o tamanho exato. A possibilidade de perdas também impede assumir a recuperação dos mesmos valores RGB, porque o descodificador reconstrói uma aproximação.

Confere a tua resposta:

  • RGB sem compressão 1440000 bytes.
  • O tamanho JPEG exato exige conteúdo e parâmetros.

Erros frequentes

Não transformes uma razão de compressão típica num tamanho garantido.

Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.