daGizmo: imagecopyresized - proportionstreue Thumbnails

Hallo!

Ich versuche jetzt schon seit einiger Zeit mit PHP von einem hochgeladenen Bild eine Vorschaugrafik mit 100x100px zu erstellen, ohne dass das Bild verzerrt wird.

Zur Verdeutlichung:
x = breite
y = höhe

wenn x > y
y = 100px
x = Ausschnitt in der Größe von 100px

wenn x < y
x = 100
y = Ausschnitt in der Größe von 100px

Habe dazu ein Script zusammengebastelt (ist nicht der gesamte Code):

$newfilename  = $_POST['id'].'_Preview.jpg';
$altesBild = ImageCreateFromJPEG($filelocation.$newfilename);
    $neuesBild = imagecreatetruecolor($neueBreite, $neueHoehe); //kleinere Seite = 100

imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
    ImageJPEG($neuesBild,$filelocation.$newfilename);

$altesBild = ImageCreateFromJPEG($filelocation.$newfilename);
    $altesBild = imagecreate ( $neueBreite, $neueHoehe );
    imagecopyresized ( $altesBild, $neuesBild, 1, 1, 99, 99, 1, 1, 99, 99 );
    ImageJPEG($neuesBild,$filelocation.$_POST['id'].'_Preview.jpg');

In dieser Form erscheint keine Fehlermeldung, jedoch wird die Grafik nicht in der Größe von 100x100px gespeichert, sondern eben kleinere Seite = 100 * ?

Was müsste ich hier ändern, um ans Ziel zu kommen? Wäre sehr dankbar für einen Tipp!

