Bildbreite variable bei fester höhe?

hanspeter123

Mitglied
Hallo Leute,

ich habe hier ein Script, (Gastgeberverzeichnis) bei dem sich jeder Vermieter einloggen kann, und dort seine Bilder hochladen kann (halt von seiner ferienwohnung).

Nun habe ich aber das Problem, das ich zwar im Adminbereich ein festes Pixel verhältnis angeben kann, was die höhe und auch die Breite betrifft, zb 117px Breite und 70 px hoch, bei Querformatbildern ist das auch schön, wenn jetzt aber jemand ein Hochformatbild lädt, dann wird das bild gestreckt.

Und jetzt weis ich nicht wie ich die berechnung der Bilder machen kann, damit die höhe immer zb. 70px bleibt, und nur die breite variabel ist.

Hier erstmal das Script:
Code:
  //-------------class img-----------------
   
  function addimg($id_site)
  {
   
   
  
$db  =& JFactory::getDBO();
   $query = "SELECT  wimg, vwimg, vhimg, max_img FROM #__lbresa_config";  $db->setQuery( $query );  $confimg = $db->loadObject();
   
  $datepic = date('Ymdhis');
  $name = $id_site."_".$datepic;
   
        $wimg= $confimg->wimg;
        $vwimg= $confimg->vwimg;
        $vhimg= $confimg->vhimg;
        
        $max_img= $confimg->max_img;
   
   
  $dir = 'components/com_joomloc/images'; $dir_temp = 'components/com_joomloc/images/temp'; 
   
  $ratio = $wimg;
   
   
   
   
   
      if (isset($_FILES['file']))  
      {
          if ($_FILES['file']['error'] == UPLOAD_ERR_OK) 
          {
             
        $tableau = @getimagesize($_FILES['file']['tmp_name']); 
        if ($tableau == FALSE) { 
           
           unlink($_FILES['file']['tmp_name']); 
           $erreur = "<h1>".JText::_( 'Votre fichier n est pas une image.' )."</h1>"; 
               echo "$erreur";
        } 
        else { 
                
          
          
           if ($tableau[2] == 1 || $tableau[2] == 2 || $tableau[2] == 3) { 
              
              $file_upload = 'site_'.$id_site."_img_".$name.".jpg";
                    
                    copy ($_FILES['file']['tmp_name'], $dir_temp.'/'.$file_upload); 
                    
   
    $query = "INSERT INTO #__lbresa_img(id, id_site, img) values('', '$id_site', '$file_upload')";
    $db->setQuery( $query );
     $db->query();
   
   // si notre image est de type jpeg --------------------------------------------------------------
   
              if ($tableau[2] == 2) { 
                 // on crée une image à partir de notre grande image à l'aide de la librairie GD 
                 $src = imagecreatefromjpeg($dir_temp.'/'.$file_upload); 
              
                      if($tableau[0]<=$ratio and $tableau[1]<=$ratio)
                      {
                      copy ($_FILES['file']['tmp_name'], $dir.'/'.$file_upload); 
                       $src = imagecreatefromjpeg($dir.'/'.$file_upload);
                      }
                      else
                      {
                 // on teste si notre image est de type paysage ou portrait 
                 if ($tableau[0] > $tableau[1]) { 
                    $im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio); 
                    imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]); 
                 } 
                 else { 
                    $im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1])); 
                    imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]); 
                 } 
                 // on copie notre fichier généré dans le répertoire des miniatures 
                 imagejpeg ($im, $dir.'/'.$file_upload); 
                       }
                       
                        $imv = imagecreatetruecolor($vwimg, $vhimg); 
                    imagecopyresampled($imv, $src, 0, 0, 0, 0, $vwimg, $vhimg, $tableau[0], $tableau[1]); 
                       imagejpeg ($imv, $dir.'/vignettes/'.$file_upload);
                       unlink($dir_temp.'/'.$file_upload); 
                      }
       
  //----------

Kann mir denn dazu jemand einen Tipp geben? Ich weis einfach nicht weiter...?!

Habe meine Frage auch schonmal hier gestellt, mit der Hoffnung eine Lösung zu erhalten.

http://www.php-resource.de/forum/ph...ite-variable-bei-fester-hoehe.html#post653076
 
Die gewünschte Bildhöhe (z.B. 70 Pixel) geteilt durch die tatsächline Bildhöhe ergibt den Faktor.

Die tatsächliche Bildhöhe mit dem Faktor multiplizieren ergibt die gewünschte Bildhöhe.

Diese Werte trägst du dann mit echo beim Bild ein.
 
Danke, nur weis ich nicht wie ich das Script modifizieren muss, bin ein PHP leihe...

