Sibbl: Einfügen von Wasserzeichen klappt nicht wie es soll...

Hallo Leute,
ich hab da 2 kleine Probleme beim einfügen eines Wasserzeichens uns zwar:
1. Das Wasserzeichen hat nach dem einfügen einen Weißen Kasten obwohl es eigendlich einen Transparenten Hintergrund hat.

2. Wenn ich das Wasserzeichen auf kleinere Bilder einfügen möchte wird es garnicht angezeigt.

Ich hoffe das ihr mir da weiterhelfen könnt.

PHP:

  
<?PHP  
  $strImage = $_SERVER['DOCUMENT_ROOT'].'/bildergalerie/'.$_GET['folder']."/".$_GET['image'];  
  if( !file_exists( $strImage ) ) die("Das angegebene Bild existiert nicht!");  
  
  $strWatermark =  $_SERVER['DOCUMENT_ROOT'].'/wasserzeichen.gif';  
  if( !file_exists( $strWatermark ) ) die("Das angegebene Wasserzeichen existiert nicht!");  
  
  $Transpares = 65;  
  
  list ( $Image_Width, $Image_Height, $Image_Type ) = getimagesize ( $strImage );  
  list ( $Watermark_Width, $Watermark_Height, $Watermark_Type ) = getimagesize ( $strWatermark );  
  
  $Watermark = imagecreatefromgif ( $strWatermark ) or die("Fehler bei imagecreatefromgif (Wasserzeichen)");  
  
  $Watermark_pos_x = $Image_Width - $Watermark_Width;  
  $Watermark_pos_y = $Image_Height - $Watermark_Height;  
  
  switch ( $Image_Type ){  
    case 1:  
      $Img = imagecreatefromgif ( $strImage )  or die("Fehler bei imagecreatefromgif");  
      break;  
    case 2:  
      $Img = imagecreatefromjpeg ( $strImage ) or die("Fehler bei imagecreatefromjpeg");  
      break;  
    case 3:  
      $Img = imagecreatefrompng ( $strImage )  or die("Fehler bei imagecreatefrompng");  
	  break;  
	default;  
	  die("Es gibt ein Problem bei switch von ImageCreate!");  
  }  
  
  imagecopymerge ($Img, $Watermark, $Watermark_pos_x, $Watermark_pos_y, 0, 0, $Image_Width, $Image_Height, $Transpares)  
    or die("Fehler bei imagecopymerge");  
  
  switch (  $Image_Type ){  
    case 1:  
      header ( 'content-type: image/gif' );  
      imagegif ( $Img );  
      break;  
    case 2:  
      header ( 'content-type: image/jpeg' );  
      imagejpeg ( $Img, '', $Transpares );  
      break;  
    case 3:  
    default:  
      header ( 'content-type: image/png' );  
      imagepng ( $Img );  
  }  
  
  imagedestroy ( $Img );  
  imagedestroy ( $Watermark );  
  imagedestroy ( $Watermark_out );  
?>  

Orginal Bild:

http://www.knappenverein-hamm-heessen.de/bildergalerie/2012-01-24_test4_l_Hamm/DSCI0496.jpg

Wasserzeichen:

http://www.knappenverein-hamm-heessen.de/wasserzeichen.gif

Bild mit Wasserzeichen:

http://www.knappenverein-hamm-heessen.de/setWatermark.php?folder=2012-01-24_test4_l_Hamm&image=DSCI0496.jpg

Bild klein mit Wasserzeichen:

http://www.knappenverein-hamm-heessen.de/setWatermark.php?folder=2012-01-24_test4_l_Hamm&image=thumb_DSCI0496.jpg

Danke euch schon mal allen für eure Hilfe.