Vielen Dank im Voraus!
Grüße aus Wien,
daGizmo

  1. Ich versuche jetzt schon seit einiger Zeit mit PHP von einem hochgeladenen Bild eine Vorschaugrafik mit 100x100px zu erstellen, ohne dass das Bild verzerrt wird.

    Zur Verdeutlichung:
    x = breite
    y = höhe

    wenn x > y
    y = 100px
    x = Ausschnitt in der Größe von 100px

    wenn x < y
    x = 100
    y = Ausschnitt in der Größe von 100px

    Habe dazu ein Script zusammengebastelt (ist nicht der gesamte Code):

    Tja, und wie soll hier jetzt jemand den Fehler suchen, wenn du ausgerechnet den Teil, in dem die Dimensionen des auszuschneidenden Teils berechnet werden, nicht nennst?

    In dieser Form erscheint keine Fehlermeldung, jedoch wird die Grafik nicht in der Größe von 100x100px gespeichert, sondern eben kleinere Seite = 100 * ?

    Was meinst du mit "100 *", oder soll das "100 * ?" sein? Und wenn die kleinere Seite ein Vielfaches von 100 ist, wie lang ist dann die größere Seite? Dass passt doch hinten und vorne nicht, eine Seite muss mittels einer Konstante auf 100 gesetzt worden sein.

  2. Hi daGizmo!

    wenn x > y
    y = 100px
    x = Ausschnitt in der Größe von 100px

    Sollte das nicht genau umgekehrt sein?
    Wenn x > y, dann sollte die größere Seite nämlich x auf den Maximalwert festgelegt werden, also x = 100px.

    wenn x < y
    x = 100
    y = Ausschnitt in der Größe von 100px

    Analog...

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Sollte das nicht genau umgekehrt sein?
      Wenn x > y, dann sollte die größere Seite nämlich x auf den Maximalwert festgelegt werden, also x = 100px.

      Nein, weil dann eine Seite kleiner als 100px ist, das Bild also unförmig wird (das kriege ich hin, ist aber nicht mein Ziel)... ich hätt gern 100x100px Quadrate als Thumbnails, die nur ein Ausschnitt vom Bild sind. Mit der Funktion imagecopyresized müsste das möglich sein, leider hab ich noch irgendwo was falsch : (

      1. Hi daGizmo!

        Nein, weil dann eine Seite kleiner als 100px ist, das Bild also unförmig wird (das kriege ich hin, ist aber nicht mein Ziel)... ich hätt gern 100x100px Quadrate als Thumbnails, die nur ein Ausschnitt vom Bild sind.

        Alles klar.

        Kannst du nicht einfach auf 100 x NeueHöhe bzw. NeueBreite x 100 skalieren und dann unten und oben bzw. links und rechts so viel wegschneiden, dass 100 x 100 übrig bleibt?

        Ich kenne mich da auch nicht so richtg aus, aber irgend eine Funktion image_crop() oder ähnlich sollte es schon geben.

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Gudn!

          Ich kenne mich da auch nicht so richtg aus, aber irgend eine Funktion image_crop() oder ähnlich sollte es schon geben.

          Schlag den Namen doch mal vor... ;-)

          Das Schneiden übernimmt hier auch imagecopyresized()

          Ohne den gesamten Code mit den Berechnungen kann hier schlecht geholfen werden.

          Gruß aus Fürth in Mittelfranken,
          Samoht

          --
          fl:| br:> va:) ls:< n4:( ss:) de:] js:| mo:}
          1. Hier jetzt der gesamte Code:
            Anfangs wird alles mögliche geprüft, dann wird eine erste Grafik erstellt, mit einer Breite von 500px (Höhe ist variabel; wird angepasst), und zuletzt sollte noch ein Thumbnail erstellet werden mit einer Größe von 100*100px, wie bereits erwähnt - wichtig dabei ist, das das Thumbnail nicht verzerrt ist. Bei dem folgenden Code wird auch die zweite Grafik nur verkleinert, das "ausschneiden" krieg ich einfach nicht hin... wäre aber sehr wichtig - mache eine Page für einen Architekten, und der nimmt jedes Detail sehr ernst : (

            <? $filesize  = 3145728; //entspricht 3 MB
             $fehler  = "";

            if($_POST['id']!='') {
              if(!is_uploaded_file($_FILES['bildupload']['tmp_name'])) {
               $fehler = "Es wurde keine Datei ausgewählt oder der Upload-Vorgang wurde gestört";
              } else {
               if( $_FILES['bildupload']['size'] > $filesize ) {
                $fehler = "Die Datei ist zu groß! Die maximale Bildgröße darf 3 MB betragen.";
               }
               if( !$_FILES['bildupload']['type'] == 'image/jpeg' ) {
                $fehler = "Dieser Dateityp ist nicht zulässig!<br>Es dürfen nur Bilder im JPEG-Format (.jpg / .jpeg) hochgeladen werden";
               }
              }

            echo $_FILES['bildupload']['error'];

            if( $fehler != "" ) {
               echo $fehler;
              } else {

            //Bearbeiten und speichern der Bilder
               $filelocation  = 'images/sites/';
               $newfilename  = $_POST['id'].'.jpg';
               if((move_uploaded_file($_FILES['bildupload']['tmp_name'],$filelocation.$newfilename))) {
                //Anpassen der Größe Hauptbild
                $size  = GetImageSize($filelocation.$newfilename);
                $breite  = $size[0];
                $hoehe  = $size[1];
                $neueBreite = 500;
                $neueHoehe = intval($hoehe*$neueBreite/$breite);

            $altesBild = ImageCreateFromJPEG($filelocation.$newfilename);
                $neuesBild = imagecreatetruecolor($neueBreite, $neueHoehe);

            imagecopyresampled($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
                ImageJPEG($neuesBild,$filelocation.$_POST['id'].'.jpg');

            //Anpassen der Größe Vorschaubild
                $size  = GetImageSize($filelocation.$newfilename);
                $breite  = $size[0];
                $hoehe  = $size[1];

            if( $size[0] < $size[1] ) {
                 $neueBreite = 100;
                 $neueHoehe = intval($hoehe*$neueBreite/$breite);
                } else {
                 $neueHoehe = 100;
                 $neueBreite = intval($breite*$neueHoehe/$hoehe);
                }

            $altesBild = ImageCreateFromJPEG($filelocation.$newfilename);
                $neuesBild = imagecreatetruecolor($neueBreite, $neueHoehe);

            imagecopyresampled($neuesBild,$altesBild, 0,0, 0,0, $neueBreite,$neueHoehe, $breite,$hoehe);
                ImageJPEG($neuesBild,$filelocation.$_POST['id'].'_Preview.jpg');

            echo 'Bildupload für ID '.$_POST['id'].' war erfolgreich!';
               } else {
                echo 'Fehler!';
               }
              }
             } ?>

            1. Gudn!

              <? $filesize  = 3145728; //entspricht 3 MB

              Tipp: Verwende keine short-tags sondern <?php

              $fehler  = "";

              if($_POST['id']!='') {
                if(!is_uploaded_file($_FILES['bildupload']['tmp_name'])) {
                 $fehler = "Es wurde keine Datei ausgewählt oder der Upload-Vorgang wurde gestört";
                } else {
                 if( $_FILES['bildupload']['size'] > $filesize ) {
                  $fehler = "Die Datei ist zu groß! Die maximale Bildgröße darf 3 MB betragen.";
                 }
                 if( !$_FILES['bildupload']['type'] == 'image/jpeg' ) {
                  $fehler = "Dieser Dateityp ist nicht zulässig!<br>Es dürfen nur Bilder im JPEG-Format (.jpg / .jpeg) hochgeladen werden";
                 }

              unzureichende Prüfung bzgl. Bilder. Wurde hier schon öfters diskutiert. Außerdem übergibt der IE beispielsweise 'image/pjpeg'. Verwende getimagesize()

              Zum Code:

              Ich finde es etwas unübersichtlich dass Du gleiche Variablen für verschiedene Sachen verwendest.

              Zum Vorgehen allgemein:

              • Verkleinertes Bild erstellen (machst Du bereits)
              • Thumbnail erstellen mit 100px Breite und dazu passender Höhe (imagecopyresampled, so wie schon von dir umgesetzt)
              • o.g. Thumbnail _nochmal_ mit imagecopyresampled bearbeiten und zwar mit den folgenden parametern:

              imagecopyresampled ($neuesthumbnail,$altesthumbnail,0,0,0,0,100,100,100,100)

              das sollte dann funktionieren.
              Die ersten zwei 100er geben die Zielgröße des Ausschnitts an, die nächsten zwei 100er die Ursprungsgröße des Ausschnitts. Die 0er sind die Koordinaten.
              Vorher muss natürlich noch mit imagecreatetruecolor ein neues Bild erstellt werden - auch mit den Maßen 100x100.

              Gruß aus Fürth in Mittelfranken,
              Samoht

              --
              fl:| br:> va:) ls:< n4:( ss:) de:] js:| mo:}