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;
}
}