IvanSantos
(usa Satux Linux)
Enviado em 11/10/2015 - 10:53h
Estou com problemas de alocacao na minha funcao de leitura de uma imagem ppm.... o codigo esta dando erro na parte de alocar... como posso consertar isso?
#include <stdio.h>
#include <stdlib.h>
typedef struct _cor { //Essa struct é onde vão ficar armazenados os indices de cor da matriz.
int val[3]; //0 = Vermelho
} Cor; //1 = Verde
//2 = Azul
typedef struct _colorimage {
int nx,ny; /* dimensoes da imagem */
Cor **cor; /* matriz com a cor dos pixels */
int tamanho_maximo; // ate onde vai a intensidade dos pixels
char cabecalho[2]; //cabecalho que vem em TODAS as imagens ppm... para ver isso é só abrir a imagem com um bloco de notas
} ColorImage;
ColorImage Leitura(char*Nome_Da_Imagem) { //Essa funcao vai fazer a leitura de uma imagem... lembra que a imagem é uma matriz
FILE *img; //ponteiro pro arquivo
int i,j;
int linhas,colunas,max;//variaveis auxiliares para guardar os dados
ColorImage ppm; // "objeto" que vai apontar pra matriz que vai guardar os dados da imagem
img = fopen(Nome_Da_Imagem,"r"); //abre a imagem
if(img == NULL){
printf("Erro ao abrir imagem\n");
exit(0);
}
fscanf(img,"%s %d%d%d",ppm.cabecalho,&linhas, &colunas, &max); //aqui é onde é feita a leitura dos dados inciais da imagem(As primeiras 4 linhas)
ppm.nx = colunas; //guarda a informação das colunas DENTRO da variável das matrizes
ppm.ny = linhas; //mesma coisa, porém com as linhas
ppm.tamanho_maximo = max; //intensidade máxima dos pixels (na maioria dos casos é até 255)
ppm.cor = (Cor**)malloc(sizeof(Cor*)* colunas); //alocação dinâmica para a matriz das cores (bidimensional até o momento)
i=0;
for (i = 0; i < linhas; i++){ //Percorre as linhas do Vetor de Ponteiros
ppm.cor[i] = (Cor*) malloc(colunas * sizeof(Cor)); //Aloca um Vetor de Inteiros para cada posição do Vetor de Ponteiros.
for (j = 0; j < colunas; j++){ //Percorre o Vetor de Inteiros atual.
ppm.cor[i][j] = 0; //Inicializa com 0.
}
}
while(i<linhas){
ppm.cor[i] = (Cor*)malloc(sizeof(Cor) * colunas); //alocação
i++;
}
int k;
for(i=0;i<linhas;i++){ //uuma imagem RGB é uma matriz tridimensional, onde apenas UM pixel da imagem é formado por 3 tons diferentes(RED, GREEN, BLUE)
for(j=0;j<colunas;j++){ //struct de índices lá encima, que armazena os valores "0,1,2"
for(k=0;k<3;k++){
fscanf(img,"%d",&ppm.cor[i][j].val[k]);
}
}
fclose(img);
return ppm;
}
int main()
{
ColorImage ImagemBase;
char nome_do_arquivo_entrada[500];
printf("Insira o endereco da imagem: ");
scanf("%s", nome_do_arquivo_entrada);
printf("\n");
ImagemBase = Leitura(nome_do_arquivo_entrada);
}