Texto, imagens e quantidade de informação
ASCII, Unicode, UTF-8 e cálculo do tamanho de imagens raster e de paletas.
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: .
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ódigo | Bytes hexadecimais | Bits do código transportados |
|---|---|---|
A, U+0041 | 41 | 0 1000001, um byte ASCII |
á, U+00E1 | C3 A1 | 110 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 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
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 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.
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: bytes. Paleta: 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.
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 é 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.