Bildgrösse wird falsch berechnet

Dr Dau

ich wisch hier durch
Hallo!

Ich möchte dass Bilder die evtl. zu gross sind verkleinert angezeigt werden, damit es mir nicht das Seitenlayout zerhaut.
Dazu habe ich eine maximale Grösse von 500px angegeben, dieses Mass soll aber veränderbar sein.
Bisher hatte ich mich nur auf die Breite beschränkt, was auch wunderbar klappte.
Nun wollte ich aber auch die Höhe berücksichtigen.
Dazu habe ich 4 Testbilder mit folgender Grösse (Breite x Höhe):
Bild1=480x640
Bild2=600x450
Bild3=480x262
Bild4=525x700

Bild1 wird mit500x667 angezeigt.
Bild2 wird mit 667x500 angezeigt.
Bild3 wird korrekt mit 480x262 dargestellt da es unter den 500px liegt.
Bild4 wird mit 375x667 dargestellt.

Berechnen bzw. anzeigen lasse ich es mir mit folgendem Code (auf das Wesentliche gekürzt):
PHP:
$max_image_size = 500; // max. Breite/Höhe
$image_size = GetImageSize($this->getValueOf('ImageDir').$imgs[$image]); // Bildinformationen werden ausgelesen
$image_width = $image_size[0] > $max_image_size?round($max_image_size * ($image_size[0] / $image_size[1])):""; // Breite wird neu berechnet wenn über 500px
$image_height = $image_size[1] > $max_image_size?round($max_image_size * ($image_size[1] / $image_size[0])):""; // Höhe wird neu berechnet wenn über 500px
 
// Bildausgabe mit if/else 
$out .= (($image_size[0] > $max_image_size) OR ($image_size[1] > $max_image_size))?"<img src=\"".$this->getValueOf('ImageDir').$imgs[$image]."\" border=\"0\" width=\"".$image_width."\" height=\"".$image_height."\" alt=\"\" />":"<img src=\"".$this->getValueOf('ImageDir').$imgs[$image]."\" border=\"0\" width=\"".$image_size[0]."\" height=\"".$image_size[1]."\" alt=\"\" />";
Ich weiss dass es verkehrt ist, aber ich stehe irgendwie auf dem Schlauch. :confused:

Gruss Dr Dau
 
Hi Doc,

probier mal sowas:
PHP:
$maxsize=500;
list($width,$height)=getimagesize($imagefile);
$newwidth=$width;
$newheight=$height;
if ($newwidth>$maxsize)
 {
  $newwidth=round($maxsize*($newwidth/$newheight));
 }
if ($newheight>$maxsize)
 {
  $newheight=round($maxsize*($newheight/$newwidth));
 }
$newwidth und $newheight sollten jetzt beide <= $maxsize sein aber dennoch die Relationen des Originals beibehalten.
 
Hmm, nun gibt er folgendes aus:
Bild1=480x667
Bild2=667x450
Bild3=480x262
Bild4=375x933

Also eher schlimmer als vorher. :(

[edit]
Ich denke mal eher dass das Problem nicht bei der Berechnung an sich liegt, sondern an der Ausgabe.
Ich bin grade mal auf einem Blatt Papier zugange.... und dass im Computer Zeitalter. :suspekt:
[/eidt]
 
Zuletzt bearbeitet:
Du musst zuerst die größere Seite abfangen, dann prüfen ob diese überhaupt über 500px liegt (wenn du nicht vergrößern willst).
Dann Originalgröße durch MaxGröße teilen, Gegenseite durch dasgleiche Verhältnis verringern.
Dann kann es dir egal sein, ob die Breite oder die Höhe oder beides über 500px liegt.
Bedenke aber auch den =-Fall, also Breite und Höhe gleiche Pixel
 
Hmm, sind die Berechnungen wohl nicht so toll.
Moeglicherweise wuerde eine Funktion helfen die immer wieder aufgerufen wird bis das Bild klein genug ist.
 
@Jörg, vergrössen will ich nicht, darum wird bei unterschreitung der max. Grösse ja auch die original Grösse genommen.
Das Problem ist allerdings dass beide Grössen neu berechnet werden.... dadurch ist wird die max. Grösse wieder überschritten.
Ich darf allso nur die kleinere Seite neu berechnen.... und für die zu lange Seite muss ich die max. Grösse nehmen, ohne neu zu berechnen.

Klingt verwirrend..... ist es aber auch. :eek:
Wird also doch etwas aufwendiger als ich erhofft hatte.
 
Ich hatte es so verstanden, daß du verkleinern willst, wenn die Max-Größe überschritten wird.

Wenn dem so ist, dann kannst du ja in der Prüfung das abfangen, if($x>=$maxsize) tu dies, usw.
 
@Jörg, ja, aber auch nur wenn die max. Grösse überschritten wird.... andernfalls soll die original Grösse genommen werden.
Das $x hat jetzt aber keine besondere Bedeutung?
Ich bin grade dabei mit if-Anweisungen, nur müssen die ja auch verschachtelt werden, da wird es bei mir hapern.
Ich stelle es mir Grade so ungefähr vor:
PHP:
if($breite > 500) {
if($breite > $höhe) {
	$neue_breite = 500 * ($breite / $höhe);
	$out = '<img...... width='.$neue_breite.' height=500>';
if($höhe > $breite) {
	$neue_höhe = 500 * ($höhe / $breite);
	$out = '<img...... width=500 height='.$neue_breite.' >';
.... usw.
Ob es so klappt oder überhaupt richtig ist, weiss ich nicht.
 
Ach es geht ja nur um die Darstellung im <img>-Tag.
Das ist einfach, da dieser auch Prozent unterstützt!

PHP:
$maxsize=500;
$groesse=getimagesize($imagefile);
    $breite = $groesse[0];
    $hoehe = $grosse[1];

if($breite > $maxsize)
    $p_breite = round(100 / $breite * $maxsize,0);
if($hoehe > $maxsize)
    $p_hoehe = round(100 / $hoehe * $maxsize,0);

$out = '<img...... width="'.$p_breite.'%" height="'.$p_hoehe.'%">';
 
Zuletzt bearbeitet:
Ich seh gerade, das ist nur halb richtig.

Die einzelnen Fälle musst du noch abfangen, aber das dürfte jetzt ja kein Problem mehr sein.
 
Zurück