Watermerk met GD (Opgelost)
qubus - 11/09/2009 20:06
Lid
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?
function resize($filename, $dest, $width, $type=''){
//originele dimensies
$dimensions = getimagesize($filename);
$bronbreedte = $dimensions[0];
$bronhoogte = $dimensions[1];
//nieuwe dimensies met dezelfde ratio, de gewenste breedte geef je me in de aanroep ($width)
$doelhoogte = ($bronhoogte * $width) / $bronbreedte;
$doelhoogte = round($doelhoogte, 0);
if(@imagecreatefromgif($filename)){
$img=imagecreatefromgif($filename);
$type_r='gif';
}
elseif(@imagecreatefromjpeg($filename)){
$img=imagecreatefromjpeg($filename);
$type_r='jpg';
}
elseif(@imagecreatefrompng($filename)){
$img=imagecreatefrompng($filename);
$type_r='png';
}
elseif(@imagecreatefromwbmp($filename)){
$img=imagecreatefromwbmp($filename);
$type_r='bmp';
}
else{
return 'Cannot open file';
}
$type=($type=='')?$type_r:'';
// Watermerk string en font
$sString = 'watermerk';
$sFont = './font/Adventure.ttf';
// Afmetingen watermerk bepalen
$aPositions = imagettfbbox(20, 0, $sFont, $sString);
$iWidth = $aPositions[2] - $aPositions[0];
$iHeight = $aPositions[1] - $aPositions[7];
// Watermerk aanmaken en tekst toevoegen
$rWatermerk = imagecreatetruecolor($iWidth, $iHeight);
$iAchtergrond = imagecolorallocate($rWatermerk, 255, 255, 255);
$iText = imagecolorallocate($rWatermerk, 100, 100, 100);
imagefill($rWatermerk, 0, 0, $iAchtergrond);
imagettftext($rWatermerk, 16, 0, 16, 17, $iText, $sFont, $sString);
// Einde aanmaken watermerk
//thumb met de nieuwe dimensies
$img_n=imagecreatetruecolor ($width, $doelhoogte);
imagecopyresampled($img_n, $img, 0, 0, 0, 0, $width, $doelhoogte, imagesx($img), imagesy($img));
// Watermerk naar afbeelding kopiëren
imagecopymerge($img_n, $rWatermerk, $width-$iWidth, 5, 0, 0, $iWidth, $iHeight, 20);
if($type=='gif'){
imagegif($img_n, $dest);
}
elseif($type=='jpg'){
imagejpeg($img_n, $dest);
}
elseif($type=='png'){
imagepng($img_n, $dest);
}
elseif($type=='bmp'){
imagewbmp($img_n, $dest);
}
Return true;
}
function resize( $filename , $dest , $width , $type = '' ) {
//originele dimensies
$bronbreedte = $dimensions [ 0 ] ;
$bronhoogte = $dimensions [ 1 ] ;
//nieuwe dimensies met dezelfde ratio, de gewenste breedte geef je me in de aanroep ($width)
$doelhoogte = ( $bronhoogte * $width ) / $bronbreedte ;
$doelhoogte = round ( $doelhoogte , 0 ) ; if ( @ imagecreatefromgif( $filename ) ) {
$img = imagecreatefromgif( $filename ) ;
$type_r = 'gif' ;
}
elseif ( @ imagecreatefromjpeg( $filename ) ) {
$img = imagecreatefromjpeg( $filename ) ;
$type_r = 'jpg' ;
}
elseif ( @ imagecreatefrompng( $filename ) ) {
$img = imagecreatefrompng( $filename ) ;
$type_r = 'png' ;
}
elseif ( @ imagecreatefromwbmp( $filename ) ) {
$img = imagecreatefromwbmp( $filename ) ;
$type_r = 'bmp' ;
}
else {
return 'Cannot open file' ;
}
$type = ( $type == '' ) ?$type_r : '' ;
// Watermerk string en font
$sString = 'watermerk' ;
$sFont = './font/Adventure.ttf' ;
// Afmetingen watermerk bepalen
$aPositions = imagettfbbox( 20 , 0 , $sFont , $sString ) ;
$iWidth = $aPositions [ 2 ] - $aPositions [ 0 ] ;
$iHeight = $aPositions [ 1 ] - $aPositions [ 7 ] ;
// Watermerk aanmaken en tekst toevoegen
$rWatermerk = imagecreatetruecolor( $iWidth , $iHeight ) ;
$iAchtergrond = imagecolorallocate( $rWatermerk , 255 , 255 , 255 ) ;
$iText = imagecolorallocate( $rWatermerk , 100 , 100 , 100 ) ;
imagefill( $rWatermerk , 0 , 0 , $iAchtergrond ) ;
imagettftext( $rWatermerk , 16 , 0 , 16 , 17 , $iText , $sFont , $sString ) ;
// Einde aanmaken watermerk
//thumb met de nieuwe dimensies
$img_n = imagecreatetruecolor ( $width , $doelhoogte ) ;
imagecopyresampled( $img_n , $img , 0 , 0 , 0 , 0 , $width , $doelhoogte , imagesx( $img ) , imagesy( $img ) ) ;
// Watermerk naar afbeelding kopiëren
imagecopymerge( $img_n , $rWatermerk , $width - $iWidth , 5 , 0 , 0 , $iWidth , $iHeight , 20 ) ;
if ( $type == 'gif' ) {
imagegif( $img_n , $dest ) ;
}
elseif ( $type == 'jpg' ) {
imagejpeg( $img_n , $dest ) ;
}
elseif ( $type == 'png' ) {
imagepng( $img_n , $dest ) ;
}
elseif ( $type == 'bmp' ) {
imagewbmp( $img_n , $dest ) ;
}
Return true ;
}
Alvast bedankt!
2 antwoorden
Gesponsorde links
marten - 12/09/2009 09:31
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:
$img_n=imagecreatetruecolor ($width, $doelhoogte);
//wordt dan
$img_n = imagecreatetruecolor ($width, $doelhoogte);
$img_n = imagecreatetruecolor ( $width , $doelhoogte ) ;
//wordt dan
$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:
$ar = explode('.', $filename);
$ext = strtolower(array_pop($ar));
switch ($ext) {
case "gif":
$img = imagecreatefromgif($filename);
$type_r = 'gif';
case "jpg":
case "jpe":
case "jpeg":
$img = imagecreatefromjpeg($filename);
$type_r = 'jpg';
case "png":
$img = imagecreatefrompng($filename);
$type_r = 'png';
case "bmp":
$img = imagecreatefromwbmp($filename);
$type_r = 'bmp';
break;
default:
return 'Cannot open file';
break;
}
/** Onderstaande eruit gehaald omdat het handiger kan zie boven
if (@imagecreatefromgif($filename)) {
$img = imagecreatefromgif($filename);
$type_r = 'gif';
} elseif (@imagecreatefromjpeg($filename)) {
$img = imagecreatefromjpeg($filename);
$type_r = 'jpg';
} elseif (@imagecreatefrompng($filename)) {
$img = imagecreatefrompng($filename);
$type_r = 'png';
} elseif (@imagecreatefromwbmp($filename)) {
$img = imagecreatefromwbmp($filename);
$type_r = 'bmp';
} else {
return 'Cannot open file';
}
*/
switch ( $ext ) {
case "gif" :
$img = imagecreatefromgif( $filename ) ;
$type_r = 'gif' ;
case "jpg" :
case "jpe" :
case "jpeg" :
$img = imagecreatefromjpeg( $filename ) ;
$type_r = 'jpg' ;
case "png" :
$img = imagecreatefrompng( $filename ) ;
$type_r = 'png' ;
case "bmp" :
$img = imagecreatefromwbmp( $filename ) ;
$type_r = 'bmp' ;
break ;
default :
return 'Cannot open file' ;
break ;
}
/** Onderstaande eruit gehaald omdat het handiger kan zie boven
if (@imagecreatefromgif($filename)) {
$img = imagecreatefromgif($filename);
$type_r = 'gif';
} elseif (@imagecreatefromjpeg($filename)) {
$img = imagecreatefromjpeg($filename);
$type_r = 'jpg';
} elseif (@imagecreatefrompng($filename)) {
$img = imagecreatefrompng($filename);
$type_r = 'png';
} elseif (@imagecreatefromwbmp($filename)) {
$img = imagecreatefromwbmp($filename);
$type_r = 'bmp';
} else {
return 'Cannot open file';
}
*/
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.
public function addWaterMark($source, $dst) {
$source_stamp = 'watermark.png';
$src = imagecreatefromjpeg ( $source );
//Of andere types natuurlijk
$stamp = imagecreatefrompng ( $source_stamp );
// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$sx = imagesx ( $stamp );
$sy = imagesy ( $stamp );
imagealphablending ( $stamp, true );
imagecopy ( $src, $stamp, imagesx ( $src ) - $sx - $marge_right, imagesy ( $src ) - $sy - $marge_bottom, 0, 0, imagesx ( $stamp ), imagesy ( $stamp ) );
imagejpeg ( $src, $dst, 100 );
imagedestroy ( $src );
}
public function addWaterMark( $source , $dst ) {
$source_stamp = 'watermark.png' ;
$src = imagecreatefromjpeg ( $source ) ;
//Of andere types natuurlijk
$stamp = imagecreatefrompng ( $source_stamp ) ;
// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10 ;
$marge_bottom = 10 ;
$sx = imagesx ( $stamp ) ;
$sy = imagesy ( $stamp ) ;
imagealphablending ( $stamp , true ) ;
imagecopy ( $src , $stamp , imagesx ( $src ) - $sx - $marge_right , imagesy ( $src ) - $sy - $marge_bottom , 0 , 0 , imagesx ( $stamp ) , imagesy ( $stamp ) ) ;
imagejpeg ( $src , $dst , 100 ) ;
imagedestroy ( $src ) ;
}
Maak twee aparte functies voor resizen en watermerk plaatsen
$Std->resize('filename1.jpg', 'destination1.jpg', 500);
$Std->addWaterMark('destination1.jpg', 'destination1.jpg');
$Std -> resize ( 'filename1.jpg' , 'destination1.jpg' , 500 ) ;
$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.
qubus - 12/09/2009 20:33
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 .