Zur Navigation

Bildmittelpunktberechnung bei rechteckigen Bildern

1 AndiN

Hallo Jörg,
ich habe folgendes Script:

$array_bildordner = array("110","226");
$array_bildgroessen = array("110","226");
$timestamp = time();
for($i=0;$i<count($array_bildgroessen);$i++)
{
	$bild_ohne_dateiendung = substr($bild,0,-4);
	$bildinfo = GetImageSize($tmpbild);

	if($bildinfo[0] > $bildinfo[1])
	{
		$src_w = $src_h = $bildinfo[1];
		$src_x = ($bildinfo[0]-$bildinfo[1])/2;
		$src_y = 0;
	}
	else
	{
		$src_w = $src_h = $bildinfo[0];
		$src_x = 0;
		$src_y = ($bildinfo[1]-$bildinfo[0])/2;
	}

	if($bildordner == "110")
		$neuesBild=imagecreatetruecolor($array_bildgroessen[$i],$array_bildgroessen[$i]);
	else
		$neuesBild=imagecreatetruecolor($array_bildgroessen[$i],150);
	$dest1 = $bild_ohne_dateiendung."-".$timestamp.".jpg";
	$dest = $_SERVER['DOCUMENT_ROOT']."".$unterverzeichnis."grafiken/img/".$array_bildordner[$i]."/".$dest1;
	copy($tmpbild,$dest);
	$altesBild=imagecreatefromjpeg($dest);
	if($bildordner == "110")
		imagecopyresampled($neuesBild,$altesBild,0,0,$src_x,$src_y,$array_bildgroessen[$i],$array_bildgroessen[$i],$src_w,$src_h);
	else
		imagecopyresampled($neuesBild,$altesBild,0,0,$src_x,$src_y,$array_bildgroessen[$i],150,$src_w,$src_h);
}

Wenn $bilderordner == 110 wird ein quadratisches Bild erzeugt (110px auf 100px) ausgehend vom Bildmittelpunkt. Das funktioniert super.

Wenn $bilderordner == 226 soll ein qrechtexkiges Bild erzeugt werden (226px auf 150px) ausgehend vom Bildmittelpunkt. Das funktioniert leider noch nicht. Das Bild wird verzerrt. Das kommt vermutlich daher weil ich bei der Neugenerierung 150 fix eintrage, aber leider den nötigen Parameter in der vorherigen Bildmittelpunktbestimmung nicht finde den ich ändern muss. Wäre toll, wenn du mir da einen Tipp hättest.

17.05.2013 12:09 | geändert: 17.05.2013 12:09

2 Jörg

Diese Berechnungen gehen von einem quadratischen Bildausschnitt aus:

	if($bildinfo[0] > $bildinfo[1])
	{
		$src_w = $src_h = $bildinfo[1];
		$src_x = ($bildinfo[0]-$bildinfo[1])/2;
		$src_y = 0;
	}
	else
	{
		$src_w = $src_h = $bildinfo[0];
		$src_x = 0;
		$src_y = ($bildinfo[1]-$bildinfo[0])/2;
	}

Wenn die Breite eineinhalb mal so lang sein soll wie die Höhe, würde ich eher in etwa so vorgehen (ungetestet):

    if((1.5 * $bildinfo[0]) > $bildinfo[1])
    {   
        $src_h = $bildinfo[1];
        $src_w = 1.5 * $bildinfo[1];
        $src_x = ((1.5 * $bildinfo[0])-$bildinfo[1])/2;
        $src_y = 0;
    }
    else
    {   
        /* analog wie oben */
    }

Zum Debuggen würde ich mir die Werte für $src_h, $src_w etc. mal mit echo ausgeben lassen, und schauen, ob diese sinnvoll sind

17.05.2013 13:58

Beitrag schreiben (als Gast)





[BBCode-Hilfe]