noch immer Problem mit "imagecopyresized"-Funktion
Koontz
- php
Hi,
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:
if ($width < $height)
{
$newwidth = 200;
$newheight = 200;
$faktor = 200 / $width;
$zh = round($height * $faktor);
$tocut = round(($zh - $newheight) / 2);
imagecopyresized($im,$src,0,0,0,$tocut,$newwidth,$newheight,$width,$height);
}
else
{
$newwidth = 200;
$newheight = 200;
$faktor = 200 / $height;
$zh = round($width * $faktor);
$tocut = round(($zh - $newwidth) / 2);
imagecopyresized($im,$src,0,0,$tocut,0,$newwidth,$newheight,$width,$height);
}
Die Variable $tocut enthält die Starkoordinate, falls Pixel vom Bild abgeschnitten werden müssen um das Seitenverhältnis zu behalten. Jedenfalls scheint irgendetwas mit den Parametern der "imágecopyresized"-Funktion nicht zu stimmen. Wenn ich ein Bild konvertiere, wird es zusammengequescht und nur von der oberen bzw. rechten Seite etwas abgeschnitten. Es soll jedoch von beiden Seiten gleichviel abgeschnitten werden. Falls noch irgendwas unklar ist, hier nochmal ein etwas ausführlicher Thread von gestern zu meinem Problem:
http://forum.de.selfhtml.org/?t=47556&m=259466
Wäre super, wenn Ihr mir helfen könntet.
Gruss,
Koontz
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