login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Watermerk met GD (Opgelost)

Offline qubus - 11/09/2009 20:06
Avatar van qubusLid Hallo,

Ik probeer een watermerk tekst aan een foto toe te voegen bij uploaden. Ik kom er echter niet uit, hij load de foto netjes op, en past de maat prima aan. Echter het watermerk staat er niet in.

Wat doe ik fout?

  1. function resize($filename, $dest, $width, $type=''){
  2. //originele dimensies
  3. $dimensions = getimagesize($filename);
  4. $bronbreedte = $dimensions[0];
  5. $bronhoogte = $dimensions[1];
  6. //nieuwe dimensies met dezelfde ratio, de gewenste breedte geef je me in de aanroep ($width)
  7. $doelhoogte = ($bronhoogte * $width) / $bronbreedte;
  8. $doelhoogte = round($doelhoogte, 0);
  9. if(@imagecreatefromgif($filename)){
  10. $img=imagecreatefromgif($filename);
  11. $type_r='gif';
  12. }
  13. elseif(@imagecreatefromjpeg($filename)){
  14. $img=imagecreatefromjpeg($filename);
  15. $type_r='jpg';
  16. }
  17. elseif(@imagecreatefrompng($filename)){
  18. $img=imagecreatefrompng($filename);
  19. $type_r='png';
  20. }
  21. elseif(@imagecreatefromwbmp($filename)){
  22. $img=imagecreatefromwbmp($filename);
  23. $type_r='bmp';
  24. }
  25. else{
  26. return 'Cannot open file';
  27. }
  28. $type=($type=='')?$type_r:'';
  29. // Watermerk string en font
  30. $sString = 'watermerk';
  31. $sFont = './font/Adventure.ttf';
  32. // Afmetingen watermerk bepalen
  33. $aPositions = imagettfbbox(20, 0, $sFont, $sString);
  34. $iWidth = $aPositions[2] - $aPositions[0];
  35. $iHeight = $aPositions[1] - $aPositions[7];
  36. // Watermerk aanmaken en tekst toevoegen
  37. $rWatermerk = imagecreatetruecolor($iWidth, $iHeight);
  38. $iAchtergrond = imagecolorallocate($rWatermerk, 255, 255, 255);
  39. $iText = imagecolorallocate($rWatermerk, 100, 100, 100);
  40. imagefill($rWatermerk, 0, 0, $iAchtergrond);
  41. imagettftext($rWatermerk, 16, 0, 16, 17, $iText, $sFont, $sString);
  42. // Einde aanmaken watermerk
  43. //thumb met de nieuwe dimensies
  44. $img_n=imagecreatetruecolor ($width, $doelhoogte);
  45. imagecopyresampled($img_n, $img, 0, 0, 0, 0, $width, $doelhoogte, imagesx($img), imagesy($img));
  46. // Watermerk naar afbeelding kopiëren
  47. imagecopymerge($img_n, $rWatermerk, $width-$iWidth, 5, 0, 0, $iWidth, $iHeight, 20);
  48. if($type=='gif'){
  49. imagegif($img_n, $dest);
  50. }
  51. elseif($type=='jpg'){
  52. imagejpeg($img_n, $dest);
  53. }
  54. elseif($type=='png'){
  55. imagepng($img_n, $dest);
  56. }
  57. elseif($type=='bmp'){
  58. imagewbmp($img_n, $dest);
  59. }
  60. Return true;
  61. }


Alvast bedankt!

2 antwoorden

Gesponsorde links
Offline marten - 12/09/2009 09:31
Avatar van marten Beheerder Ben even gaan kijken naar je functie.
Er zijn een aantal verbeteringen. Ten eerste de leesbaarheid van je script. Gebruik tabs en spaties om de leesbaarheid te vergroten:

  1. $img_n=imagecreatetruecolor ($width, $doelhoogte);
  2. //wordt dan
  3. $img_n = imagecreatetruecolor ($width, $doelhoogte);


You get the point!

Verder het gedeelte waarin je de type van de afbeelding bepaalt. Je gaat je server extra belasten hierdoor. Beter is het om dit te doen:

  1. $ar = explode('.', $filename);
  2. $ext = strtolower(array_pop($ar));
  3.  
  4. switch ($ext) {
  5. case "gif":
  6. $img = imagecreatefromgif($filename);
  7. $type_r = 'gif';
  8. case "jpg":
  9. case "jpe":
  10. case "jpeg":
  11. $img = imagecreatefromjpeg($filename);
  12. $type_r = 'jpg';
  13. case "png":
  14. $img = imagecreatefrompng($filename);
  15. $type_r = 'png';
  16. case "bmp":
  17. $img = imagecreatefromwbmp($filename);
  18. $type_r = 'bmp';
  19. break;
  20.  
  21. default:
  22. return 'Cannot open file';
  23. break;
  24. }
  25. /** Onderstaande eruit gehaald omdat het handiger kan zie boven
  26.   if (@imagecreatefromgif($filename)) {
  27.   $img = imagecreatefromgif($filename);
  28.   $type_r = 'gif';
  29.   } elseif (@imagecreatefromjpeg($filename)) {
  30.   $img = imagecreatefromjpeg($filename);
  31.   $type_r = 'jpg';
  32.   } elseif (@imagecreatefrompng($filename)) {
  33.   $img = imagecreatefrompng($filename);
  34.   $type_r = 'png';
  35.   } elseif (@imagecreatefromwbmp($filename)) {
  36.   $img = imagecreatefromwbmp($filename);
  37.   $type_r = 'bmp';
  38.   } else {
  39.   return 'Cannot open file';
  40.   }
  41.   */


Je hoeft dan niet steeds de server een imagecreate uit te laten voeren.

Dan over het probleem zelf. Je probeert om een watermerk als text in je afbeelding te zetten. Waarom pak je niet gewoon een png? Hieronder de functie die ik altijd gebruik hiervoor.

  1. public function addWaterMark($source, $dst) {
  2. $source_stamp = 'watermark.png';
  3. $src = imagecreatefromjpeg ( $source );
  4. //Of andere types natuurlijk
  5. $stamp = imagecreatefrompng ( $source_stamp );
  6.  
  7. // Set the margins for the stamp and get the height/width of the stamp image
  8. $marge_right = 10;
  9. $marge_bottom = 10;
  10. $sx = imagesx ( $stamp );
  11. $sy = imagesy ( $stamp );
  12.  
  13. imagealphablending ( $stamp, true );
  14.  
  15. imagecopy ( $src, $stamp, imagesx ( $src ) - $sx - $marge_right, imagesy ( $src ) - $sy - $marge_bottom, 0, 0, imagesx ( $stamp ), imagesy ( $stamp ) );
  16.  
  17. imagejpeg ( $src, $dst, 100 );
  18. imagedestroy ( $src );
  19. }


Maak twee aparte functies voor resizen en watermerk plaatsen

  1. $Std->resize('filename1.jpg', 'destination1.jpg', 500);
  2. $Std->addWaterMark('destination1.jpg', 'destination1.jpg');


Hierdoor wordt je code veel overzichtelijker en wanneer je later alleen de watermerk functie nodig hebt kan je deze veel makkelijker hergebruiken.
Offline qubus - 12/09/2009 20:33
Avatar van qubus Lid Dank je wel voor de tips, ik neem ze mee!
Met jouw voorbeeld aan da hand heb ik het werkend gekregen.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.204s