Dynamisches generieren von Bildern + Wasserzeichen

Guten Tag zusammen,
ich hab folgendes gecodet:

PHP:
<?php
header('Content-type: image/jpeg');
require('../conf/functions.inc');

/**
 * Gallerieordner
 */ 
$dir = '../images/gallery/';

/**
 * Pfad zum Wasserzeichen
 */ 
$watermark = '../images/gallery/watermark.png';

 /**
 * Skalierungsfaktor
 */ 
$ScaleFactor = xyz;

/**
 * Dateinamenerweiterung rausfinden
 */ 
 
function getExt($str)
{
	return strtolower(substr($str, strrpos($str, '.') + 1, 3));
}

// Sonderzeichen alá Leerzeichen am Anfang und Ende der übergebenen Variablen löschen
$reqDir = trim($_REQUEST['dir']);
$reqImg = trim($_REQUEST['img']);

// Prüfen, ob Datei existiert und dann Imageresourcen erstellen
if(file_exists($dir . $reqDir . '/' . $reqImg))
{
	switch(getExt($reqImg))
	{
		case 'gif':
			$imgSrc = imagecreatefromgif($dir . $reqDir . '/' . $reqImg);
			break;
		case 'jpg':
			$imgSrc = imagecreatefromjpeg($dir . $reqDir . '/' . $reqImg);
  		break;
  	case 'png':
  		$imgSrc = imagecreatefrompng($dir . $reqDir . '/' . $reqImg);
   		break;
   	default:
   		trigger_error('Bildformat wird nicht unterstützt', E_USER_WARNING);
   		break;
	}
}
// Verfahre mit Wasserzeichen ebenso
if(file_exists($watermark) && is_readable($watermark))
{
	switch(getExt($watermark))
	{
		case 'jpg':
			$imgWm = imagecreatefromjpeg($watermark);
  		break;
  	case 'png':
  		$imgWm = imagecreatefrompng($watermark);
   		break;
   	default:
   		trigger_error('Bildformat wird nicht unterstützt', E_USER_WARNING);
   		break;
	}
}
// Breite und Höhe der Bilder ermitteln
$imgSrcWidth 	= imagesx($imgSrc);
$imgSrcHeight 	= imagesy($imgSrc);
$imgWmWidth 	= imagesx($imgWm);
$imgWmHeight 	= imagesy($imgWm);

// Skalierung
$scaledwidth	= $imgSrcWidth;			
$scaledheight	= $imgSrcHeight;

// Neues Bild erstellen
$img = imagecreatetruecolor($scaledwidth, $scaledheight);

// Bild in das Neuerstellte einfügen
imagecopy($img, $imgSrc, 0, 0, 0, 0, $scaledwidth, $scaledheight);

// Wasserzeichen einfügen
imagecopy($img, $imgWm, $scaledwidth - $imgWmWidth, $scaledheight - $imgWmHeight, 0, 0, $imgWmWidth, $imgWmHeight);

imagejpeg($img); // JPEG erstellen
imagedestroy($img); // JPEG löschen
?>

Jedoch möchte ich noch eine Skalierung einbauen, ich bekomme es aber überhaupt nicht hin. Wäre nett wenn mir einer da helfen könnte.

Über Tipps, hinsichtlich Performance o.Ä. würde ich mich auch freuen
 
Ich versteh das Problem nicht ganz. Oder hilft dir imagecopyresized/imagecopyresampled?
 
Ich habe es selber auch nur mit rumtesten benutzt, was ich hier schreibe ist NICHT GETESTET UND ALLE ANGABEN SIND OHNE GEWÄHR!
PHP:
int imagecopyresized ( resource $dst_im , resource $src_im , int $dstX , int $dstY , int $srcX , int $srcY , int $dstW , int $dstH , int $srcW , int $srcH )
$dst_im = Das mit imageCreate erzeugte leere Bild
$src_im = Die Bildquelle (mit imagecreatefrompng erstellt)
$dstX/$dstY = Position im Zielbild
$srcX/$srcY = Obere Ecke des Ausschnitts von einzufügenden Bild
$dstW/$dstH = Größe des einzufügenden Bilds im Zielbilds
$srcW/$srcH = Größe des Ausschnitts von einzufügenden Bild
 
ich hab mal in meinen alten Scripten gewühlt und noch bissl durchkommentiert...

PHP:
<?

//Oh man, auf was fuer Ideen ich alles kam, als ich noch keine regulären Ausdrücke beherrscht hab... :-)
function filename_base($file)
{
	//	Gibt den Dateinamen ohne Dateiendung zurueck
  $f=explode(".",$file);
  $ret="";
  for($i=0;$i<(sizeof($f)-1);$i++)
  {
    if($ret!=""){$ret.=".";}
    $ret.=$f[$i];
  }
return $ret;
}

