http://www.pronix.de -> Tutorials -> Grafiken erzeugen mit C: GD-Library -> Image erzeugen und einlesen

Image erzeugen und einlesen

Wie man ein neues Image erstellt haben sie bereits im Kapitel zuvor kennen gelernt.

 /*image initialisieren*/
 gdImagePtr image;
 /*Wir erzeugen ein Image mit 100x100 Pixel*/
 image=gdImageCreate(100,100);

Nun ist es auch möglich bereits erstellte Grafiken oder Bilder einzulesen. Nehmen wir gleich unser Bild vom Beispiel zuvor:

GD-Library: Erste Beispielgrafik

gdImagePtr image;
FILE *png;
png = fopen("./bild1.png", "rb");
if(png==NULL) { /*Fehler*/ exit(0); }
image = gdImageCreateFromPng(png);
fclose(png);

Wir öffnen unser Image ganz normal mit einem Stream und erstellen anschließend ein neues Image mittels:

image = gdImageCreateFromPng(png);

Dieses Image können wir nun wieder nach belieben bearbeiten. Denn Filehandle sollten anschließend wieder schließen, da dies nicht automatisch geschieht. Wollen wir nun bild1.png weiterbearbeiten.

/*   gd2.c   */

#include <stdio.h>
#include <gd.h>

int main()
{
   /*image initialisieren*/
   gdImagePtr image;
   FILE *png;
   int black, white, red, blue, yelow;

    png = fopen("./bild1.png", "rb");
    if(png==NULL) { /*Fehler*/ exit(0); }
    image = gdImageCreateFromPng(png);
    fclose(png);

   /*Speicher für die Farben allozieren*/
   white=gdImageColorAllocate(image,0,0,0);   /*Weiss*/
   black=gdImageColorAllocate(image,255,255,255); /*Schwarz*/
   red  =gdImageColorAllocate(image,255,0,0); /*rot*/
   blue =gdImageColorAllocate(image,0,0,255); /*blau*/
   yelow=gdImageColorAllocate(image,255,255,0); /*gelb*/

   gdImageRectangle(image,25,25,75,75,black);
   gdImageFill(image, 45,45, black);
   gdImageFill(image, 55,55, black);
   gdImageFill(image, 45,55, white);
   gdImageFill(image, 55,45, white);

   png = fopen("bild2.png", "wb");

   gdImagePng(image,png);

   fclose(png);

   gdImageDestroy(image);

   return 0;
}

Und so siehts aus:
GD-Library: Beispielgrafik2

Übersetzen sie das ganze wieder wie gewohnt:

TTY

you@host > gcc -o image image.c -lgd

you@host >

Weitere Möglichkeiten haben sie mittels:

jpeg=fopen("./image.jpeg", "rb");
image = gdImageCreateFromJpeg(jpeg);
if(image==NULL) { exit(0); }
fclose(jpeg);

Obriges kann genauso angewendet werden wie das Beispiel davor. Nur ist das Problem das die neuere GD-Bibliothek aus Lizenzgründen keine Gif-Format mehr unterstützt. Benötigen sie dieses Format, so sollten sie sich eine ältere GD-Library herunterladen.
Anmerkung von Martin Conrad: Inzwischen ist die Unterstützung von gif Formaten auch wieder in neueren Versionen implementiert.

Weiter Möglichkeiten die ebenso wie gdImageCreateFromJpeg funktionieren sind:

gdImageCreateFromXbm(xbm)   //X-Bitmap-Format
gdImageCreateFromWmp(wbmp)  //WBitmap
gdImageCreateFromGd(gd)     //gd-Format
gdImageCreateFromGd2(gd2)   //gd2-Format

Alle erwarten ebenso einen Stream. Vom Format *.gd kann ich abraten, da die Datei nicht komprimiert wird und recht groß werden kann.

Weiter mit Dateien ausgeben und sichern