Zur Navigation

Bilder beschneiden per PHP

1 AndiN

Ich habe folgende Ausgangsposition:

Ich möchte JPG-Bilder per PHP hochladen.
Die Bilder haben alle ein Format von Höhe 330px und Breite max. 496px.
Aus diesen Bildern möchte ich Thumbnails erstellen mit 110x110px jedoch ohne die Bilder zu verzerren.


$bildpos = $_REQUEST['bildpos'];
$bildname = $_FILES['bild']['name'];
$bildtyp = $_FILES['bild']['type'];
$tmpbild = $_FILES['bild']['tmp_name'];
	
$bildinfo = GetImageSize($tmpbild);
$breite1 = $bildinfo[0]*110/$bildinfo[1]; // Test wie breit das Originalbild bei 110px Höhe wird
$hoehe1 = $bildinfo[1]*110/$bildinfo[0]; // Test wie hoch das Originalbild bei 110px Höhe wird

if($breite1 > 110)
{
	$xpos = ($breite1-110)/2; // wenn Bild breiter als 110px ist, um wie viel breiter?
	$ypos = 0;
}
elseif($hoehe1 > 110)
{
	$xpos = 0;
	$ypos = ($hoehe1-110)/2; // wenn Bild hoher als 110px ist, um wie viel breiter?
}

$neuesBild = imagecreatetruecolor(110,110); //Leer-Bild mit 110x100px generieren
$dest = $_SERVER['DOCUMENT_ROOT']."/thumbnail.jpg";
$altesBild = imagecreatefromjpeg($dest);
imagecopyresampled($neuesBild,$altesBild,0,0,$xpos,$ypos,110,110,$bildinfo[0],$bildinfo[1]); //ich vermute mal, dass ich genau hier irgendwas falsch mache
imagejpeg($neuesBild,$dest,100);
clearstatcache();
imagedestroy($altesBild);
?>

Ich bekomme nun ein Thumbnail im Format 110x110px.
Allerdings "überdeckt" das neue Bild das schwarze "Leer-Bild" nicht komplett sondern ich habe bei einem Ausgangsbild von 496x330px rechts einen ca. 5 px breiten schwarzen Rand.
Bei einem Bild welches schmaler als 496px ist, ist der Rand rechts und unten vorhanden.

Hat mir da jemand einen Tipp?

27.03.2012 11:15 | geändert: 27.03.2012 11:15

2 Jörg

Zitat von PHP Manual
bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

[...]

In other words, imagecopyresampled() will take an rectangular area from src_image of width src_w and height src_h at position (src_x,src_y) and place it in a rectangular area of dst_image of width dst_w and height dst_h at position (dst_x,dst_y).

Wenn die Koordinate src_x verschoben ist, aber src_w gleich bleibt, reicht das "rectangular area" über das Originalbild hinaus, und dadurch entsteht möglicherweise der schwarze Streifen

Was passiert, wenn du für $src_w und $src_h auch 110 übergibst?

27.03.2012 12:00 | geändert: 27.03.2012 12:01

3 AndiN

Wenn ich beide Variablen auf 110px setze nimmt er einen Ausschnitt mit 110x110px des Originalbildes ausgehend vond er Ecke links oben.

Mein Ziel ist es jedoch...

a) bei querformatigen Fotos (496 x 330px) das Bild erst auf 110px Höhe runter zu rechnen und sollte es dann breiter als 110px sein den Überhang zu gleichen Teilen rechts und links abzuschneiden.

b) bei hochformatigen Fotos (Breite kleiner als 496px x 330px) das Bild erst auf 110px Breite runter zu rechnen und sollte es dann höher als 110px sein den Überhang zu gleichen Teilen oben und unten abzuschneiden.

27.03.2012 12:37

4 Jörg

Ich würde das so probieren (ungetestet):

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;
}

(die Variablen sind hier entsprechend der Benennungen der Funktionsargumente im PHP-Manual benannt)

Der Ausschnitt sollte danach zentriert und quadratisch sein, das Skalieren übernimmt dann imagecopyresampled()

27.03.2012 13:05

5 AndiN

Funktioniert perfekt... Danke ! :)

27.03.2012 15:14

Beitrag schreiben (als Gast)





[BBCode-Hilfe]