//noch ein Exemplar von "Oh man, auf was fuer Ideen ich alles kam, als ich noch keine regulären Ausdrücke beherrscht hab..." :-)
function filename_ext($file)
{
	//	Gibt die Dateiendung einer Datei zurueck
  $f=explode(".",$file);
  return $f[sizeof($f)-1];
}


//Bildverkleinerungsfunktion
function thumb($file, $save, $width, $height, $prop = TRUE)
{
    $ret=true;
    // Requires GD-Lib > 2.0
    // Ist $prop=TRUE, so werden die Proportionen des Bildes
    // auch in der verkleinerten Version eingehalten
    @unlink($save);
    $infos = @getimagesize($file);
    if($prop)
    {
        // Proportionen erhalten
        $iWidth = $infos[0];
        $iHeight = $infos[1];
        $iRatioW = $width / $iWidth;
        $iRatioH = $height / $iHeight;
        if ($iRatioW < $iRatioH)
        {
        	$iNewW = $iWidth * $iRatioW;
        	$iNewH = $iHeight * $iRatioW;
        }
	else
	{
	        $iNewW = $iWidth * $iRatioH;
 	       $iNewH = $iHeight * $iRatioH;
        }
    }
    else
    {
        // Strecken und Stauchen auf Größe
        $iNewW = $width;
        $iNewH = $height;
    }


    if($infos[2] == 2)
    {
        // Bild ist vom Typ jpg
        $imgA = imagecreatefromjpeg($file);
        $imgB = imagecreatetruecolor($iNewW,$iNewH);

        imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewW,
                           $iNewH, $infos[0], $infos[1]);

	//Ziel-Format anhand der Dateinamen-Erweiterung
        if(strtolower(filename_ext($save))=="jpg"){imagejpeg($imgB, $save);}
        elseif(strtolower(filename_ext($save))=="jpeg"){imagejpeg($imgB, $save);}
        elseif(strtolower(filename_ext($save))=="png"){imagepng($imgB, $save);}

        imagedestroy($imgA);
        imagedestroy($imgB);

    }
    elseif($infos[2] == 3)
    {
        // Bild ist vom Typ png
        $imgA = imagecreatefrompng($file);
        $imgB = imagecreatetruecolor($iNewW, $iNewH);
        imagecopyresampled($imgB, $imgA, 0, 0, 0, 0, $iNewW,
                           $iNewH, $infos[0], $infos[1]);

	//Ziel-Format anhand der Dateinamen-Erweiterung
        if(strtolower(filename_ext($save))=="jpg"){imagejpeg($imgB, $save);}
        elseif(strtolower(filename_ext($save))=="jpeg"){imagejpeg($imgB, $save);}
        elseif(strtolower(filename_ext($save))=="png"){imagepng($imgB, $save);}

        imagedestroy($imgA);
        imagedestroy($imgB);

    }
    else
    {
        $ret=false;
    }
    
return $ret;
}



//ANWENDUNG:
//=========================================================================
//da die Funktion thumb() bei zu starken Verkleinerungen (z.B. von 5 Megapixel auf 120x80px Thumbnail) irgendwo Mist baut (Division durch 0), hier ein kleiner WorkAround:

$bild="foo_bar.jpg";
$max=800; (groessere Seite des Bildes soll 800px groß sein)

$infos = @getimagesize($bild);
//prüfen, ob eine der beiden Seiten groesser als das gewuenschte Maximum ist
if($infos[1]>$max OR $infos[0]>$max)
{
	//den groesseren der beiden Dimensions-Werte zur Berechnung nutzen
	if($infos[1]>$infos[0]){$wert=$infos[1];}
	else{$wert=$infos[0];}

	$i=0; //fuer Sicherungskopie - um festzustellen, ob die Schleife zum ersten Mal durchlaeuft
	//LANGSAMES RUNTER-SCHRUMPFEN
	do
	{
		//ich hab die Bilder immer nur um den Faktor 1.8 kleiner gemacht... man kann auch mehr mit einmal probieren... bei zu starker Verkleinerung verursacht die thumb()-Funktion jedoch eine Division durch Null
		$wert=$wert/1.8;

		//Wert, auf den skaliert werden soll - wenn der Wert durch Berechnung kleiner wird, als der Zielwert, dann setze ihn auf den Ziel-Wert 
		if($wert<$max){$wert=$max;}

		$orig=$bild;
		$orig2=filename_base($bild)."_orig.".filename_ext($bild);
		$cp=filename_base($bild)."_neu.".filename_ext($bild);
		if($i++==0){copy($orig,$orig2);} //beim ersten Durchlauf eine Kopie erstellen
		else
		{
		  if(file_exists($orig2)){unlink($orig2);}
		  copy($cp,$orig2);
		}
		thumb($orig2,$cp,$max,$max);
		unlink($orig2);
	}
	while($wert>$max);
}

?>
 
Zurück
Oben