Przetwarzanie obrazów - obrócony i ucięty

0

Witam
Miałem zrobić program przetwarzający zdjęcie.
Program jest sprawny jednak podczas zapisywania obraz zostaje obrócony i ucięty, nie potrafię zdefiniować gdzie popełniłem błąd.

Bardzo mi zależy z góry dziękuje za każde zainteresowanie

Funkcja zapisu:

int zapis(int obraz[][MAX], int wymx, int wymy, int szarosci) {
  
  int i,j;
  FILE *plik;
  char nazwa[100];

  printf("Podaj nazwÄ pliku: \n");
  scanf("%s",nazwa);
  plik=fopen(nazwa,"w");
  fprintf(plik, "P2\n%d %d\n%d ",wymx,wymy,szarosci);
  for (j=0;j<wymy;j++) {
    for (i=0;i<wymx;i++)  {
      fprintf(plik, "%d ",obraz[i][j]);
     }
   }
  return 0;
}

A tutaj caly program:

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

#define MAX 512
#define DL_LINII 80

//wczytywanie case 1
int czytaj(FILE *p,int obraz_pgm[][MAX],int *wymx,int *wymy, int *szarosci) {
  char s[DL_LINII];
  int znak,koniec=0,i,j;

  /*sprawdzenie czy podano prawidłowy uchwyt pliku */
  if (p==NULL) {
    fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
    return(0);
  }
  if (fgets(s,DL_LINII,p)==NULL) koniec=1;
  /* Sprawdzenie "numeru magicznego - powinien być P2 */
  if ( (s[0]!='P') || (s[1]!='2') || koniec) {
    fprintf(stderr,"Blad: To nie jest plik PGM\n");
    return(0);
  }
  /* Pominiecie komentarzy */
  do {
    if ((znak=fgetc(p))=='#') {
      if (fgets(s,DL_LINII,p)==NULL) koniec=1;
    }  else {
      ungetc(znak,p);
    }
  } while (! koniec && znak=='#');

  /* Pobranie wymiarow obrazu i liczby odcieni szarosci */
  if (fscanf(p,"%d %d %d",wymx,wymy,szarosci)!=3) {
    fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
    return(0);
  }
  /* Pobranie obrazu i zapisanie w tablicy obraz_pgm*/
  for (i=0;i<*wymy;i++) {
    for (j=0;j<*wymx;j++) {
      if (fscanf(p,"%d",&(obraz_pgm[i][j]))!=1) {
	fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
	return(0);
      }
    }
  }
  return *wymx**wymy;
}

//funkcja wyswietl case 2
void wyswietl(char *n_pliku) {
  /* Wyswietlenie obrazu o zadanej nazwie
     za pomoca programu "display"   */
  char polecenie[1024];
  strcpy(polecenie,"display ");
  strcat(polecenie,n_pliku);
  strcat(polecenie," &");
  printf("%s\n",polecenie);
  system(polecenie);
}
//To byla wieksza czesc pliku odczyt.c reszta znajduje sie w glownej funkcji programu//

//funkcja zapisu case 6//
int zapis(int obraz[][MAX], int wymx, int wymy, int szarosci) {
  
  int i,j;
  FILE *plik;
  char nazwa[100];

  printf("Podaj nazwÄ pliku: \n");
  scanf("%s",nazwa);
  plik=fopen(nazwa,"w");
  fprintf(plik, "P2\n%d %d\n%d ",wymx,wymy,szarosci);
  for (j=0;j<wymy;j++) {
    for (i=0;i<wymx;i++)  {
      fprintf(plik, "%d ",obraz[i][j]);
     }
   }
  return 0;
}

//funkcja negatyw case 3//
int negatyw (int obraz_pgm[][MAX],int *wymx,int *wymy, int *szarosci) {
int i,j;
for (j=0;j<*wymy;j++) {
for (i=0;i<*wymx;i++) {
obraz_pgm[i][j]=(*szarosci-obraz_pgm[i][j]);}}
      return(0);
}

