De qualquer forma, vou responder os 2 e você lê o que interessar.
O vetor unsigned char color
tem espaço para 3 dados de 1 byte de 8 bits. Em cada espaço, cabem 256 números (2 ^ 8), que no caso são de 0 a 255 por causa do unsigned
. Se não fosse unsigned, ia caber de -128 até 127. Como você quer representar cores RGB de 0 a 255, o unsigned cai como uma luva (e isso não é à toa).
A imagem PPM que você está criando tem 3 canais (RGB). O arquivo funciona assim:
valorR valorG valorB valorR valorG ValorB...
Cada conjunto de 3 valores separados espaços representam um pixel, são os 3 canais de cores. Essa linha mostra isso:
fwrite(color, 1, 3, fp);//Escreve no arquivo a cor
A assinatura da função fwrite
é a seguinte:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
Os argumentos para a escrita são:
- A fonte dos dados. O que você quer escrever na stream (que nesse caso é o arquivo);
- O tamanho de cada dado nessa fonte. Como você está usando
unsigned char
, o argumento é 1, pois esse é o tamanho do unsigned char (1 byte de 8 bits). Eu acho “mais certo” colocar sizeof(unsigned char)
ao invés de 1;
- A quantidade de dados que devem ser escritos na stream. O total de bytes à escrever é calculado por
tamanho do dado * quantidade
, é assim que a função fwrite
sabe quantos bytes escrever;
- A stream.
É basicamente isso, quanto à escrita. Para cada pixel da imagem (por isso os 2 fors), são gerados 3 valores (um para cada canal, RGB) e escritos no arquivo. É só isso, a imagem não é “pintada” no arquivo. São só números.
Quando você vai abrir essa imagem, o programa que a abre é responsável por interpreta-la. Por causa daqueles meta-dados que você escreve no começo do arquivo (P6, as dimensões e 255), o programa é capaz de percorrer o arquivo, guardando os números em uma estrutura em memória, representando a imagem. Em seguida, o programa pode utilizar uma biblioteca de gráficos para mostrar a imagem na tela, que nada mais é do que pegar as cores informadas pelo arquivo e acender cada pixel do monitor com as intensidades certas.