Hallo! Ich habe ein kleines Problem! Ich möchte via C eine *.png in eine Matrix auslesen. Kann mir jemand sagen, wie ich das bewerkstelligen kann? MfG, Andy
Ist libpng Teil der Standardbibliothek und kennt ihr irgendwelche Tutorials zu diesem Thema? MfG, Andy
> Ist libpng Teil der Standardbibliothek
nein, aber dafür gibt es sei ja frei im Internet. Auch die Doku auf der
Homepage erklärt eignetlich alles was mach braucht.
Hallo zusammen. Ich habe mich gestern und heute nochmals ausführlich mit diesem Themenbereich beschäftigt und bin dabei leider auf viele Probleme beim Umgang mit den von euch empfohlenen Libs gestoßen. Ein Freund hat mich nun jedoch auf das PNM-Format hingewiesen, ds äußerst leicht zu lesen und schreiben ist. NähereInformationen findet ihr unter folgendem Link: http://en.wikipedia.org/wiki/Netpbm_format#Reading_and_Writing_PGM_Image_Using_C.5Bclarification_needed.5D Leider sind dabei nun auch ein paar Probleme aufgetreten. Ich habe das Programm in seinem momentanen Satus mittels gcc -ansi -o pxm pxm.c geparst. Leider bekomme ich einen Segmentation fault error und ich weiß beim besten Willen nicht, woran das liegt. Ich habe mir die Zeit genommen meinen Code ausführlich zu dokumentieren und wäre euch sehr dankbar, wenn ihr mal einen Blick auf meinen Quellcode werfen könntet. Meine pxm.c findet ihr im Anhang. Vielen dank für euer Verständnis und eure Hilfe. MfG, Andy
Da liegt Dein Fehler:
1 | /* loop over image rows */
|
2 | for(i = 0; i < pic.height; i++) |
3 | {
|
4 | /* loop over image columns */
|
5 | for(j = 0; j < pic.width; j++) |
6 | {
|
7 | tmp = rand() % 255 + 1; |
8 | pic.matrix[i][j].red = tmp; |
9 | tmp = rand() % 255 + 1; |
10 | pic.matrix[i][j].green = tmp; |
11 | tmp = rand() % 255 + 1; |
12 | pic.matrix[i][j].blue = tmp; |
13 | }
|
14 | }
|
Genauer gesagt da:
1 | pic.matrix[i][j].red = tmp; |
und dann entsprechend weiter.
Und was ist daran falsch? pic ist doch ein Object vom Strukturtyp pnm und somit kann ich mit hilfe des Punkt-Operators auf dessen Werte (in meinem Fall die Matrix) zugreifen. Die Matrix ist aber nur eine reihe von Pointern auf Pixel-Strukturen. Deshlab sollte dieser Zugriff doch möglich sein? Entschuldige, wenn ich da falsch liege. Beschäftige mich keine 3 Wochen mit C. MfG, Andy
Entschuldigt das doppelte Posting. hatte noch etwas Probleme und habe nun versucht meinen zugriff auf die Matrix durch eine neue Allocierung des Speichers zu beheben. das funktioniert leider auch nicht kann mir jemand sagen warum dies so ist? MfG, Andy
1 | pixel **pnmalloc(unsigned int n, unsigned int m) |
2 | {
|
3 | /* init matrix pointer */
|
4 | pixel **p; |
5 | |
6 | /* allocate space for rows */
|
7 | p = (pixel **) malloc(n * sizeof(pixel *)); |
8 | |
9 | /* validate pointer */
|
10 | if( p != NULL ) |
11 | {
|
12 | /* allocate first column */
|
13 | p[0] = (pixel *) malloc(n * m * sizeof(pixel)); |
14 | |
15 | /* validate pointer */
|
16 | if( p[0] == NULL ) |
17 | {
|
18 | /* set pointer to NULL */
|
19 | free(p); |
20 | p = NULL; |
21 | }
|
22 | |
23 | else
|
24 | {
|
25 | /* init helper var */
|
26 | unsigned int i; |
27 | |
28 | /* loop over rest of columns */
|
29 | for(i = 1; i < m; i++) |
30 | {
|
31 | p[i] = p[i-1] + m; |
32 | }
|
33 | }
|
34 | }
|
35 | |
36 | return p; |
37 | }
|
38 | |
39 | void pnmfree(pixel **p) |
40 | {
|
41 | /* check for NULL pointer */
|
42 | if( p != NULL ) |
43 | {
|
44 | free(p[0]); |
45 | }
|
46 | |
47 | /* free space */
|
48 | free(p); |
49 | }
|
Die Speicherallocierung habe ich daraufhin wie folgt geändert.
1 | /* init picture */
|
2 | pnm pic = |
3 | {
|
4 | 50, |
5 | 100, |
6 | 255, |
7 | 3, |
8 | (pixel **) pnmalloc(pic.width, pic.height) |
9 | };
|
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.