Willi: Transparenz bei GIF-Bildern mit PHP („<img src="data: …“)

Beitrag lesen

Dear forum,

Um den Spambots das Feld nicht kampflos zu überlassen, habe ich mich gestern dazu entschlossen, alle E-Mail-Adressen auf abi10-asg.de zu verschleiern. Ich habe mir überlegt, am besten geht das mit Bildern - da Adressen wie »willi292 (at) web (.) de« manche Leute doch eher verwirren. Um die Adressen dann nicht per URL an ein Script zu übergeben (weil dann ja in der URL die Adressen stehen müssten …) habe ich mir gedacht - benutze ich doch data-URLs.

Das hat auch alles problemlos geklappt. Doch nach dem Upload dann das erste Problem: die Schrift sieht hochgeladen anders aus! Ich vermute, dass Vista im Hintergrund die Schrift glättet und dann an PHP weitergibt und das auf dem Server eben nicht passiert. Naja, okay. Mit arial war das Ergebnis nicht so toll, jetzt habe ich sie geändert (Calibri) und es geht.

Bei dem Haupteinsatzzweck (die Steckbriefe, z.B. hier) sieht es nun auch ganz okay aus. Es fällt zwar auf, dass ein Bild verwendet wird, aber es fügt sich dennoch gut in den Rest der Seite ein.
An anderen Stellen ist das bei weitem nicht so toll. Für den Footer habe ich die Funktion um eine Farbwahl erweitert, sodass das Bild dort den gleichen Hintergrund hat wie der Absatz. Aber bei der Tabelle unter /schueler geht das nun mal nicht so gut. Mit transparenten GIFs wäre es auch hier kein Problem, doch das will nicht so recht klappen.

Kann mir jemand meinen Fehler in meiner function sagen?

function _email($address, $type = 'text', $link = 0, $bgcolor = array(255,255,255)){  
  
  $pos_at = strpos($address, '@');  
  $substr1 = substr($address, 0, $pos_at);  
  $substr2 = substr($address, $pos_at + 1);  
  $pos_dot = strrpos($substr2, '.');  
  $substr3 = substr($substr2, 0, $pos_dot);  
  $substr4 = substr($substr2, $pos_dot + 1);  
  $address_difficult = $substr1 . ' [an] ' . $substr3 . ' [.] ' . $substr4; // wird für alternativ-Text verwendet (für IE etc., die kein data: unterstützen)  
  
  switch($type){  
    case 'text':  
      return ($link == 0) ? $address : '<a href="mailto:'.$address.'">'.$address.'</a>';  
    case 'graphic':  
      $textsize = imagettfbbox(10, 0, 'fonts/calibri.ttf', $address);  
      $width = $textsize[2] - $textsize[0];  
      $height = $textsize[1] - $textsize[7];  
      $im = imagecreatetruecolor($width + 5, $height);  
      $background_color = ImageColorAllocatealpha ($im, $bgcolor[0], $bgcolor[1], $bgcolor[2], 127);  
      ImageFill($im, 0, 0, $background_color);  
      $black = ImageColorAllocate ($im, 0, 0, 0);  
      imagettftext($im, 10, 0, 0, $height - 3, $black, 'calibri.ttf', $address);  
      $tmpfname = tempnam ("/tmp", "FOO");  
      Imagegif($im,$tmpfname); the file  
      $temp = fopen($tmpfname,"rb");for reading binary  
      $buffer = fread($temp,filesize($tmpfname));  
      fclose($temp);the file  
      unlink($tmpfname); with the file, discard  
      $out = base64_encode($buffer); // encodieren  
      return '<img src="data:image/gif;base64,'.chunk_split($out).'" alt="'.$address_difficult.'" />';  
  }  
}

Fände ne hilfreiche Antwort echt toll :P ;)

— lg, gabriel