//funkcja progowanie case 4//
 int progowanie (int obraz_pgm[][MAX], int *wymx,int *wymy, int *szarosci) {
  int i,j,prog;

  printf
  ("wybierz stopien progowania ktory ma sie zawierac w przedziale miedzy 0 do %d", *szarosci);
  scanf  ("%d", &prog); // Wczytanie wartosci progowania //

 if(prog<=*szarosci && prog>=0){
  for (j=0;j<*wymy;j++) {
    for (i=0;i<*wymx;i++) {
      if (obraz_pgm[i][j]<=prog)
	obraz_pgm[i][j]=0;
      else
	obraz_pgm[i][j]=*szarosci;
    }
  }
  }
  else {
  printf("Podano zly stopien progowania");}
      return(0);
}

//funkcja konturowanie case 5//

int konturowanie (int obraz_pgm[][MAX], int *wymx, int *wymy, int *szarosci) {
  int i,j;
  for (j=0;j<*wymy;j++) {
    for (i=0;i<*wymx;i++) {
      obraz_pgm[i][j]=abs(obraz_pgm[i+1][j]-obraz_pgm[i][j])
      +abs(obraz_pgm[i][j+1]-obraz_pgm[i][j]);
      /* abs - wartosc bezwzgledna wyrazenia ktore znajduje sie w nawiasie */
    }
  }
      return (0);
}




int main() {

  int wymx,wymy,odcieni;
  int obraz[MAX][MAX] ;
  int odczytano = 0;
  FILE *plik;
  char nazwa[100];

  printf("Podaj nazwe pliku z rozszerzeniem ktory chcesz wczytac:\n");
  scanf("%s",nazwa);
  plik=fopen(nazwa,"r");
  int end=0;
  if (plik != NULL)         /* co spowoduje zakomentowanie tego warunku */
    odczytano = czytaj(plik,obraz,&wymx,&wymy,&odcieni);

  if (odczytano != 0)
    {
        while(end!=9){ //petla dzialania
  printf("\n\n             MENU                    \n");
  printf("1.Wczytaj inny plik\n");
  printf("2.wyswietl za pomoca display\n");
  printf("3.stworz negatyw obrazu\n");
  printf("4.wyproguj obraz\n");
  printf("5.konturuj\n");
  printf("6.zapisz\n");
  printf("7.\n");
  printf("8.\n");
  printf("9.zakoncz\n");
 
  printf("\n\n opcja nr:   ");




          scanf("%d", &end);
          switch(end){
case 1:  {
    printf("Podaj nazwe pliku z rozszerzeniem ktory chcesz wczytac:\n");
  scanf("%s",nazwa);
  plik=fopen(nazwa,"r");
  int end=0;
  if (plik != NULL)         /* co spowoduje zakomentowanie tego warunku */
    odczytano = czytaj(plik,obraz,&wymx,&wymy,&odcieni);

          break;}

case 2:{
    wyswietl(nazwa);                           // Funkcja wyswietl //
          break;
}

case 3:{

negatyw (obraz,&wymx,&wymy,&odcieni);  //funkcja negatyw //
printf("zakonczono\n");
break;

}

case 4:{

progowanie (obraz,&wymx,&wymy,&odcieni); //funkcja progowanie//
break;
}

case 5:{
konturowanie (obraz,&wymx,&wymy,&odcieni); //funkcja konturowanie//
break;
}


case 6: {
        zapis(obraz,wymx,wymy,odcieni); //funkcja zapis//
        break;
       }

case 9: {
printf("zakoncz");
break;
}
default:
   {printf ("wybrales zla opcje\n");

	  break;}

    }
    }
  fclose(plik);







  return odczytano;
}
}
 
0

Hej,

chyba tutaj masz błąd:

for (j=0;j<wymy;j++) {
for (i=0;i<wymx;i++) {
fprintf(plik, "%d ",obraz**[i][j]**);

powinno być:

for (j=0;j<wymy;j++) {
for (i=0;i<wymx;i++) {
fprintf(plik, "%d ",obraz**[j][i]**);

1 użytkowników online, w tym zalogowanych: 0, gości: 1