# Texto, imagens e quantidade de informação

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

Página: https://resumos.rgo.pt/cadeiras/fsc/texto-imagens/

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=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ó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 $2^{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\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\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](https://resumos.rgo.pt/cadeiras/fsc/texto-imagens/#ler-uma-sequ%C3%AAncia-utf-8)

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\times200\times4/8=32000$ bytes. Paleta: $16\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](https://resumos.rgo.pt/cadeiras/fsc/texto-imagens/#calcular-o-tamanho)

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\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](https://resumos.rgo.pt/cadeiras/fsc/texto-imagens/#calcular-o-tamanho)