Mfg

  1. Moin!

    ich hab da 2 kleine Probleme beim einfügen eines Wasserzeichens uns zwar:

    1. Das Wasserzeichen hat nach dem einfügen einen Weißen Kasten obwohl es eigendlich einen Transparenten Hintergrund hat.

    imagecopymerge setzt die definierte Transparenz für alle Pixel des zu kopierenden Bildes. imagecopy macht das nicht. Wenn dein GIF also transparent ist, würde ich es mal mit imagecopy versuchen. Alpha-Transparenz wäre damit auch möglich, dazu brauchst du aber als Quellmaterial ein PNG (das macht auch für die Schrift bessere Ergebnisse, weil die Schriftgrenzen keinen Treppeneffekt machen), und musst als Ziel immer mit einem Truecolor-Bild arbeiten (imagecreatetruecolor), und dort hineinkopieren.

    1. Wenn ich das Wasserzeichen auf kleinere Bilder einfügen möchte wird es garnicht angezeigt.

    Keine Ahnung, aber merkwürdige Rundungsfehler bei zu kleinem Kopieren eines großen Wasserzeichens würden mich nicht unbedingt wundern.

    Wenn's nur um das Einfügen eines Schriftzuges geht, könntest du den Text ja auch mit den Textfunktionen reinschreiben.

    - Sven Rautenberg

    1. imagecopymerge setzt die definierte Transparenz für alle Pixel des zu kopierenden Bildes. imagecopy macht das nicht. Wenn dein GIF also transparent ist, würde ich es mal mit imagecopy versuchen. Alpha-Transparenz wäre damit auch möglich, dazu brauchst du aber als Quellmaterial ein PNG (das macht auch für die Schrift bessere Ergebnisse, weil die Schriftgrenzen keinen Treppeneffekt machen), und musst als Ziel immer mit einem Truecolor-Bild arbeiten (imagecreatetruecolor), und dort hineinkopieren.

      Hey,
      alos das mit dem imagecopy hab ich verstanden auch das ich ein png nehmen sollte ist mir jetzt klarr, aberan der Zusammensetzung der Bilder häng ich einwenig.

      Also wenn ich dich richtig verstehe soll ich ein leeres Bild mit imagecreatetruecolor erzeugen und dort dann das Wasserzeichen und das Orginal reinkopieren. Richtig?

      Hab das mal so probiert, aber das scheind nicht ganz richtig zu sein:

        
      <?PHP  
        $strImage = $_SERVER['DOCUMENT_ROOT'].'/bildergalerie/'.$_GET['folder']."/".$_GET['image'];  
        if( !file_exists( $strImage ) ) die("Das angegebene Bild existiert nicht!");  
        
        $strWatermark =  $_SERVER['DOCUMENT_ROOT'].'/wasserzeichen.png';  
        if( !file_exists( $strWatermark ) ) die("Das angegebene Wasserzeichen existiert nicht!");  
        
        list ( $Image_Width, $Image_Height, $Image_Type ) = getimagesize ( $strImage );  
        list ( $Watermark_Width, $Watermark_Height, $Watermark_Type ) = getimagesize ( $strWatermark );  
        
        $Watermark = imagecreatefrompng ( $strWatermark ) or die("Fehler bei imagecreatefromgif (Wasserzeichen)");  
        
        $Watermark_pos_x = $Image_Width - $Watermark_Width;  
        $Watermark_pos_y = $Image_Height - $Watermark_Height;  
        
        switch ( $Image_Type ){  
          case 1:  
            $Img = imagecreatefromgif ( $strImage )  or die("Fehler bei imagecreatefromgif");  
            break;  
          case 2:  
            $Img = imagecreatefromjpeg ( $strImage ) or die("Fehler bei imagecreatefromjpeg");  
            break;  
          case 3:  
            $Img = imagecreatefrompng ( $strImage )  or die("Fehler bei imagecreatefrompng");  
                break;  
              default;  
                die("Es gibt ein Problem bei switch von ImageCreate!");  
        }  
        
        $image = imagecreatetruecolor($Image_Width, $Image_Height);  
        
        imagecopy  ($image, $Watermark, 0, 0, $Watermark_Width, $Watermark_Height, $Watermark_pos_x, $Watermark_pos_y)  
          or die("Fehler bei imagecopymerge");  
        
        imagecopy  ($image, $Watermark, 0, 0, $Image_Width, $Image_Height, 0,0)  
          or die("Fehler bei imagecopymerge");  
        
        switch (  $Image_Type ){  
          case 1:  
            header ( 'content-type: image/gif' );  
            imagegif ( $Img );  
            break;  
          case 2:  
            header ( 'content-type: image/jpeg' );  
            imagejpeg ( $Img, '', $Transpares );  
            break;  
          case 3:  
          default:  
            header ( 'content-type: image/png' );  
            imagepng ( $Img );  
        }  
        
        imagedestroy ( $Img );  
        imagedestroy ( $Watermark );  
        imagedestroy ( $Watermark_out );  
      ?>  
      
      

      Ausgabe:

      Mfg

      1. Edit:
        Das einfügen funktioniert super, nur bei kleinen Bilderngibt es immer noch Probleme. Kann das da drann liegen das das Copyright zu groß ist und an das kleine Img angepasst werden müste? Wie müste ich das machen?

        So siehts jetzt aus:

          
        <?PHP  
          $strImage = $_SERVER['DOCUMENT_ROOT'].'/bildergalerie/'.$_GET['folder']."/".$_GET['image'];  
          if( !file_exists( $strImage ) ) die("Das angegebene Bild existiert nicht!");  
          
          $strWatermark =  $_SERVER['DOCUMENT_ROOT'].'/wasserzeichen.png';  
          if( !file_exists( $strWatermark ) ) die("Das angegebene Wasserzeichen existiert nicht!");  
          
          list ( $Image_Width, $Image_Height, $Image_Type ) = getimagesize ( $strImage );  
          list ( $Watermark_Width, $Watermark_Height, $Watermark_Type ) = getimagesize ( $strWatermark );  
          
          $Watermark = imagecreatefrompng ( $strWatermark ) or die("Fehler bei imagecreatefromgif (Wasserzeichen)");  
          
          $Watermark_pos_x = $Image_Width - $Watermark_Width;  
          $Watermark_pos_y = $Image_Height - $Watermark_Height;  
          
          switch ( $Image_Type ){  
            case 1:  
              $Img = imagecreatefromgif ( $strImage )  or die("Fehler bei imagecreatefromgif");  
              break;  
            case 2:  
              $Img = imagecreatefromjpeg ( $strImage ) or die("Fehler bei imagecreatefromjpeg");  
              break;  
            case 3:  
              $Img = imagecreatefrompng ( $strImage )  or die("Fehler bei imagecreatefrompng");  
                  break;  
                default;  
                  die("Es gibt ein Problem bei switch von ImageCreate!");  
          }  
          
          $Img_new = imagecreatetruecolor($Image_Width, $Image_Height);  
          
          //Bild  
          imagecopy  ($Img_new, $Img, 0, 0, 0, 0, $Image_Width, $Image_Height)  
            or die("Fehler bei imagecopymerge Bild");  
          
          //Wasserzeichen  
          imagecopy  ($Img_new, $Watermark, $Watermark_pos_x, $Watermark_pos_y, 0, 0, $Watermark_Width, $Watermark_Height)  
            or die("Fehler bei imagecopymerge Wasserzeichen");  
          
          switch (  $Image_Type ){  
            case 1:  
              header ( 'content-type: image/gif' );  
              imagegif ( $Img_new );  
              break;  
            case 2:  
              header ( 'content-type: image/jpeg' );  
              imagejpeg ( $Img_new );  
              break;  
            case 3:  
            default:  
              header ( 'content-type: image/png' );  
              imagepng ( $Img_new );  
          }  
          
          imagedestroy ( $Img );  
          imagedestroy ( $Watermark );  
          imagedestroy ( $Img_new );  
        ?>  
        
        

        PS: Im code vorher waren auch ein paar Fehler, sry dafür.

        1. Edit:
          Also das hab noch mal etwas drann gearbeitet und hab es auch jetzt geschaft das Wasserzeichen auf das kleine Bild zu legen, leider komm ich nciht draufwie ich die Prozentuale Größe für das Wasserzeichen errechne. Da bräuchte ich noch etwas Hilfe, so das das kleine Bild aussieht wie das große.

          Code:

            
          <?PHP  
            $strImage = $_SERVER['DOCUMENT_ROOT'].'/bildergalerie/'.$_GET['folder']."/".$_GET['image'];  
            if( !file_exists( $strImage ) ) die("Das angegebene Bild existiert nicht!");  
            
            $strWatermark =  $_SERVER['DOCUMENT_ROOT'].'/wasserzeichen.png';  
            if( !file_exists( $strWatermark ) ) die("Das angegebene Wasserzeichen existiert nicht!");  
            
            list ( $Image_Width, $Image_Height, $Image_Type ) = getimagesize ( $strImage );  
            list ( $Watermark_Width, $Watermark_Height, $Watermark_Type ) = getimagesize ( $strWatermark );  
            
            $Watermark = imagecreatefrompng ( $strWatermark ) or die("Fehler bei imagecreatefromgif (Wasserzeichen)");  
            
            
            if(($Watermark_Width > $Image_Width) or ($Watermark_Height > $Image_Height)){  
          	$width  = $Image_Width /2;  
          	$height = $Image_Height/4;  
          	  
              $Watermark_new = imagecreatetruecolor($width, $height)  
          	  or die("Fehler bei imagecreatetruecolor Wasserzeichen");	  
          	  
              $img_colordepth = imagecolorstotal($Watermark);  
            
              if ($img_colordepth == 0 || $img_colordepth > 255)  
                $Img_new = imagecreatetruecolor($width, $height) or die("Fehler bei imagecreatetruecolor Wasserzeichen");  
              else  
               $Img_new = imagecreate($width, $height) or die("Fehler bei imagecreate Wasserzeichen");  
            
              imagealphablending($Watermark_new, false);  
              imagecopyresampled($Watermark_new, $Watermark, 0, 0, 0, 0, $width, $height, $Watermark_Width, $Watermark_Height);  
              imagesavealpha($Watermark_new, true);  
          	  
          	$Watermark = $Watermark_new;  
          	  
          	$Watermark_Width = $Image_Width /2;  
          	$Watermark_Height = $Image_Height/4;  
            }  
            
            switch ( $Image_Type ){  
              case 1:  
                $Img = imagecreatefromgif ( $strImage )  or die("Fehler bei imagecreatefromgif");  
                break;  
              case 2:  
                $Img = imagecreatefromjpeg ( $strImage ) or die("Fehler bei imagecreatefromjpeg");  
                break;  
              case 3:  
                $Img = imagecreatefrompng ( $strImage )  or die("Fehler bei imagecreatefrompng");  
                    break;  
                  default;  
                    die("Es gibt ein Problem bei switch von ImageCreate!");  
            }  
            
            $Img_new = imagecreatetruecolor($Image_Width, $Image_Height);  
            
            //Bild  
            imagecopy  ($Img_new, $Img, 0, 0, 0, 0, $Image_Width, $Image_Height)  
              or die("Fehler bei imagecopymerge Bild");  
            
            //Position  
            $Watermark_pos_x = $Image_Width - $Watermark_Width;  
            $Watermark_pos_y = $Image_Height - $Watermark_Height;  
            
            //Wasserzeichen  
            imagecopy  ($Img_new, $Watermark, $Watermark_pos_x, $Watermark_pos_y, 0, 0, $Watermark_Width, $Watermark_Height)  
              or die("Fehler bei imagecopymerge Wasserzeichen");  
            
            switch (  $Image_Type ){  
              case 1:  
                header ( 'content-type: image/gif' );  
                imagegif ( $Img_new );  
                break;  
              case 2:  
                header ( 'content-type: image/jpeg' );  
                imagejpeg ( $Img_new );  
                break;  
              case 3:  
              default:  
                header ( 'content-type: image/png' );  
                imagepng ( $Img_new );  
            }  
            
            imagedestroy ( $Img );  
            imagedestroy ( $Watermark );  
            imagedestroy ( $Img_new );  
            if(($Watermark_Width > $Image_Width) or ($Watermark_Height > $Image_Height))  
              imagedestroy($Watermark_new);  
            
          ?>  
          
          

          Bild klein:

          Bild groß:

          Mfg

          1. Hallo

            , so das das kleine Bild aussieht wie das große.

            ist das denn wirklich nötig? Thumbnails werden häufig ohne Wasserzeichen belassen.

            Gruß,
            Kalk

            1. ist das denn wirklich nötig? Thumbnails werden häufig ohne Wasserzeichen belassen.

              so gesehn hast du recht, aber wenn auch mal so kleine Bilder nicht als thumb vorkommen, dann steh ich immer noch vor dem Problem.