www.mikrocontroller.net

Forum: PC-Programmierung png processing with C


Autor: Avedo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
libpng liefert alles was du brauchst

Autor: Whitespace (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder, wenn du evtl. auch mal andere Grafikformate brauchst, libnetpbm.

Autor: Avedo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist libpng Teil der Standardbibliothek und kennt ihr irgendwelche 
Tutorials zu diesem Thema?

MfG, Andy

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst auch imlib nehmen oder ....

Autor: Avedo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

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

Autor: test (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da liegt Dein Fehler:
  /* loop over image rows */
  for(i = 0; i < pic.height; i++)
  {
    /* loop over image columns */
    for(j = 0; j < pic.width; j++)
    {
      tmp = rand() % 255 + 1;
      pic.matrix[i][j].red = tmp;
      tmp = rand() % 255 + 1;
      pic.matrix[i][j].green = tmp;
      tmp = rand() % 255 + 1;
      pic.matrix[i][j].blue = tmp;
    }
  }

Genauer gesagt da:
 pic.matrix[i][j].red = tmp;

und dann entsprechend weiter.

Autor: Avedo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Avedo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

pixel **pnmalloc(unsigned int n, unsigned int m)
{
  /* init matrix pointer */
  pixel **p;

  /* allocate space for rows */
  p = (pixel **) malloc(n * sizeof(pixel *));

  /* validate pointer */
  if( p != NULL )
  {
    /* allocate first column */
    p[0] = (pixel *) malloc(n * m * sizeof(pixel));

    /* validate pointer */
    if( p[0] == NULL )
    {
      /* set pointer to NULL */
      free(p);
      p = NULL;
    }

    else
    {
      /* init helper var */
      unsigned int i;

      /* loop over rest of columns */
      for(i = 1; i < m; i++)
      {
        p[i] = p[i-1] + m;
      }
    }
  }

  return p;
}

void pnmfree(pixel **p)
{
  /* check for NULL pointer */
  if( p != NULL )
  {
    free(p[0]);
  }

  /* free space */
  free(p);
}
Die Speicherallocierung habe ich daraufhin wie folgt geändert.
  /* init picture */
  pnm pic =
  {
    50,
    100,
    255,
    3,
    (pixel **) pnmalloc(pic.width, pic.height)
  };

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.