Forum: PC-Programmierung png processing with C


von Avedo (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

libpng liefert alles was du brauchst

von Whitespace (Gast)


Lesenswert?

Oder, wenn du evtl. auch mal andere Grafikformate brauchst, libnetpbm.

von Avedo (Gast)


Lesenswert?

Ist libpng Teil der Standardbibliothek und kennt ihr irgendwelche 
Tutorials zu diesem Thema?

MfG, Andy

von Peter (Gast)


Lesenswert?

> 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.

von zwieblum (Gast)


Lesenswert?

kannst auch imlib nehmen oder ....

von Avedo (Gast)


Angehängte Dateien:

Lesenswert?

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

von test (Gast)


Lesenswert?

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.

von Avedo (Gast)


Lesenswert?

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

von Avedo (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.