Uma imagem digital é uma matriz de pixels (picture elements). O número de linhas e colunas definem a dimensão dessa matriz e o tipo (binária, tons de cinza e colorida), define, de certa forma, o número de bits necessário para representação dos pixels. Então, para armazenar uma imagem 1000x1000 com 256 tons de cinza, são necessários 1000x1000x8 bits (onde
P1
# This is an example bitmap of the letter "J"
6 10
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
0 0 0 0 1 0
1 0 0 0 1 0
0 1 1 1 0 0
0 0 0 0 0 0
0 0 0 0 0 0
Onde:
- P1 - indica que a imagem está no formato PBM - ASCII
- # This... - indica uma linha de comentário
- 6 10 - indicam o número de colunas e o número de linhas da imagem, respectivamente
- o próximos 6 x 10 valores - indicam os valores dos pixels
Em linguagem C, podemos usar um vetor criado dinamicamente para armazenar os pixels da matriz imagem, conforme a figura abaixo. Esse vetor deve ter no mínimo
- i = linha da matriz
- j = coluna da matriz
- nc = número de colunas da matriz e
- k = índice do vetor
Na imagem exemplo, o elemento da posição i = 2 e j = 1, corresponde ao elemento de posição k = 2 * 3 + 1 = 7, conforme está ilustrado.
Nesta atividade você deverá completar o código deste repositório para implementar as duas funções:
-
image read_pts(char *name, int *nl, int *nc)
, que recebe o nome do arquivo que contém coordenadas dos pontos, nl = número de linhas e nc = número de colunas (passados por referência). Esta função deve ler de um arquivo de entrada, as dimensões da matriz imagem, o númerode pixels com valor 1 e as coordenadas . Em função do tamanho da matriz, alocar um vetor de dimensão para representar essa matriz. Esse vetor/matriz deve ter o valor 1 nas coordenadas e zero, caso contrário. O vetor alocado é retornado como resultado da chamada da função. -
void write_pbm(image img, char *name, int nl, int nc)
, que recebe o vetor que representa a imagem, o nome do arquivo pbm que será criado por essa função, o número de linhas e o número de colunas da image. Os dados da matriz (representada no vetor) imagem, devem ser gravados conforme especificado como comentário da função.
Entrada
10 10
30
1 4 1 5 2 3 2 4 2 5 2 6 3 2 3 7 4 2 4 3
4 6 4 7 5 2 5 3 5 4 5 5 5 6 5 7 6 2 6 3
6 6 6 7 7 2 7 7 8 1 8 2 8 3 8 6 8 7 8 8
Saída
P1
#imagem exemplo
10 10
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0
0 0 0 1 1 1 1 0 0 0
0 0 1 0 0 0 0 1 0 0
0 0 1 1 0 0 1 1 0 0
0 0 1 1 1 1 1 1 0 0
0 0 1 1 0 0 1 1 0 0
0 0 1 0 0 0 0 1 0 0
0 1 1 1 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0