Ir ao conteúdo
  • Cadastre-se

C Copiando uma imagem .PPM em c


Vinicius98

Posts recomendados

Olá, estou fazendo um projeto e estou tendo um problema que esta quebrando minha cabeça. Esse código é para receber uma imagem e criar uma copia idêntica dela, porém ao criar a imagem ele só pega 1/4 dela, o resto fica preto.. ele não esta conseguindo pegar toda a matriz por algum motivo, acredito que eu tenha errado algo na alocação.

vou colocar as imagens .ppm zipadas.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
	unsigned char r,g,b; //struct dos pixels em RGB;
}pixel;

int main(){
	FILE *image;
	FILE *newImage;


	char key[5];
	int i,j, larg, alt, max;

	image = fopen("Normal2.ppm", "r"); //Lê o arquivo orignal
	if(image == NULL)
	{
		printf("Erro na abertura do arquivo \n");
		return 0;
	}


	fscanf(image, "%s", key);//key é p3;


	if(strcmp(key, "P3") != 0){
		printf("Arquivo n é PPM\n");//checa se esta em P3
		printf("%s\n",key );
		fclose(image);
		return 0;
	}
	fscanf(image, "%d %d\n%d\n", &larg, &alt, &max);//le o cabeçario
	printf("larg =%d alt=%d key=%s max=%d\n",larg, alt, key,max );//printa na tela os valores lidos

	newImage = fopen("arquivo.ppm","w+"); //abre o novo arquivo que vai ser criado
	if(newImage == NULL){
		printf("ERRO AO ABRIR NEWIMAGE");
		return 0;
	}
	
	pixel **RGB =(pixel**)malloc(larg*sizeof(pixel*));//cria e aloca espaço para a matriz
	for(i=0;i<larg;i++){						// que vai receber as infos do arquivo original
		RGB[i] = (pixel*)malloc(alt*sizeof(pixel));

	}

	for(i=0; i<larg;i++){ //lê as infos da matriz original
		for(j=0;j<alt;j++){
			fscanf(image, "%c", &RGB[i][j].r );
			fscanf(image, "%c", &RGB[i][j].g );
			fscanf(image, "%c", &RGB[i][j].b );
		}
	}
	

	fprintf(newImage, "P3\n%d %d\n%d\n",larg,alt,max);//grava as infos novas
	for(i=0;i<larg;i++){
		for(j=0;j<alt; j++){
			fprintf(newImage, "%c%c%c", RGB[i][j].r, RGB[i][j].g, RGB[i][j].b );
			
		}
	} 
	fclose(image);
	fclose(newImage);
return 0;
}	

se alguem puder me dar uma mão ficaria bem feliz :D

fotos.zip

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Na hora de alocar, você aloca primeiro a altura depois a largura, idêntico a alocação de uma matriz de char. Primeiro linhas depois colunas.

 

No for você segue a mesma lógica, Primeiro vem a altura depois a largura.

 

Eu testei usando unsigned char, e isso está causando problemas, pois de todos valores numéricos, ele apenas pega o 1 de cada linha.

Troque por unsigned int.

 

Código MODIFICADO:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
	unsigned int r,g,b; //struct dos pixels em RGB;
}pixel;

int main(){
	FILE *image;
	FILE *newImage;
	
	char key[5];
	int i,j, larg, alt, max;
	
    
    //entrada
	image = fopen("Normal2.ppm", "r"); 
	if(image == NULL)
	{
		printf("Erro na abertura do arquivo \n");
		return 0;
	}

    //key
	fscanf(image, "%s", key);
	if(strcmp(key, "P3") != 0){
		printf("Arquivo n é PPM\n");//checa se esta em P3
		printf("%s\n",key );
		fclose(image);
		return 0;
	}
	
	//header
	fscanf(image, "%d %d\n%d\n", &alt, &larg, &max);//le o cabeçario
	printf("larg =%d alt=%d key=%s max=%d\n",larg, alt, key,max );//printa na tela os valores lidos
    
    //saida
	newImage = fopen("arquivo.ppm","w+"); //abre o novo arquivo que vai ser criado
	if(newImage == NULL){
		printf("ERRO AO ABRIR NEWIMAGE");
		return 0;
	}
    
    //alt x largura - [610][480]
	pixel **RGB =(pixel**)malloc(alt*sizeof(pixel*));
	for(i=0;i<alt;i++){						
		RGB[i] = (pixel*)malloc(larg*sizeof(pixel));
	}

	//lê as infos da matriz original
	for(i=0; i<alt;i++){ 
		for(j=0;j<larg;j++){
			fscanf(image, "%d", &RGB[i][j].r );
			fscanf(image, "%d", &RGB[i][j].g );
			fscanf(image, "%d", &RGB[i][j].b );
		}
	}


	//grava header / dados
	fprintf(newImage, "P3\n%d %d\n%d\n",alt,larg,max);
	for(i=0;i<alt;i++){
		for(j=0;j<larg; j++){
			fprintf(newImage, "%d\n", RGB[i][j].r );
			fprintf(newImage, "%d\n", RGB[i][j].g );
			fprintf(newImage, "%d\n", RGB[i][j].b );
		}
	}
	
	//fim
	fclose(image);
	fclose(newImage);
return 0;
}

 

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...