Bild verkleinern (nicht verzerren!) mit PHP

PaRkY

Gesperrt
Hi Leute.. ich würde gerne Bilder mit PHP verkleinern und wie im Titel bereits steht nicht verzerren. Also dass ein BIld welches im Ordner 200x200px gross ist verkleinert wird bei der Ausgabe auf 100x100 px.

Wie stelle ich das am besten an?

Danke für die Hilfe..
 
Das da unten hab ich mal geprogt. (Nein nicht copy&paste) du sollst dir nur angucken wie ichs mache :P
PHP:
            $im = ImageCreateFromJpeg($picpath.$_FILES['userfile']['name']);
            if($im){
                $picx = imagesx($im);
                $picy = imagesy($im);
                $picfac = $picx / $picy;
                $picsx = 150;
                $picsy = 80;
                $picsfac = $picsx / $picsy;
                if($picsfac > $picfac){
                    $zimg = imagecreate($picfac * $picsy, $picsy);
                    imagecopyresized($zimg, $im, 0, 0, 0, 0, $picfac * $picsy, $picsy, $picx, $picy);
                }else{
                    $zimg = imagecreate($picsx, $picfac * $picsx);
                    imagecopyresized($zimg, $im, 0, 0, 0, 0, $picsx, $picsx * $picfac, $picx, $picy);
                }
                ImageJpeg($zimg, 'user_'.$_POST['nick'].'_pic.jpg', 100);
                ImageDestroy($im);
                ImageDestroy($zimg);
            }
 
Das Script von Sicaine funktioniert leider nur einwandfrei, wenn auf Deinem Server GD-Lib 1.x läuft - sollte GD-Lib 2.x laufen, musst Du "imagecreate" durch "ImageCreateTrueColor" und "imagecopyresized" durch "ImageCopyResampled" ersetzen. Um unabhänge zu scripten kannst Du das wie folgt machen:
PHP:
if ((function_exists(imagecreatetruecolor)) && (function_exists(imagecopyresampled))) {
    $gdversion = 2;
}
else {
	$gdversion = 1;
}
$im = ImageCreateFromJpeg($picpath.$_FILES['userfile']['name']);
    if($im){
        $picx = imagesx($im);
        $picy = imagesy($im);
        $picfac = $picx / $picy;
        $picsx = 150;
        $picsy = 80;
        $picsfac = $picsx / $picsy;
        if($picsfac > $picfac){
            if ($gdversion == '1') {
                $zimg = imagecreate($picfac * $picsy, $picsy);
                imagecopyresized($zimg, $im, 0, 0, 0, 0, $picfac * $picsy, $picsy, $picx, $picy);
            }
            else {
                $zimg = imagecreatetruecolor($picfac * $picsy, $picsy);
                imagecopyresampled($zimg, $im, 0, 0, 0, 0, $picfac * $picsy, $picsy, $picx, $picy);
            }
        }
        else{
            if ($gdversion == '1') {
                $zimg = imagecreate($picsx, $picfac * $picsx);
                imagecopyresized($zimg, $im, 0, 0, 0, 0, $picsx, $picsx * $picfac, $picx, $picy);
            }
            else {
                $zimg = imagecreatetruecolor($picsx, $picfac * $picsx);
                imagecopyresampled($zimg, $im, 0, 0, 0, 0, $picsx, $picsx * $picfac, $picx, $picy);
            }
        }
        ImageJpeg($zimg, 'user_'.$_POST['nick'].'_pic.jpg', 100);
        ImageDestroy($im);
        ImageDestroy($zimg);
    }
 
DigitalMarine hat gesagt.:
Das Script von Sicaine funktioniert leider nur einwandfrei, wenn auf Deinem Server GD-Lib 1.x läuft - sollte GD-Lib 2.x laufen, musst Du "imagecreate" durch "ImageCreateTrueColor" und "imagecopyresized" durch "ImageCopyResampled" ersetzen. Um unabhänge zu scripten kannst Du das wie folgt machen:

Oo dass es wegen dem nich mehr richtig laufen soll hab ich zwar noch nie gehört (aber ich glaubs dir keine Angst :P) trozdem brauchste auf jeden Fall imagecreatetruecolor weils sonst 256Farben sind und dat sieht bescheiden aus. Dachte eigentlich ich hätte das da geändert aber egal :P
 
@Sicaine:

Ich wollte Dir nicht auf die Füsse treten, aber ich habe selbst schon sowas gescriptet und habe mich immer gewundert, warum ich auf meinem Testserver nie Probleme hatte, der Kunde in Seiner Onlineversion schon - bis ich darauf gekommen bin, die GD Version zu checken und den Resize entsprechend der installierten Version abzuarbeiten; und diese Sucherei wollte ich PaRkY ersparen . Ich habe ihm ja auch nichts vorgekaut, sondern nur Deinen Codeschnipsel erweitert.
"Nicht laufen" war vielleicht ein wenig hart ausgedrückt, aber das Problem mit den Farben besteht nach wie vor - soweit ich das nachvollziehen konnte, liegt es aber auch an der Größe des zu ändernden Bildes.

Also, nichts für ungut.
 
Hiermit könnt ihr checken ob und welche GD-Librarry ihr habt
PHP:
function describeGDdyn() {
  echo "\n<ul><li>GD support: ";
  if(function_exists("gd_info")){
   echo "<font color=\"#00ff00\">yes</font>";
   $info = gd_info();
   $keys = array_keys($info);
   for($i=0; $i<count($keys); $i++) {
       if(is_bool($info[$keys[$i]])) echo "</li>\n<li>" . $keys[$i] .": " . yesNo($info[$keys[$i]]);
       else echo "</li>\n<li>" . $keys[$i] .": " . $info[$keys[$i]];
   }
  } else { echo "<font color=\"#ff0000\">no</font>"; }
  echo "</li></ul>";
}

function yesNo($bool){
  if($bool) return "<font color=\"#00ff00\">Ja</font>";
  else return "<font color=\"#ff0000\">Nein</font>";
} 

describeGDdyn();
 
Zurück