Pergunta

Estou tentando escrever um arquivo PGM em um programa C, mas uma vez escrito, se eu tentar abri-lo para visualizar a imagem, sou informado de que o formato do arquivo de imagem não pode ser determinado.

No entanto, se eu criar um novo arquivo no geany, copiar os dados e salvá-lo como um novo PGM, ele funcionará.

Alguma idéia de por que isso poderia ser?

FILE * grey = fopen("greyscale.pgm", "w");

fprintf(grey, "P2 \r\n%d %d \r\n255 \r\n", width, height);

for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
        fprintf(grey, "%d ", ((imageArray[i][j].red + imageArray[i][j].green + imageArray[i][j].blue)/3));
    }
    fprintf(grey, "\r\n");
}

Estou convertendo uma imagem colorida em escala de cinza.

Foi útil?

Solução

Eu acho que você não deveria usar \r\n como um delimitador de linha, mas apenas \n.Além disso, verifique se nenhuma linha tem mais de 70 caracteres.Como cada pixel precisa de no máximo 4 caracteres (3 mais espaço), insira \n a cada 17 pixels.Você pode separar linhas reais com comentários (por exemplo:

pixel11 pixel12 pixel13
pixel14 pixel15
# switch to next row
pixel21 pixel22 pixel23
pixel24 pixel25
# etc.

Outras dicas

Olhando para o seu código, vejo que você insere um new line todo height elementos.De acordo com o formato do arquivo PGM, após o cabeçalho, segue

  • A raster de linhas de altura, em ordem de cima para baixo.Cada linha consiste em valores de largura em cinza, da esquerda para a direita.

Mas você está escrevendo uma linha do elemento height.Então, provavelmente você está acessando os dados de maneira errada.Na verdade, tente depurar (com um lápis) uma imagem de 3 colunas (largura) e 4 linhas (altura).

Dito isso, altere seu loop para escrever dados em ordem de linha maior:

// write data to file
int row, col;
for (row = 0; row < height; ++row)
{
    for (col = 0; col < width; ++col)
    {
        fprintf(grey, "%d ", (imageArray[row][col].red + imageArray[row][col].green + imageArray[row][col].blue)/3));
    }
    fprintf(grey, "\n\r");
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top