Escolar Documentos
Profissional Documentos
Cultura Documentos
Orientadores:
Prof. Ricardo Luis Barbosa
Unoeste – FIPP
Presidente Prudente – SP
1998
FRANCISCO ASSIS DA SILVA
_________________________________
Prof. Ricardo Luis Barbosa
UNOESTE – FIPP / Orientador
_________________________________
Prof. Almir Olivette Artero
UNOESTE – FIPP / Co-Orientador
ii
Dedicatória
iii
Agradecimento
iv
“São fúteis e cheias de erros as ciências
que não nasceram da experimentação,
mãe de todo conhecimento.”
Leonardo da Vinci
v
RESUMO
Atualmente, com a crescente demanda por imagens digitais nas mais diversas
áreas, tais como: entretenimento, medicina etc., são necessários dispositivos com grande
capacidade de armazenamento e meios rápidos de transmissão. Estes equipamentos e
materiais ainda apresentam altos custos; uma solução para este problema, são as técnicas
de compressão de imagens, para que se possa reduzir o espaço de armazenamento e o
tempo de transmissão.
A compressão de imagens usando a especificação JPEG (Joint Photographic
Experts Group) apresenta altas taxas de compressão. Este padrão tem como base a
Transformada Discreta do Cosseno, que aplicada a blocos 8x8, descorrelaciona os dados
e muitos coeficientes são desprezados (quantização), por serem desnecessários, o que
garante a alta taxa de compressão.
vi
ABSTRACT
Nowadays, with the growing demand for digital images in the most several
areas, such as: entertainment, medicine etc., it’s necessary devices with great storage
capacity and fast means of transmission. These equipments and materials still present
high costs; a solution for this problem, are the techniques of image compression, to
reduce the storage space and the time of transmission.
The compression of images using the specification JPEG (Joint Photographic
Experts Group) presents high compression rates. This pattern has is based on the
Discrete Cosine Transform, that applied to blocks 8x8, makes a uncorrelation of the data
and many coefficients are despised (quantization), for being unnecessary, what
guarantees the high compression rate.
vii
ÍNDICE
viii
LISTA DE ABREVIATURAS E SIGLAS
ix
LISTA DE FIGURAS E TABELAS
Figuras
x
de cada nível de cinza [apud BAXES] ................................ 22
Figura 18 – Árvore de Huffman [apud BAXES] ................................... 22
Figura 19 – Processo de compressão JPEG ........................................... 25
Figura 20 – Processo de descompressão JPEG ...................................... 26
Figura 21 – Bloco após quantização [apud GONZALEZ] .................... 31
Figura 22 – Zig-zag num bloco de 8 x 8 [apud NELSON] .................... 32
Tabelas
xi
INTRODUÇÃO
1
• Diminuição da quantidade de armazenamento requerido pela imagem;
• Distorção resultante provocado pela eliminação dos dados não necessários da
imagem;
• Grau de complexidade computacional.
Dentre os métodos com boa capacidade de compressão e com relativa
distorção da qualidade, estão aqueles que transformam a imagem do domínio espacial
para o domínio da freqüência, que são os chamados métodos por transformada.
Se a quantidade de dados necessários para representar uma imagem pode ser
reduzida, então a quantidade de tempo para transporte também é reduzida. Igualmente, o
total de espaço de armazenamento exigido é reduzido. Deste modo, a compressão de
imagens pode proporcionar economias significantes. Por exemplo, a compressão de uma
imagem na razão de 10:1, permitiria o transporte de dez imagens comprimidas no mesmo
tempo requerido para transportar uma imagem não comprimida.
Esquemas de compressão de imagem ainda podem ser divididos em dois grupos
gerais: compressão sem perda e compressão com perda. Compressão de imagem sem
perda preserva o conteúdo original da imagem, ou seja, a descompressão (processo
inverso à compressão) retorna o conteúdo exato da imagem original. O ganho em espaço
ocupado nem sempre é significativo nessas técnicas. A técnica mais conhecida neste
grupo é a compactação LZW (Lempel Ziv Welch), sendo que os formatos de imagens
TIF (Target Interchange File), GIF (Graphics Interchange Format), PCX (PC
Paintbrush File Format), fazem uso de técnicas de compressão sem perda.
Por outro lado, a compressão de imagem com perda não preserva as
informações originais em sua totalidade, mantendo alguns níveis específicos de qualidade
da imagem, desprezando as informações redundantes e garantindo uma certa qualidade
para a mesma. O objetivo é eliminar o máximo de redundância com o mínimo de perda
visual.
Os métodos mais comuns nesse grupo são baseados em transformações da
imagem para o domínio da freqüência, que representa a imagem em outras bases,
diferentes do plano no qual a imagem é visualizada. Na maioria desses casos, faz-se a
transformação por blocos menores, pois isto reduz o custo computacional. A imagem
original é dividida em sub-imagens (blocos), as quais são então transformadas. A
transformada que se mostrou mais adequada à compressão de imagens digitais é a
2
Transformada Discreta do Cosseno (TDC), que transforma a imagem do domínio
espacial para o domínio da freqüência, decompondo-a em ondas cossenoidais.
A imagem comprimida é obtida, depois da transformação, por meio da
quantização e codificação. O algoritmo mais importante neste grupo foi estabelecido
pelo padrão JPEG (Joint Photographic Experts Group) em meados da década de 80, que
tem por base a TDC e que alcança as mais altas taxas de compressão. O formato de
imagem que faz uso desse algoritmo é o .JPG. O tamanho de cada bloco adotado para o
padrão JPG é 8x8 pixels, pois possui melhor razão entre tempo de cálculo e capacidade
de compressão.
3
Capítulo 1 – TRANSFORMADA DISCRETA DO COSSENO (TDC)
( 2 x + 1)iπ ( 2 y + 1) jπ
N N −1 −1
C (i , j ) = α (i )α ( j ) ∑ ∑ f ( x , y ) cos cos
x =0 y =0 2N 2N
4
para i, j = 0, 1... , N-1, e
1
se x = 0
N
α (x) =
2
p a ra x = 1, 2 , . . . , N - 1
N
onde :
Para aplicar a TDC em uma imagem, é necessário, para efeito de rapidez nos
cálculos e para uma melhor taxa de compressão, dividir a imagem original em blocos, 4
x 4, 8 x 8 ou 16 x 16, podendo usar até blocos de 32 x 32 ou 64 x 64. Em geral, usam-
se blocos 8 x 8. Verificar com resultados obtidos aplicando compressão com diferentes
tamanhos de blocos e fator de qualidade 2 a uma imagem de 384 x 288 com 1 byte por
pixel, ocupando um espaço de armazenamento de 100.592 bytes.
Fator Qualidade 2
Tamanho (compressão) Taxa compressão
Bloco
4x4 35.979 32,53%
Tamanho (compressão) Taxa compressão
Bloco
8x8 22.772 20,59%
Tamanho (compressão) Taxa compressão
Bloco
16x16 14.273 12,91%
Tamanho (compressão) Taxa compressão
Bloco
32x32 8.418 7,61%
Tabela 01 – Resultados de compressão com diferentes tamanhos de blocos
5
A Transformada Inversa do Cosseno (ITDC) é dada por :
( 2 x + 1)iπ cos ( 2 y + 1) jπ
N −1 N −1
f ( x , y ) = ∑ ∑ α (i )α ( j ) C (i , j ) cos
i =0 j =0 2N 2N
No caso de uma dimensão (1D), como por exemplo, uma linha da imagem, a
Transformada do Cosseno e sua inversa são dadas por :
( 2 x + 1)iπ
N −1
C (i ) = α (i ) ∑ f ( x ) cos
x =0 2N
N −1
( 2 x + 1)iπ
f (x ) = ∑ α (i )C (i ) cos
i=0 2N
6
O exemplo abaixo ilustra o resultado da TDC aplicada em um bloco 8 x 8 de
uma imagem:
7
representação mais importante da imagem no lado superior esquerdo, enquanto as
informações menos relevantes, se encontram no lado direito inferior do bloco.
Para melhor entender a decomposição da imagem original em ondas
cossenoidais, é apresentado o caso simplificado em uma linha de imagem, de tamanho 4.
A generalização segue o mesmo raciocínio, não oferecendo dificuldades significativas.
Supõe-se a existência de 4 tons de cinza f(0), f(1), f(2) e f(3) e sua transformada
C(0), C(1), C(2) e C(3) :
2x + 1 2x + 1 2x + 1
f (x) = C(0)α (0) + C(1)α (1)cos π + C(2)α (2)cos 2π + C(3)α (3)cos 3π
2N 2N 2N
8
Os coeficientes C(0), C(1), C(2) e C(3) estão associados a freqüências cada vez
mais altas (que são responsáveis pelos detalhes existentes na imagem), ou seja, f(x) é
uma combinação linear da base :
2x + 1 2x + 1 2x + 1
b0 = cos(0); b1 = cos π; b2 = cos 2π ; b3 = cos 3π .
2N 2N 2N
9
e
b’0
π 2π 3π
f (0) = C(0)α(0) + C(1)α(1)cos + C(2)α(2)cos + C(3)α(3)cos
2N 2N 2N
3π 6π 9π
f (1) = C(0)α(0) + C(1)α(1)cos + C(2)α(2)cos + C(3)α(3)cos
2N 2N 2N
5π 10π 15π
f (2) = C(0)α(0) + C(1)α(1)cos + C(2)α(2)cos + C(3)α(3)cos
2N 2N 2N
7π 14π 21π
f (3) = C(0)α(0) + C(1)α(1) cos + C(2)α(2) cos + C(3)α(3) cos
2N 2N 2N
portanto,
π 2π 3π
α (0) cos(0) α (1)cos
2N
α (2 ) cos
2N
α (3) cos
2N
f (0) 3π 6π 9π C (0)
f (1) α (0) cos(0) α (1) cos
2N
α (2 ) cos
2N
α (3) cos
2N C (1)
=
f (2) 5π 10π 15π C (2)
α (0)cos(0) α (1) cos
2N
α ( 2) cos
2N
α (3)cos
2 N
f (3) C (3)
7π 14π 21π
α (0)cos(0) α (1) cos α ( 2) cos α (3) cos
2N 2N 2N
10
ou seja, F = CC.
Agora interessa-nos obter os coeficientes C(0), C(1), C(2) e C(3). Para este
cálculo, observando que Ct C = I, onde Ct é a matriz transposta de C, temos :
CtF = CtCC ⇒ C = Ct F,
isto é,
11
ou esquematicamente
12
Figura 10 – Representação das básicas – caso discreto b3
No caso de uma imagem, onde tem que se considerar linhas e colunas, tudo
pode ser prontamente generalizado chegando a:
C=CFC F=C CC
13
Onde cada bloco tem dimensão 4 x 4 com elementos variando de 0 a 3. O tom
mais claro é associado ao maior valor, enquanto o mais escuro ao menor.
O próximo passo é onde ocorre a perda da informação : quantização.
1.1 – QUANTIZAÇÃO
A TDC ocupa mais espaço do que a matriz original, pois, enquanto os valores
da matriz original são do tipo byte, ou inteiro, os coeficientes da TDC são reais. Para
reduzir esses valores, é realizada a quantização, que é simplesmente o processo de
reduzir o número de bits necessários para armazenar um valor reduzindo a precisão de
um inteiro.
É neste processo de quantização, reduzindo a precisão, que acontece a perda da
informação, ou seja, os valores dos coeficientes que eram reais, agora passam a ser
inteiros, perdendo a parte decimal, mas reduzindo o número de bits necessários para
armazenar os valores.
O padrão JPEG, usa uma matriz Q[i][j] de quantização extremamente testada
por membros do comitê, que gera um nível estável e bom de compressão:
Fator de Qualidade
2 5 10 15 20 25
Tamanho Tamanho Tamanho Tamanho Tamanho Tamanho
(compressão) (compressão) (compressão) (compressão) (compressão) (compressão)
14
(a)
(b)
15
(c)
Figura 12 – (a) Resultado de compressão com fator de qualidade 2, (b) Resultado de
compressão com fator de qualidade 10, (c) Resultado de compressão com
fator de qualidade 25
16
O próximo passo é quantizar os coeficientes da TDC:
DCT[i][j]
Valor_quantizado[i][j] = arredondado para inteiro.
Q[i][j]
92 3 -9 -7 3 -1 0 2
-39 -58 12 17 -2 2 4 2
-84 62 1 -18 3 4 -5 5
-52 -36 -10 14 -10 4 -2 0
-86 -40 49 -7 17 -6 -2 5
-62 65 -12 -2 3 -8 -2 0
-17 14 -36 17 -11 3 3 -1
-54 32 -9 -9 22 0 1 3
Figura 13 – TDC antes da quantização [apud NELSON]
90 0 -7 0 0 0 0 0
-35 -56 9 11 0 0 0 0
-84 54 0 -13 0 0 0 0
-45 -33 0 0 0 0 0 0
-77 -39 45 0 0 0 0 0
-52 60 0 0 0 0 0 0
-15 0 -19 0 0 0 0 0
-51 19 0 0 0 0 0 0
Figura 14 – TDC após a dequantização [apud NELSON]
17
Capítulo 2 – CODIFICAÇÃO
E = Nc x Nl x Nb
onde:
E : entropia;
Nc : Número de colunas;
Nl : Número de linhas;
Nb : número de bits por pixel.
Esta é a medida de entropia para qualquer caso 640 x 480 x 8 bit imagem.
Qualquer uma de 22.457.600 possíveis imagens diferente pode ser representada por uma
imagem desta resolução. Reciprocamente, há uma em 22.457.600 chances de uma imagem
particular com estas dimensões ser idêntica à outra.
18
Como imagens raramente são compostas de níveis totalmente variados, a
entropia atual de uma imagem normal geralmente será algo menor do que o cálculo
acima. Isto se deve ao fato da quantidade de dados de uma imagem comum sempre ser
mais alta que a quantidade de dados de informação comum. A entropia atual de uma
imagem é a quantidade de informação comum da imagem. Em outras palavras, uma
imagem de 640 x 480 x 8 bits pode ser comprimida de uma forma comum e podem ser
requeridos 2.457.600 bits, para algo menor. A forma de compressão que faz isto é
chamada codificação de entropia. A técnica que codifica a entropia reduz redundâncias
da imagem para ser usada em códigos de tamanho variável. Isto pode ser feito
codificando números variáveis de pixels com código de tamanho fixo, ou codificando
números fixos de pixels com códigos de tamanhos variados.
Codificação de imagem RLC tira proveito do fato que vários pixels pertos em
uma imagem, estatisticamente, tendem a ter o mesmo valor de nível. Esta forma de
redundância pode ser reduzida agrupando-se pixels de nível idênticos em códigos únicos.
O esquema do RLC trabalha como segue: a imagem original é avaliada
começando do primeiro pixel no canto superior esquerdo, olhando o primeiro pixel e é
seguido o vizinho pela linha, o esquema determina quantos pixels seguintes tem o mesmo
valor de nível. Se o próximo um ou mais pixels na seqüência tem o mesmo valor de nível
como o primeiro, eles são todos representados por um código novo. O código novo é
composto de dois valores; um valor de nível seguido pelo número de pixels (run-length)
que tem o mesmo valor. O processo move para o próximo pixel na linha com um novo
valor de nível se repete o processo. Quando o fim da linha é alcançado, o processo volta
ao começo da próxima linha. Este processo continua até que a última linha da imagem
tenha sido codificada.
Se, por exemplo, 15 pixels seqüenciais tivessem o mesmo valor de nível de 234,
eles seriam codificados nos dois valores – nível|quantidade – 234|15. Os 15 bytes de
dados necessários para representar 15 pixels da imagem original são comprimidos para
somente 2 bytes. O resultado do run-length numa imagem comprimida está para cima de
2 bytes de códigos, representando cada valor de nível e tamanho. [BAXES]
19
76 | 5 78 | 1 79 | 4 80 | 2
(Nível | Quantidade)
x
76 76 76 76 76 78 79 79 79 79 80 80
y
imagem original
Figura 15 – A operação Run-Length Coding
Por exemplo:
78 81 90 - pixels de uma imagem
78 01 81 01 90 01 - codificação RLC
20
freqüentemente acontecem em códigos menores, e são atribuídos níveis que acontecem
sem muita freqüência em códigos mais longos. O resultado é que a imagem comprimida
exigirá menos bits globais para descrever a imagem original.
O esquema de compressão de Huffman inicia olhando o histograma de nível de
uma imagem. Com o histograma, a freqüência de ocorrência para todo nível na imagem é
avaliada. Os valores de nível são ordenados pelas freqüências de ocorrência numa lista,
onde o código de Huffman atribui novos códigos a cada valor de nível. Os códigos
atribuídos são de tamanhos variados; os códigos menores são atribuídos primeiros (a
maioria freqüente) valores na lista e, eventualmente, os códigos mais longos são
atribuídos últimos (menos freqüente) valores na lista. Finalmente, a imagem comprimida
é criada simpesmente substituindo os códigos de valor de nível de tamanho variável para
o original código de valor de nível de 1 byte.
21
Figura 17 – Histograma da imagem original com o número de pixels de cada nível de
cinza [apud BAXES]
22
Intensidade Código de
Huffman
73 10
110 00
146 110
36 010
183 011
219 1110
255 11110
0 11111
O código de Huffman é tão pequeno quanto 1 bit e podem ser tão grande
quanto 7 bits. O código de Huffman mais longo nunca pode ser maior que o número de
níveis diferentes na imagem (no caso, oito) menos 1. Embora uma imagem codificada
pelo Huffman possa ter alguns níveis com códigos muito longos, as suas freqüências de
ocorrências sempre são estatisticamente baixas.
A decodificação de imagem Huffman inverte o processo de compressão
substituindo o valor original pelo valor da codificação de Huffman. A codificação por
Huffman gera uma razão de redução do código de 1.5:1 a 2:1.
23
Capítulo 3 – O PADRÃO JPEG
24
Imagem
Original
Acabou S
Imagem
Blocos? Huffman Comprimida
TDC
Quantização
Zig-zag
Codificação
RLC
25
Imagem
Comprimida
Inversa de
Huffman
Acabou S Imagem
Blocos? Recuperada
Decodificação
RLC
Inversa
Zig-zag
ITDC
26
3.1 – TABELAS PADRÃO PARA A CODIFICAÇÃO DE HUFFMAN
27
Categoria Código Base Tamanho Categoria Código Base Tamanho
0 010 3 6 1110 10
1 011 4 7 11110 12
2 100 5 8 111110 14
3 00 5 9 1111110 16
4 101 7 A 11111110 18
5 110 8 B 111111110 20
Tabela 05 – JPEG Código DC Padrão
28
Compr./ Compr./
Categoria Código Base Tamanho Categoria Código Base Tamanho
0/0 1010 (= EOB) 4
0/1 00 3 8/1 11111010 9
0/2 01 4 8/2 111111111000000 17
0/3 100 6 8/3 1111111110110111 19
0/4 1011 8 8/4 1111111110111000 20
0/5 11010 10 8/5 1111111110111001 21
0/6 111000 12 8/6 1111111110111010 22
0/7 1111000 14 8/7 1111111110111011 23
0/8 1111110110 18 8/8 1111111110111100 24
0/9 1111111110000010 25 8/9 1111111110111101 25
0/A 1111111110000011 26 8/A 1111111110111110 26
1/1 1100 5 9/1 111111000 10
1/2 111001 8 9/2 1111111110111111 18
1/3 1111001 10 9/3 1111111111000000 19
1/4 111110110 13 9/4 1111111111000001 20
1/5 11111110110 16 9/5 1111111111000010 21
1/6 1111111110000100 22 9/6 1111111111000011 22
1/7 1111111110000101 23 9/7 1111111111000100 23
1/8 1111111110000110 24 9/8 1111111111000101 24
1/9 1111111110000111 25 9/9 1111111111000110 25
1/A 1111111110001000 26 9/A 1111111111000111 26
2/1 11011 6 A/1 111111001 10
2/2 11111000 10 A/2 1111111111001000 18
2/3 1111110111 13 A/3 1111111111001001 19
2/4 1111111110001001 20 A/4 1111111111001010 20
2/5 1111111110001010 21 A/5 1111111111001011 21
2/6 1111111110001011 22 A/6 1111111111001100 22
2/7 1111111110001100 23 A/7 1111111111001101 23
2/8 1111111110001101 24 A/8 1111111111001110 24
2/9 1111111110001110 25 A/9 1111111111001111 25
2/A 1111111110001111 26 A/A 1111111111010000 26
3/1 111010 7 B/1 111111010 10
3/2 111110111 11 B/2 1111111111010001 18
3/3 11111110111 14 B/3 1111111111010010 19
3/4 1111111110010000 20 B/4 1111111111010011 20
3/5 1111111110010001 21 B/5 1111111111010100 21
3/6 1111111110010010 22 B/6 1111111111010101 22
3/7 1111111110010011 23 B/7 1111111111010110 23
3/8 1111111110010100 24 B/8 1111111111010111 24
3/9 1111111110010101 25 B/9 1111111111011000 25
3/A 1111111110010110 26 B/A 1111111111011001 26
29
Compr./ Compr./
Categoria Código Base Tamanho Categoria Código Base Tamanho
4/1 111011 7 C/1 1111111010 11
4/2 1111111000 12 C/2 1111111111011010 18
4/3 1111111110010111 19 C/3 1111111111011011 19
4/4 1111111110011000 20 C/4 1111111111011100 20
4/5 1111111110011001 21 C/5 1111111111011101 21
4/6 1111111110011010 22 C/6 1111111111011110 22
4/7 1111111110011011 23 C/7 1111111111011111 23
4/8 1111111110011100 24 C/8 1111111111100000 24
4/9 1111111110011101 25 C/9 1111111111100001 25
4/A 1111111110011110 26 C/A 1111111111100010 26
5/1 1111010 8 D/1 11111111010 12
5/2 1111111001 12 D/2 1111111111100011 18
5/3 1111111110011111 19 D/3 1111111111100100 19
5/4 1111111110100000 20 D/4 1111111111100101 20
5/5 1111111110100001 21 D/5 1111111111100110 21
5/6 1111111110100010 22 D/6 1111111111100111 22
5/7 1111111110100011 23 D/7 1111111111101000 23
5/8 1111111110100100 24 D/8 1111111111101001 24
5/9 1111111110100101 25 D/9 1111111111101010 25
5/A 1111111110100110 26 D/A 1111111111101011 26
6/1 1111011 8 E/1 111111110110 13
6/2 11111111000 13 E/2 1111111111101100 18
6/3 1111111110100111 19 E/3 1111111111101101 19
6/4 1111111110101000 20 E/4 1111111111101110 20
6/5 1111111110101001 21 E/5 1111111111101111 21
6/6 1111111110101010 22 E/6 1111111111110000 22
6/7 1111111110101011 23 E/7 1111111111110001 23
6/8 1111111110101100 24 E/8 1111111111110010 24
6/9 1111111110101101 25 E/9 1111111111110011 25
6/A 1111111110101110 26 E/A 1111111111110100 26
7/1 11111001 9 F/0 111111110111 12
7/2 11111111001 13 F/1 1111111111110101 17
7/3 1111111110101111 19 F/2 1111111111110110 18
7/4 1111111110110000 20 F/3 1111111111110111 19
7/5 1111111110110001 21 F/4 1111111111111000 20
7/6 1111111110110010 22 F/5 1111111111111001 21
7/7 1111111110110011 23 F/6 1111111111111010 22
7/8 1111111110110100 24 F/7 1111111111111011 23
7/9 1111111110110101 25 F/8 1111111111111100 24
7/A 1111111110110110 26 F/9 1111111111111101 25
F/A 1111111111111110 26
Tabela 06 – JPEG Código AC Padrão
30
-26 -3 -6 2 2 0 0 0
1 -2 -4 0 0 0 0 0
-3 1 5 -1 -1 0 0 0
-4 1 2 -1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Figura 21 – Bloco após quantização [apud GONZALEZ]
[-26 -3 1 -3 -2 -6 2 -4 1 -4 1 1 5 0 2 0 0 -1 2 0 0 0 0 0 -1
-1 EOB]
onde o símbolo EOB denota uma condição de fim de bloco. Uma palavra chave de EOB
especial (veja a categoria 0 e percorra o tamanho 0 na tabela de Categorias para
Codificação dos Coeficientes) é provida para indicar que os restos dos coeficientes em
uma seqüência são zeros.
31
seqüência Zig-zag, mostrada na figura abaixo, os coeficientes de baixa freqüência são
colocados na frente dos coeficientes de alta freqüência.
Um esquema usado para reordenar estes elementos é conhecido como zig-zag :
32
CONCLUSÃO
33
REFERÊNCIAS BIBLIOGRÁFICAS
NELSON, Mark. The Data Compression Book: Featuring fast, efficient data
compression techniques in C. M&T Books, 1991.
34
PENNEBAKER, W. B. e MITCHELL, J. C. JPEG: still image data
compression standard. Van Nostrand Reinhold, 1993.
REISDORPH, Kent e HENDERSON Ken. Teach Yourself Borland C++
Builder. Sams Publishing, 1997.
35