Sven Rautenberg: noch immer Problem mit "imagecopyresized"-Funktion

Beitrag lesen

Moin!

ich möchte ein Bild, welches beispielsweise eine Grösse von 640 x 480 Pixel hat, auf eine Grösse von beispielsweise 200 x 200 Pixel bringen ohne das Seitenverhältnis zu verfäschen. Dazu hab ich jetzt folgenden Code geschrieben:

Geh mal theoretisch deinen Code durch:

$width = 640;
$height = 480;

if ($width < $height)

-> nö...

{
}
else
{
      $newwidth = 200;
      $newheight = 200;

Bis hierhin ist es schön. Du bist in Falldefinition "Bild ist breiter als hoch".

$faktor = 200 / $height;

Wozu dieser Faktor?

$zh = round($width * $faktor);

Ähm... ?

$tocut = round(($zh - $newwidth) / 2);

Ok, du rechnest also irgendwie wild herum. Warum?

Laut meinen Tipps aus [pref:t=47556&m=259466] solltest du lediglich berechnen, welche Startkoordinate du benötigst.

Also in diesem Fall (breiter als hoch):

$start = ($width - $height) /2;

Und dann kopierst du ein $height*height großes Bild, was bei $start,0 beginnt, nach 0,0,$newwidth,$newheight.

Bedenke: Du willst einen Bildausschnitt haben, der quadratisch ist, also genauso breit wie hoch. Wenn das Bild breiter ist, nimmst du als Maßangabe die Höhe...

imagecopyresized($im,$src,0,0,$tocut,0,$newwidth,$newheight,$width,$height);

Nur nimmst du _hier_ als Maßangabe für die Breite die _Breite_, und nicht die Höhe. Deshalb verzerrt es.

imagecopyresized($im,$src,0,0,$start,0,$newwidth,$newheight,$height,$height);

sollte genau das tun, was du willst.

Im anderen Fall kommt als Maß dann logischerweise zweimal $width vor.

}

- Sven Rautenberg

--
ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|