Code:
function resize($pfad,$extension)
{
    $max_t_height = 50;
    $max_t_width = 50;

    if(!file_exists($pfad))
    {
        return false;
    }

  // Berechnungen
    $size = getimagesize($pfad);
    $breite = $size[0];
    $hoehe = $size[1];

    if($breite <= $hoehe)
    { // Bild ist im Hochformat
        $neueHoehe = $max_t_height;
        $neueBreite = intval($breite*$neueHoehe/$hoehe); // neue Breite berechnen
    }
    else
    { // Bild ist im Querformat
        $neueBreite=$max_t_width;
        $neueHoehe= intval($hoehe*$neueBreite/$breite); // neue Höhe berechnen
    }


  // Thumb erstellen
    if($extension == 'jpg' or ($extension == 'jpeg'))
    {
        $altesBild = ImageCreateFromJPEG($pfad); // Altes Bild
    }
    elseif($extension == 'gif')
    {
        $altesBild = ImageCreateFromGIF($pfad); // Altes Bild
    }
    elseif($extension == 'png')
    {
        $altesBild = ImageCreateFromPNG($pfad); // Altes Bild
    }
    else return FALSE;

    $neuesBild = @ImageCreateTruecolor($neueBreite,$neueHoehe); // Neues Bild wird erstellt
    @imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe); // und das alte Bild wird verkleinert hineinkopiert
    return $neuesBild; // das neue Bild wird zurückgegeben
}

Das habe ich auch noch als Lösung im Internet gefunden, nur weis ich jetzt nicht so recht, wie ich diese beiden Schnippsel zusammenbekomme?
 
Wo wird denn im Skript die Bildgröße angegeben?

Zur Not kannst du dort doch einfach die Höhe mit width="70" angeben und den Wert für die Höhe einfach weglassen!?
 
Code:
$wimg= $confimg->wimg;
        $vwimg= $confimg->vwimg;
        $vhimg= $confimg->vhimg;

damit wird die breite und die höhe angegeben, wenn ich jetzt eine feste breite von 70px angebe, dann habe ich ja wieder das Problem, das es keine unterscheidung zwischen hochkant und querformat gibt. Aber genau das möchte ich.

Denn jetzt ist ein festes Pixel verhältnis eingestellt (zb. 120x70px) ich möchte aber die höhe beibehalten und die breite variabel machen, je nachdem wie breit halt das ausgangsfoto ist, als ob es im Querformat oder im Hochkantformat geschossen wurde.... und dies weis ich nicht umzusetzen.

Hier auch mal ein Beispiellink: http://www.rosenthal-bielatal.de/to...&layout=loc&task=edit&cid[]=25&id=25&liste=80

Das sieht halt komisch aus, wenn es die hochkantbilder breit darstellt.
 
Zuletzt bearbeitet:
PHP:
<?php
$img = "pfad\bild.jpg";

$size = getimagesize( $img);

$max_height = 70;

$faktor = 1;

if ($size[1] > 70) {
    $faktor = $max_height / $size[1];
}
?>

<img src="<?php echo $img; ?>" border="0" height="<?php echo ($size[1] * $faktor); ?>" width="<?php echo ($size[0] * $faktor); ?>"/>

Der Code kommt dort hin wo die Bilder tatsächlich angezeigt werden!
 
DANKE ****** Erstmal.
aber deswegen ist doch die bildberechnung noch immer falsch? Denn der Kunde kann ja bilder austauschen und mal nur 3 bilder nehmen oder auch nur 1 ich kann ja nun nicht immer diesen Code einfügen****?

Und der bilderpfad ist auch immer anders....?! oder bin ich jetzt total auf dem Holzweg?!

Achso noch was, der Code den ich jetzt oben gepostet habe, ist in einer datei, und dann werden nur die Bilder in einer anderen Datei geladen, denn das oben ist ja "nur das Bild Upload und berechnungsteil"
 
Zuletzt bearbeitet:
Die Seite in der die Bilder angezeigt werden ist doch nicht statisch sondern die Bilder werden mit Hilfe von PHP dort eingefügt.

Da es mehrere Bilder sind, dürfte es vielleicht sogar eine Schleife sein. In diese Schleife baust du den Code einmal ein und änderst ihn so das immer auf das entsprechende Bild zugegriffen wird.

Zeig doch mal den Teil der Seite wo/wie die Bilder dargestellt werden.
 
Also das sind 2 Dateien, die Grunddatei ist diese hier,

