*.png processing with c


B

Bgag

Hallo.

Ich beschaeftige mich momentan etwas mit C (nicht C++ oder C#) und moechte nun eine Bilddatei in eine Matrix einlesen. Am einfachsten waere das natuerlich mit Bitmaps, jedoch kann ich diesem Format einfach nichts abgewinnen. Zuerst hatte ich daher ueberlegt mit *.jpg Dateien zu arbeiten, aber das Encodieren und Decodieren von solchen Dateien ist mir einfach zu stressig. Die Grundlagen dazu habe ich zwar verstanden (Huffman-Code, Farbwertberechnung, etc.), aber ich wollte mich auf andere Aspekte konzentrieren.

Ich habe mich also entschieden mit *.png Dateien zu arbeiten, da diese nach meinem Wissen relativ einfach gespeichert werden. Leider habe ich bisher keine brauchbaren Codebeispiele oder Format Spezifikationen gefunden. Daher wuerde mich interessieren, ob sich einer vonb euch bereits mit diesem Thema befasst hat und mir daher bei meinem Vorhaben unterstuetzen kann.

Speziell moechte ich eine *.png Datei auslesen und in einen m*n Vektor schreiben, der als Elemente pixel-Strukturen enthaelt, die nichts anderes halten als die RGB-Farbwerte des jeweiligen Pixels. Das komplette Bild soll dann von einer image Struktur repraesentiert werden, die neben der Matrix alle Headerdaten enthaelt. Dadurch soll es mir moeglich sein verschiedene Algorithmen zur Bildmanipulation zu implementieren. Natuerlich muss es mir dann auch moeglich sein das Resultat meiner Aenderungen in eine neue oder die selbe Datei (je nach Aufrufparametern) zu speichern. Am Ende soll ein kleines Program herauskommen, das dann zum Beispiel so aufgerufen werden kann.

Code:
imtrans bild.png /* laed und speichert bild in selbe datei ohne aenderungen */
imtrans bild.png ziel.png /* speichert es bild ohne aenderungen in neue datei */
imtrans -inverse bild.png ziel.png /* invertiert bild und speichert es in ziel.png */
imtrans -rotate 90 bild.png ziel.png /* dreht bild um 90 grad und speichert es in ziel.png */

Das sind natuerlich nur einige Beispiele, aber so soll es im Endeffekt funktionieren. Hat jemand eine Idee, ein Beispiel oder eine Specification, die erklaert, wie ich eine *.png Datei in eine wie oben beschriebene Matrix einlese und wieder in eine Bilddatei ausgebe? Vielen Dank schonmal fuer eure Hilfe.

MfG, Andy
 
Hallo Andy,

ich hab keine Ahnung wie du die PNG-Spezifikation nicht finden konntest, bei mir war das gleich das erste Suchergebnis bei Google. So viel einfacher als das BMP-Format ist PNG jetzt aber auch wieder nicht, wenn überhaupt. Es gibt allerdings die Bibliothek libpng, die Funktionen zum Lesen und Schreiben von Bildern im PNG-Format bereitstellt. Für BMP sollte es sowas aber auch geben.

Grüße, Matthias
 
B

Bgag

Hallo Matthias!

Danke für den Link! Weiß auch nicht, wie ich den übersehn konnte. Auf jeden Fall hätte ich darauf kommen können bei einem Format wie PNG auch beim W3C zu suchen. Im übrigen denke ich nicht, dass es einfacher ist *.png Dateien anstatt *.bmp Dateien zu lesen, aber ich bin schlicht weg kein Fan vom BMP-Format. Danke nochmals für deine Hilfe. Über Codeschnipsel und ähnliches würde ich mich natürlich auch freuen.

MfG, Andy
 
B

Bgag

Entschuldigt das doppelte Posting. Ich bin gerade auf die libpng gestossen habe diese installiert und angefangen die dazugehörige Dokumentation zu lesen. Leider hat die mich sehr schnell abgehängt. Daher wollte ich nun wissen, ob einer von euch die libpng bereits verwendet hat und mir sagen kann, wie ich sie verwenden muss um ein *.png File in eine Matrix auszulesen, die ich dann wiederum durch einfache Rechenoperationen (Matrixmultiplikation, Farbinvertierung, etc.) manipulieren kann. Unten findet ihr meinen ersten versuch eine *.png Datei auszulesen.

MfG, Andy

C:
#include <stdio.h>
#include <png.h>

enum boolean{ FALSE, TRUE };

main(int argc, char *argv[])
{
        /* init pointer on *.png */
        FILE *fp;

        /* check arguments */
        if( argc < 1 )
        {
                printf("Zu wenig argumente");
                exit(1);
        }

        /* read file */
        readpng(fp);

        return 1;
}

int readpng(FILE *fp)
{
        /* open file for reading */
        fp = fopen(file_name, "rb");

        /* check if file could be opened */
        if( !fp )
        {
                return FALSE;
        }

        /* read first 8 bytes */
        fread(header, 1, number, fp);

        /* copy data to check if image is a png */
        is_png = !png_sig_cmp(header, 0, number);

        /* check if file is a *.png file */
        if( !is_png )
        {
                return FALSE;
        }

        return TRUE;
}
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge