Grafikprogrammierung Frage
-
Hallo an allen ,
ich hatte mal was geschrieben und ich danke alle die beantwortet haben und ich habe verstanden dass meine Frage nicht so klar war.Ich mache es nun anders!Ich habe einen Algorithmus in C geschrieben der die Faltung auf ein Bild anwendet!Und zwar:
.....
.....
struct IMage
{
//Anzahl der Reihe im Image =idx
int Rows;
//Anzahl der Spalten im Image=jdx
int Cols;
//Zeiger auf Image
unsigned char *Data;
//Typ des Bildes
unsigned char Type;
};
................
..............
...............void faltung(struct Image *In,struct image *Mask,struct Image Out)
{
long i,j,m,n,idx,idy;
int ms,im,val;
unsigned char *tmp;for(i=0; i<In->Rows; ++i)
for(j00; j<Cols; ++j)
{
val=0;
for(m=0; m<Mask->Rows; ++m)
{
ms=(signed char)(Mask->Data+mMask->Rows +n);idx=i-m;
jdx=j-m;
if(idx>=0 && jdx>=0)
im*(In->Data+idxIn->Rows +jdx);
val+=msim;
}
if(val>255)
val=255;
if(val<0)
val=0;
tmp=Out->Data+i*Out->Rows+j;*tmp=(unsigned char)val;
}
}PROBLEM:Beim Compilieren findet mein Compiler keine Fehler ,Beim Ausfuehren aber bricht ab und ich gehe dann im Debugger,dr seinerseits zeigt als Fehlermeldung auf " *tmp=(unsigned char) val; " im Programm!Ich habe den Prof. gefragt aber er wollte mir nicht genau sagen wo das Problem ist sondern er hat mir ein paar Tipps gegeben ,wo das Problem sein konnte und zwar:
- Er meint,dass ich kontrollieren muss,dass das Eingangsbild gleich gross wie das Ausgangsbild ist.(wie mache ich das und wo ? )
2)Ich testen obdie Zeile vor dem *tmp=..... ,also die Parameter ,also ,"Data",
"Out" oder fuer die ganze Zeile Speicher allokiert habe(wie und w macht man das?)Ich programmiere in C nicht sehr lange und daher habe ich Schwierigkeiten zu verstehen wie und wo das machen soll?Ich hoffe dass dieses mal meine Frage besser formuliert ist !
Dankeschoen
kilomatps:ich brauche unbedingt Hilfe !
-
image::Data ist ein Zeiger auf einen Speicherblock. Dieser sollte die Größe image::rows*image::cols haben. Versuchst du mehr als diese Größe zu benutzen gibt es einen Crash. Out->Data+k greift auf das k-te Byte in dem Block zu, daher muss stets 0 <= k < image::rows*image::cols gelten.
Bye, TGGC \-/
-
TGGC schrieb:
image::Data ist ein Zeiger auf einen Speicherblock. Dieser sollte die Größe image::rows*image::cols haben. Versuchst du mehr als diese Größe zu benutzen gibt es einen Crash. Out->Data+k greift auf das k-te Byte in dem Block zu, daher muss stets 0 <= k < image::rows*image::cols gelten.
Schöner hätte es keiner formulieren können!
-
if(In.Rows==Out.Rows && In.Cols==Out.Cols) // dimension testen
-
Leider habe ich die Faragen nicht so ganz verstanden,daher schreibe ich den ganzen code und ich bitte jemanden mir zu sagen wo das Fehler liegt.Ich komme irgendwie durcheinander !!
#include<stdio.h>
#include<memory.h>
#include<stdlib.h>
#include<string.h>
#include<limits.h>
#include<math.h>
#include <Algo.h>
#define BASIC 0struct Image
{
//# of Rows in Image = dx
int Rows;
// # of columns in image =dy
int Cols;
// Pointer to image data
unsigned char *Data;
//type of image
unsigned char Type;
};//this routine flips the byte alignement (INTELvsSUN)
// e.g: may 'aabbccdd' be a hex integer number on a SUN(4 Bytes)
//the this number is represented as 'bbaaddcc' on INTEl platformsstatic int flip(int i)
{
return (i<<24)\
|((i<<8)&0x00FF0000)\
|((i>>8)&0x0000FF00)\
|((i>>24)&0x000000FF);
}void read_image( char *fname,struct Image *img)
{
FILE *fp;
int hdr[7]; //PM Headerif(!(fp=fopen(fname,"rb")))
{
perror("fopen");
exit(1);
}
fseek(fp,0,SEEK_SET);//Das braucht man normalerweise nicht da
// fread() den Positionsanzeiger immer am Anfang bringt/*Test PM Header*/
fread(hdr,sizeof(int),sizeof(hdr)/sizeof(int),fp);
if(flip(hdr[0])!=0x56494557)
{
if(hdr[0] !=0x56494557)
{
fputs("illegal file format (not PM or 1 Band or 1 Plane or char data)\n",stderr);
exit(1);
}
else
{
//image comes from a native platform
img->Rows=hdr[3];
img->Cols=hdr[2];
}
}
else
{
//image comes from a foreign platform(byte alignment)
img->Rows=flip(hdr[3]);
img->Cols=flip(hdr[2]);
}if(!(img->Data=(unsigned char*)malloc(img->Rowsimg->Cols)))
{
perror("malloc");
exit(1);
}
/*load image data*/
fread(img->Data,sizeof(unsigned char), img->Rowsimg->Cols,fp);
fclose(fp);
}void convolve(struct Image *In,struct Image *Mask,struct Image *Out)
{
long i,j,m,n,idx,jdx;
int ms,im,val;
unsigned char *tmp;//Kontrolle ob die Werten rictig übergeben wurden In,Mask,Out
if(Mask == NULL)
perror("Fehler XXXX");
if (In==NULL)
perror("Kann Image nicht oeffnen");
if (Out == NULL)
perror("Falsche Ausgabe.Problem mit *Out");if( In != Out)
perror("Nicht gleiche Bilder(die Groesse ! ! !)");
/*the outer summation loop*/
for(i=0; i<In->Rows;++i)
for(j=0; j<In->Cols; ++j)
{
val =0;
for(m=0; m<Mask->Rows; ++m)
for(n=0; n<Mask->Cols; ++n)
{
ms=(signed char)(Mask->Data+mMask->Rows +n);idx=i-m;
jdx=j-n;
if(idx>=0 && jdx>=0)
im=(In->Data+idxIn->Rows + jdx);
val+=ms*im;
}
if(val>255)
val=255;
if(val<0)
val=0;tmp=Out->Data+i*Out->Rows + j;
*tmp=(unsigned char)val;
}
}
static void write_image(char *fname,struct Image *img,int planes,char *comment)
{
FILE *fp;
int i,clen,size,hdr[7];if(!(fp=fopen(fname,"wb")))
{
perror("fopen");
exit(1);
}
hdr[0]=flip(0x56494557); //magic number for pm files("VIEW")
hdr[1]=flip(planes); //number of planes
hdr[2]=flip(img->Cols); //number of rows
hdr[3]=flip(img->Rows); //number of columns
hdr[4]=flip(1); //number of bands
hdr[5]=flip(0x8001); //pixel format (ox8001: unsigned char)
hdr[6]=0; //number of comment bytes )incl.NULL)/*construct comment*/
if(*comment)clen=strlen(comment),hdr[6]=flip(clen+1);/*write header*/
fwrite(hdr,sizeof(int),sizeof(hdr)/sizeof(int),fp);
size=img->Rows*img->Cols;/*write planes*/
for(i=0; i<planes; ++i)
fwrite(img->Data+i*size,sizeof(unsigned char),size,fp);/*write commen*/
if(*comment)
fwrite(comment,sizeof(unsigned char),clen+1,fp);
fclose(fp);
}void main(void)
{/*Deklare Input and Output Images*/
struct Image In,Out,Mask;
char *f1name = "gwbild.pm";
char *f2name = "ergebnisbild.pm";/*Images for mask generation section*/
signed char *tmp;
int i;/*Init image parameters*/
/*Set up a 5x5 Mask*/
Mask.Rows=Mask.Cols=5;
Mask.Type=BASIC;
Mask.Data=(unsigned char*)malloc(25);/*Set all mask values to -1*/
tmp=(signed char*)Mask.Data;
for(i=0; i<25;++i)
{
*tmp=-1;
++tmp;
}/*Now fix the middle one*/
tmp=(signed char*)Mask.Data +13;
*tmp=24;/*Now do the Processing*/
read_image(f1name,&In);
Out.Rows=In.Rows;// So ist es richtig da bei Convolve
Out.Cols=In.Cols;// das Ergebnisbild in Out gespeichert wird
Out.Type=In.Type;//
Out.Data=In.Data;if(!(Out.Data=(unsigned char*)malloc(Out.Rows*Out.Cols)))
{
perror("malloc");
exit(1);
}convolve(&In,&Mask,&Out);
write_image(f2name,&Out,1,"");}
Ich bitte darum wenn jemand antwortet dass er/sie mir genau sagt wo das Problem ist ,da ich wie gesagt etwas neu in dieser QArt von Programmierenug bin ,und ich weiss nicht genau!
Danke ! !
kilomat
-
kilomat schrieb:
Ich bitte darum wenn jemand antwortet dass er/sie mir genau sagt wo das Problem ist
Ich tippe darauf, das du die oben genannte Bedingung verletzt. Wahrscheinlich genau dort, wo der Debugger auch meckert.
@Sgt. Nukem:
Was hast du sonst erwartet.Bye, TGGC \-/