Code:
  <tr id="gastgeberbilderloctr">
	  
	  <td valign="top" colspan="2" id="gastgeberbilderloc">
	  
	  <div id="ansichtenloc">
	  <h6>Ansichten</h6>
	  </div>
	  
	  
	  <div id="getpicsloc"><?php getPics($this->rows->id); ?></div>
	  
	  
	  
	  </td>
	  
	  
	  
	  </tr>

hier wird dann bei

Code:
<div id="getpicsloc"><?php getPics($this->rows->id); ?></div>

folgendes eingefügt

Code:
      echo "</td></tr><tr><td width='100%' valign='top' colspan='3'></td></tr>"; 
	  }// foreach
	   
	   } //function
	   
	   
 function getPics($id_s)
  {
  
 $u =& JFactory::getURI();
$myp =  $u->root();

  
    $db 	=& JFactory::getDBO();
	
	        $query = "SELECT * FROM #__lbresa_img WHERE id_site = '$id_s' order by id asc";
			$db->setQuery( $query ); 
			$pics = $db->loadObjectList();
			
			foreach($pics as $pic)
			{ 
				
			echo "<div id='sitepic'><a href='".$myp."components/com_joomloc/images/".$pic->img."' rel='lightbox[gal]'><img style='width:117px; height:70px;' src='".$myp."components/com_joomloc/images/vignettes/".$pic->img."'  alt='Bilder der Unterkunft' /></a></div>";
			}

  }   
  
  function getallrooms($id_site, $monaie)
{

 $u =& JFactory::getURI();
$myp =  $u->root();


  $db =& JFactory::getDBO();
  
  $query = "SELECT * FROM #__lbresa_rooms where id_site = '$id_site' and published = 1 ORDER by id ASC";
  $db->setQuery( $query);
  $nbrooms = count($db->loadObjectList());
  
  
  $query = "SELECT * FROM #__lbresa_rooms where id_site = '$id_site' and published = 1 ORDER by id ASC";
  $db->setQuery( $query);
  $rooms = $db->loadObjectList();
  
  
  
  
  echo "";
  
  foreach($rooms as $room)
  {
  
  $query = "SELECT * FROM #__lbresa_rooms_img where id_site = '$id_site' and id_room='$room->id' ORDER by id ASC";
  $db->setQuery( $query);
  $nbrpics = count($db->loadObjectList());
  $rpics = $db->loadObjectList();
  
  
  
  
  
  $room->presentation = ereg_replace("\n","<br />",$room->presentation);
  echo "
  <tr>
  <td  valign='top' width='100%' colspan='4'><h6 id='unterkunftsnamelocview'>".$room->nom_loc."</h6></td></tr>
  <tr><td colspan='4'>";
  if($nbrpics>0)
  {
  
  			foreach($rpics as $rpic)
			{ 
				
			echo "<div id='roompic'><a style='width:65px; height:38px;'  href='".$myp."components/com_joomloc/images/".$rpic->img."' rel='lightbox[galroom".$room->id."]'><img src='".$myp."components/com_joomloc/images/vignettes/".$rpic->img."'  alt='Bilder der Zimmer' /></a></div>";
			}
  
  
  }
  
  echo "</td>
  </tr>
  <tr>

Weis jetzt nicht ob ich zuviel kopiert habe, denn ich weis nicht genau wo die funktion aufhört.
Die Maße habe ich Manuell auf diese 117x70px gesetzt, vorher waren da variablen drin, damit man das bequem, von Admin bereich einstellen kann, aber ich probiere halt schon recht lange rum, auch mit "width:100%" habe ich es probiert, nur dann zeigt er sie so an wie die Berechnungsbreite ist. (also das was man im Adminbereich einstellt) und wenn dort halt 11 px sind, dann wird das bild immer auf 117px breite berechnet bzw. gezogen.
Deshalb war ich auch so skeptisch ob das codeschnippsel oben klappt, denn ich bin der meinung man muss das berechnungsscript entsprechend ändern.

Aber wie gesagt ich bin kein Profi, in dieser hinsicht.
 
Ändere mal diese Zeile hier :

PHP:
<img style='width:117px; height:70px;' src='".$myp."components/com_joomloc/images/vignettes/".$pic->img."'  alt='Bilder der Unterkunft' />

Neu:

PHP:
<?php
$img = $myp."components/com_joomloc/images/vignettes/".$pic->img;

$size = getimagesize( $img);
// den Wert 70 musst du eventuell anpassen
$max_height = 70;
$faktor = 1;

if ($size[1] > $max_height) {
    $faktor = $max_height / $size[1];
}
?>
<img style='width:<?php echo ($size[0] * $faktor); ?>px; height:<?php echo ($size[1] * $faktor); ?>px' src='".$img."'  alt='Bilder der Unterkunft' />
 
Zurück