daniel: Bilddatei mit Wasserzeichen/Text-String versehen

Hallo alle zusammen,

ich versuche gerade, eine Klasse zu schreiben, die u.a. ein Bild mit einem Wasserzeichen versehen soll.

Ein bestehendes Bild soll also mit einen kleinen Schriftzug irgendwo in der Ecke versehen werden.
Also
1. Orginal-Bild öffnen
2. Bildchen mit Schriftzug generieren
3. Bildchen mit Schriftzug in das Orginalbild einkopieren
4. "beschriftetes" Orginalbild wieder wegspeichern

Eigentlich gar nicht sooo schwer - sollte man meinen ;-)
Bis zum 2ten Schritt komme ich auch, ich kann einen Schriftzug generieren, aber danach stehe ich blöd da...

Meine Methode dazu sieht bisher so aus:
 /**
 * AddWatermark
 * platziert einen geg. Textstring in geg. Bilddatei
 */
         function AddWatermark($ScrPath,$DestPath,$TxtString) {

/* Allg. Variablen */
                 $SavePath = "/www/_Testdir_local/image-process/uploaded_resized/text.png";
                 $FontType = imageloadfont('proggyclean.gdf');
                 $PaddingHeight = 4;
                 $PaddingWidth = 8;

/* Abmessungen d. Wasserzeichens festlegen */
                 $StringWidth = ImageFontWidth($FontType) * strlen($TxtString)+$PaddingWidth;
                 $StringHeigth = ImageFontHeight($FontType)+$PaddingHeight;

/* Text- und Hintergrundfarbe */
  $StrImage = imagecreate($StringWidth,$StringHeigth);
                 $BackColor = ImageColorAllocate($StrImage,174,171,182);
                 $TxtColor = ImageColorAllocate($StrImage,255,255,255);

/* Textstring erstellen */
                 Imagestring($StrImage,$FontType,$PaddingWidth/2,$PaddingHeight/2,$TxtString,$TxtColor);

ImagePng($StrImage,$SavePath);

} // function AddWatermark

Aber wie bekomme ich jetzt dieses blöde Textbildchen in meine richtige  Bilddatei???
ich vermute mal, ich muss irgendwie was mit http://de2.php.net/manual/de/function.imagecopyresized.php drehen, aber ich weiß nicht so recht, wie ich das anstellen soll :-((

Vielleicht kann mir jemand auf die Sprünge helfen?
Benutze übrigens die GD-Lib2.0...

Vielen Dank für eure Hilfe,
Grüße,
Daniel

  1. Zunächst: so wie das aussieht schreibst du eine Funktion, keine Klasse (oder eine Klassenfunktion, aber es geht nicht um eine Klasse, oder?).
    Und: Unter Wasserzeichen versteht man, ein Bild nicht sichtbar so zu modifizieren, daß z.B. eine Copyright-Information darin enthalten ist. Ob das mit PHP überhaupt möglich ist, weiß ich nicht. Für so etwas gibt es z.B. in Photoshop die Funktion "embed watermark".

    Mal eine blöde Frage:

    Warum erzeugst du den String nicht direkt in deinem Originalbild? Deine Variante kommt mir vor wie "von hinten durch die Brust ins Auge".

    Aber du kannst es natürlich mit imagecopyresized (bzw. bevorzuge ich imagecopyresampled, dann hast du kein Problem mit index-farben) machen. Wo genau liegt denn da dein Problem?

    Grüße

    Heizer

    1. Hi,

      vielen dank für deine antwort.

      Zunächst: so wie das aussieht schreibst du eine Funktion, keine Klasse (oder eine Klassenfunktion, aber es geht nicht um eine Klasse, oder?).

      nein, ich schreibe an einer klasse, die das gesamte handling von hochgeladenen bildateien regeln soll (validierung, verkleinern, beschriften, speichen usw.)
      der rest der klasse ist aber für mein problem unerheblich und ich wollte niemanden den gesamten code zumuten :-)
      und die "funktionen" innerhalb einer klasse werden meines wissens nach als methoden bezeichnet, auch wenn sie genauso wie funktionen definiert werden. lass mich da aber gern eines besseren belehren.

      Und: Unter Wasserzeichen versteht man, ein Bild nicht sichtbar so zu modifizieren, daß z.B. eine Copyright-Information darin enthalten ist. Ob das mit PHP überhaupt möglich ist, weiß ich nicht. Für so etwas gibt es z.B. in Photoshop die Funktion "embed watermark".

      ok, dann hab ich mich falsch ausgedrückt.
      ich will also 2 bilder ineinander kopieren.

      Mal eine blöde Frage:

      Warum erzeugst du den String nicht direkt in deinem Originalbild? Deine Variante kommt mir vor wie "von hinten durch die Brust ins Auge".

      ok, hast du recht. meine methode bietet allerdings etwas mehr flexibnilität finde ich. aber ist ja auch noch nicht fertig.

      ich habe mal meinen quellcode etwas angepasst,
      und bin darauf gekommen, das ds problem irgendwo bei dem imagecopymerge liegen muss. der handler mit dem Textstring wird einfach nicht in das Orginalbild einkopiert....
      keine Ahnung wiso, beide Bilder (das Ausgangsbild und das Bild mit dem Text-String) werden korrekt erzeugt...??

      Mein (angepasster und besser kommentierter) code dazu:

      /**
       * AddWatermark
       * platziert einen geg. Textstring in geg. Bilddatei
       */
               function AddWatermark($SrcImgPath,$TxtString) {

      /* Allg. Variablen */
                       $SrcImgPath = "/www/_Testdir_local/image-process/uploaded_resized/_X_20041231164330_CIMG0005.JPG";
                       $FontType = imageloadfont('proggyclean.gdf');
                       $PaddingHeight = 4;
                       $PaddingWidth = 8;

      /* Abmessungen d. Wasserzeichens festlegen */
                       $StringWidth = imagefontwidth($FontType) * strlen($TxtString)+$PaddingWidth;
                       $StringHeigth = imagefontheight($FontType)+$PaddingHeight;

      /* Text- und Hintergrundfarbe fuer Wasserzeichen */
        $StrImg = imagecreate($StringWidth,$StringHeigth);
                       $BackColor = imagecolorallocate($StrImg,174,171,182);
                       $TxtColor = imagecolorallocate($StrImg,255,255,255);

      /* Handler d. Textbildes mit Text versehen  */
                       imagestring($StrImg,$FontType,$PaddingWidth/2,$PaddingHeight/2,$TxtString,$TxtColor);

      /* Handler vom Orginalbild erstellen */
                       $SrcImg = imagecreatefromjpeg($SrcImgPath);

      /* Aus beiden Handlern ein Bild machen (StrImg in SrcImg einkopieren) */
        imagecopymerge($SrcImg,$StrImg,0,0,0,0,$StringWidth,$StringHeight,100);

      /* Neues Bild (Orginalbild mit Beschriftung) speichern */
                       imagejpeg($SrcImg,"/www/_Testdir_local/image-process/uploaded_resized/TEST3.JPG");

      } // function AddWatermark

      irgendwo bei dem imagecopymerge muss der wurm drinsein.
      imagecopy klappt genauso wenig.
      TEST3.JPG ist nachher nur das Ausgangsbild - OHNE den string, den ich einkopieren wollte...
      Aufruf der Methode übrigens mit $image -> AddWatermark(NULL,"Daniel Haller, 2004");  - sollte eigentlich auch korrekt sein.

      Weiß jemand weiter?!?

      Grüße,
      Daniel