Rolf B: 16zu9 rausschneiden und Bild verkleinern

Beitrag lesen

Hallo michi,

wenn das Bild 3200x900 ist, was willst Du dann verkleinern? Wenn dein Zielformat 1600x900 ist, müsstest Du bei Verkleinerung schwarze Balken ansetzen. Ein Ausgangsformat von 3200x1400 wäre vermutlich ein besseres Beispiel.

Wenn Du skalieren + ausschneiden willst, dann musst Du erstmal berechnen, wie groß das größte Rechteck im Seitenverhältnis 16/9 ist, das in dein Ausgangsbild hineinpasst, dieses Rechteck in der Quelle zentrieren und das als Ausgangsposition für imagecopyresize (oder imagecopyresample) verwenden.

Ich würde dafür erstmal das Seitenverhältnis $sourceAspect der Quelle bestimmen, und die Infos zum $targetAspect für die Lesbarkeit auch in eine Variable legen. Wenn Du den Kram in eine Funktion auslagerst, kannst Du $targetWidth und $targetHeight als Parameter übergeben. Reusability!

$targetWidth = 1600;
$targetHeight = 900;
$targetAspect = $targetWidth / $targetHeight;
$sourceAspect = $PictureInfo[0] / $PictureInfo[1];

Wenn $sourceAspect kleiner ist als 16/9, ist das Bild "zu hoch", d.h. Du musst oben/unten was abschneiden. Ist es größer, ist es "zu breit" und Du musst oben seitlich [EDIT Der Martin] abschneiden. Den Fall "ist gleich" kannst Du einem dieser beiden Zweige zuordnen. D.h. je nach $sourceAspect übernimmst Du eine Bildkante und berechnest die Länge der anderen Kante an Hand des Ziel-Seitenverhältnisses.

if ($sourceAspect <= $targetAspect) {
   // Bild ist "zu schmal" (bzw. "zu hoch")
   // Ausschnittsgröße an der Breite der Quelle orientieren
   $clipWidth = $PictureInfo[0];       
   $clipHeight = $PictureInfo[0] / $targetAspect;
}
else
{
   // Bild ist "zu breit" (bzw. "zu niedrig")
   // Ausschnittsgröße an der Höhe der Quelle orientieren
   $clipWidth = $PictureInfo[1] * $targetAspect;
   $clipHeight = $PictureInfo[1];
}

$clipX = ($PictureInfo[0] - $clipWidth) / 2;
$clipY = ($PictureInfo[0] - $clipHeight) / 2;

Und damit hast Du die vier Input-parameter für imagecopyresize, die Du für die Lage der Quelle brauchst. Diese Logik dürfte übrigens auch für Bilder funktionieren, die kleiner als 1600x900 sind und hochskaliert werden müssen.

Das ist ungetestet - keine Garantie 😉

Rolf

--
sumpsi - posui - obstruxi