Take Three: Thumbnailgalerie?

Hallo Leute,

Erst mal mein Code:

  
<?  
$loeschdatum=date(j);  
$tv = opendir ("./bilder/thumbs/");  
while ($tfile=readdir($tv)) {if ($loeschdatum=="1") unlink ("./bilder/thumbs/".$tfile); }                        //Immer bei Monats-Anfang wird das Thumbnail-Verzeichnis gesäubert  
  
if (is_dir("./bilder/thumbs/")==false) mkdir ("./bilder/thumbs/");  
  
$verzeichnis = opendir ('./bilder/');  
while ($file=readdir($verzeichnis)) {  
if (file_exists("./bilder/thumbs/".$file)==false) //Nur weitergehen, wenn das Thumbnail noch nicht existiert  
{  
  
$quell_file  = imagecreatefromjpeg($file);  
  
$height = imagesy($quell_file); // Höhe  
$width = imagesx($quell_file);  // Breite  
  
$new_height = 112;   //Alle bilder erhalten die gleiche Größe  
$quot = $height / 112;   //Der Quotient wird ermittelt  
$new_width = $width / $quot;    //neue Bildbreite wird mit Quotient ermittelt  
$ziel_file = imagecreatetruecolor($new_width,$new_height);  
  
imagecopyresized($ziel_file,$quell_file,0,0,0,0,$new_width,$new_height,$width,$height);  
  
imageinterlace($ziel_file);  
  
imagejpeg($ziel_file,"./bilder/thumbs/".$file,100);  
  
} }  
?>  
  
<html>  
<head>  
<title>Take Three - Homepage</title>  
<link rel="stylesheet" type="text/css" href="styles.css">  
</head>  
  
<body bgcolor="#000000">  
<em><strong><h1>Galerie</h1></strong></em> <br>  
  
<table width="760" cellpadding="20">  
<tr>  
  
<? $bilderverzeichnis = opendir ('./bilder/');  
$i=0;  
while ($file=readdir($bilderverzeichnis)) {  
if (eregi(".jpg", $file)) { //Es werden nur *.jpgs angezeigt ?>  
    <td width="200" height="150" align="center"><a href="#" onClick="javascript:window.open('./bilder/<? echo $file; ?>','Bildergalerie', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=no, width=650, height=500, top=0, left=0,')">  
      <img src="./bilder/thumbs/<? echo $file; ?>" name="bild" border="0" align="middle" alt="Zum Vergrößern draufklicken!"></a>  
    </td>  
<? $i++;  
     if ($i%4=="0") echo "</tr><tr>"; //Immer nach 4 Bildern folgt ein Zeilenumbruch  
} } ?>  
</tr>  
</table>  
</body>  

1. Problem: Ich möchte, dass alle Bilder (egal ob Hoch- oder Querformat) die gleiche Höhe erhalten und die Breite daraufhin angepasst wird. Aber irgendwie haben meine Bilder alle dieselbe Breite und die Höhe wird angepasst!??
Ihr könnt euch das Ergebnis mal auf http://mitglied.lycos.de/synthesizer/takethree/galerie.php anschauen.

2. Problem: Wenn das Verzeichnis 'thumbs' an Monatsanfang gesäubert wird, werden daraufhin aber keine Thumbnails mehr erstellt. Warum?

  1. Kann mir keiner helfen?

    1. hallo T3,

      Kann mir keiner helfen?

      Bitte nicht drängeln (deine Frage ist erst 70 Minuten alt). Es ist Sonntagnachmittag, und manche Leute haben da auch noch andres zu tun. Außerdem sinken mit solchen Drängeleien deine Chancen erheblich, eine zielführende Antwort zu bekommen.

      Grüße aus Berlin

      Christoph S.

  2. Hallo Take Three,

    1. Problem: Ich möchte, dass alle Bilder (egal ob Hoch- oder Querformat) die gleiche Höhe erhalten und die Breite daraufhin angepasst wird. Aber irgendwie haben meine Bilder alle dieselbe Breite und die Höhe wird angepasst!??

    $height = imagesy($quell_file); // Höhe
    $width = imagesx($quell_file);  // Breite

    $new_height = 112;   //Alle bilder erhalten die gleiche Größe
    $quot = $height / 112;   //Der Quotient wird ermittelt

    ^^^^
    $quot = $height / $width;

    $new_width = $width / $quot;    //neue Bildbreite wird mit Quotient ermittelt

    Das schaut richtig aus.

    1. Problem: Wenn das Verzeichnis 'thumbs' an Monatsanfang gesäubert wird, werden daraufhin aber keine Thumbnails mehr erstellt. Warum?

    if (is_dir("./bilder/thumbs/")==false) mkdir ("./bilder/thumbs/");

    ^^^^^^^^

    if (is_dir("./bilder/thumbs/") === FALSE) ...

    oder (MUSEN eleganter)

    if (!is_dir("./bilder/thumbs/")) ...

    Gleiches gilt auch für die Abfrage ob das $file existiert.

    Grüsse
    Frankie

    1. Hallo FrankieB,

      Mensch Frankie Du alter Schussel ...

      $new_width = $width / $quot;    //neue Bildbreite wird mit Quotient ermittelt

      Das schaut richtig aus.

      NEIN, das ist FALSCH, richtig ist

      $new_width = $new_height / $quot;

      Grüsse
      Frankie

      1. NEIN, das ist FALSCH, richtig ist

        $new_width = $new_height / $quot;

        Warum? Die Variable $new_width steht doch noch gar nicht fest. Wie kann man dann damit arbeiten. Nein, die Syntax von Take Three stimmt schon

        1. Hallo Vallicus,

          NEIN, das ist FALSCH, richtig ist

          $new_width = $new_height / $quot;

          Warum? Die Variable $new_width steht doch noch gar nicht fest [1]. Wie kann man dann damit arbeiten. [2] Nein, die Syntax von Take Three stimmt schon

          [2] Die Syntax ist schon richtig, aber sein Code liefert nicht das von ihm gewünschte Ergebnis, weil sein Rechenweg nicht stimmt.

          [1] Richtig, $new_width steht _vor_ dieser Zeile noch nicht fest, deshalb wird sie ja berechnet ;-)

          Grüsse
          Frankie

          1. [1] Richtig, $new_width steht _vor_ dieser Zeile noch nicht fest, deshalb wird sie ja berechnet ;-)

            Stimmt schon, aber du berechnest die neue Breite ja, indem du die neue Breite (die ja noch garnicht feststeht) durch $quot dividierst.
            "Denkfehler?"
            Du kannst ja auch nicht einfach eine Gleichung wie z.B. x=x/5 lösen. Wie soll das gehen?!!!

            Vallicus

            1. Hallo Vallicus,

              "Denkfehler?"

              Nö, denke ich nicht ;-)

              Du kannst ja auch nicht einfach eine Gleichung wie z.B. x=x/5 lösen. Wie soll das gehen?!!!

              Wo denkst Du gibt es bei meinem Lösungsvorschlag eine Analogie zu x=x/5 ?

              Aussderdem

              x=x/5

              => x/x = 1/5

              => 1 = 0.2

              Fällt dir was auf?

              Gut, jetzt speziell für dich [1] nochmal step-by-step zum mitschreiben und -denken:

              Du hast ein (Orginal-)Bild

              Du ermittelst (mit PHP) dessen Breite (x0) und Höhe (y0)

              -> x0
              -> y0
              -> ratio0 = x0/ y0

              Dieses Orginalbild wollen wir nun skalieren, wobei die neue Höhe (y1) gegeben ist und die Ratio (Verhältnis von Breite / Höhe) der des Orginals entspricht.

              y1 = const. (und gegeben)
              x1 = unbekannt, wollen wir errechnen
              ratio1 = ratio0 = ratio = bekannt

              Auflösen nach x1 (das was wir suchen):

              x1/y1 = ratio

              -> x1 = y1 * ratio.

              So, und nun wirst du mir kommen und sagen, daß beim OP die Formel zur Berechnung seiner $new_width so aussieht
              $new_width = $width / $quot;
              und in meiner korrigierten Version
              $new_width = $new_height / $quot;
              lautet.

              Warum ist meine Lösung x1 = y1 * ratio (als mit Multiplikation) trotzdem richtig? Naja, bei meinem Beispiel habe ich für die Ratio eben nicht Höhe/ Breite, sondern Breite / Höhe genommen. That's it. Beides richtig.

              Grüsse
              Frankie

              [1] nicht böse gemeint ,-)

              1. Aber meins ist doch eigentlich genauso richtig, oder?

                1. Hallo Take Three,

                  Aber meins ist doch eigentlich genauso richtig, oder?

                  welche Version meinst Du jetzt? Bitte mal die "Formel" welche Du jetzt meinst posten.

                  Grüsse
                  Frankie

                  1. Die Version meine ich:

                      
                    $height = imagesy($quell_file); // Höhe  
                    $width = imagesx($quell_file);  // Breite  
                      
                    $new_height = 112;   //Alle bilder erhalten die gleiche Größe  
                    $quot = $height / 112;   //Der Quotient wird ermittelt  
                    $new_width = $width / $quot;    //neue Bildbreite wird mit Quotient ermittelt  
                    
                    

                    Wenn man sie nämlich Schritt für Schritt durchgeht, ist die nämlich auch vollkommen logisch (wie schon beschrieben)

                    1. Hallo Take Three,

                      Wenn man sie nämlich Schritt für Schritt durchgeht, ist die nämlich auch vollkommen logisch (wie schon beschrieben)

                      hast ja recht, habe mich weiter oben schon dafür entschuldigt. Sorry für meine Blindheit.

                      Grüsse
                      Frankie

                      1. Schon gut,

                        Trotzdem: Irgendetwas stimmt noch nicht, weil sobald die Thumbs gelöscht sind ist das Skript nicht mehr imstande sie neu zu generieren!??
                        Ich meine: Nachdem der Löschvorgang abgeschlossen ist, geht das Skript ja automatisch weiter zur Erstellung der Thumbs

    2. Also erst mal vielen Dank,

        
      
      > > $new_height = 112;   //Alle bilder erhalten die gleiche Größe  
      > > $quot = $height / 112;   //Der Quotient wird ermittelt  
      >                     ^^^^  
      > $quot = $height / $width;  
      
      

      Was ist daran falsch? Wenn ich eine feste Höhe für alle Bilder festlege ($new_height = 112;) und dann ausrechnen will um das Wievielfache die Höhe verringert wurde, muss ich als Quotient doch die Alte Höhe durch die neue Höhe (112) teilen. Wenn ich z.B. ein Originalbild mit den Maßen 100x200 habe und die neue Höhe 50 betragen soll, dann muss ich 200/50=4 rechnen um den Quotient (4) zu erhalten. D.h. die neue Höhe ist um das 4-fache kleiner als die des Originalbildes. Folglich muss ich für die Breite dann nur noch rechnen: $altebreite/4=$new_width;) Verbessert mich, falls das nicht stimmt.

      Gleiches gilt auch für die Abfrage ob das $file existiert.

      Wie muss das dann heißen? So?: if (!file_exists("./bilder/thumbs/".$file))

      Allerdings werden die Thumbnails immer noch nicht neu erstellt. Wenn ich z.B. als Löschdatum den 5. jedes Monats angebe, werden die Thumbnails zwar wie vorgesehen gelöscht, aber dann nicht mehr generiert!?

      1. Hallo Take Three,

        also erstmal muß ich mich entschuldigen. Dein Rechenweg ist natürlich genauso richtig, ich habe einfach aus Gewohnheit immer mit der Ratio von Breite/Höhe (oder umgekehrt) gerechnet, daß man es ja ebenso mit Höhe(alt)/Höhe(neu) machen kann habe, ich übersehen.

        Warum deine Bilder anstatt der gleichen Höhe die gleiche Breite erhalten kann ich mir nicht erklären, vielleicht hast Du in deinem Code an einer Stelle width und height vertauscht?

        Gleiches gilt auch für die Abfrage ob das $file existiert.
        Wie muss das dann heißen? So?: if (!file_exists("./bilder/thumbs/".$file))

        Allerdings werden die Thumbnails immer noch nicht neu erstellt. Wenn ich z.B. als Löschdatum den 5. jedes Monats angebe, werden die Thumbnails zwar wie vorgesehen gelöscht, aber dann nicht mehr generiert!?

        Also ich kann dir nur sagen wie ich es immer mache (und noch nie Probleme damit hatte):

        if (!is_file($path.$file)) {
          // lege Thumbnail an
        }

        Laß' dir doch einfach mal ausgeben, was $file enthält, vor der if-Verzweigung.

        Grüsse
        Frankie

        1. Hallo,

          Könnte sich vielleicht nochmal jemand die Mühe mach, dieses Skript auf Fehler durchzusehen? Bei mir wird nämlich statt der gleichen Höhe nur die gleiche Breite für alle Thumbs ausgegeben!? Ich hab's schon ein paarmal durchgecheckt, aber bislang noch keinen Fehler gefunden.

          <?  
          $loeschdatum=date(j);  
          $tv = opendir ("./bilder/thumbs/");  
          while ($tfile=readdir($tv)) {if ($loeschdatum=="1") unlink ("./bilder/thumbs/".$tfile); }                        //Immer bei Monats-Anfang wird das Thumbnail-Verzeichnis erneuert  
            
          if (!is_dir("./bilder/thumbs/")) mkdir ("./bilder/thumbs/");  
            
          $verzeichnis = opendir ('./bilder/');  
          while ($file=readdir($verzeichnis)) {  
          if (!is_file("./bilder/thumbs/".$file)) {  
            
          $quell_file  = imagecreatefromjpeg($file);  
            
          $height = imagesy($quell_file); // Höhe  
          $width = imagesx($quell_file);  // Breite  
            
          $new_height = 112;  
          $quot = $height / $width;  
          $new_width = $width / $quot;  
          $ziel_file = imagecreatetruecolor($new_width,$new_height);  
            
          imagecopyresized($ziel_file,$quell_file,0,0,0,0,$new_width,$new_height,$width,$height);  
            
          imageinterlace($ziel_file);  
            
          imagejpeg($ziel_file,"./bilder/thumbs/".$file,100);  
            
          } }  
          ?>
          
          1. Hallo Take Three,

            Könnte sich vielleicht nochmal jemand die Mühe mach, dieses Skript auf Fehler durchzusehen? Bei mir wird nämlich statt der gleichen Höhe nur die gleiche Breite für alle Thumbs ausgegeben!? Ich hab's schon ein paarmal durchgecheckt, aber bislang noch keinen Fehler gefunden.

            Also ich habe das ganze mal schnell selbst geschrieben und getestet und bei mir funktioniert alles wie gewünscht. Sowohl das Löschen und neu Erzeugen, als auch das Skalieren. Wie nicht anders zu erwarten war, liefern auch sowohl deine als auch meine Methode beim Skalieren identische Ergebnisse und auch die Breiten und Höhen sind korrekt.

            Ich habe keine Ahnung wo es bei dir hakt, ehrlich nicht ;-(

            Grüsse
            Frankie

            1. Hallo Frankie,

              Meinst du, du könntest mir mal dein Skript schicken? Wär' furchtbar nett :-)
              Wahrscheinlich ist bei mir nur irgendein Schreibfehler (z.B. ":" statt ";") vorhanden, den ich aber leider nicht sehe.

              Wie nicht anders zu erwarten war, liefern auch sowohl deine als auch meine Methode beim Skalieren identische Ergebnisse und auch die Breiten und Höhen sind korrekt.

              Was heißt das? Haben bei dir alle Bilder die gleiche Höhe oder Breite? Bei mir ist nämlich das Problem, dass die Bilder statt der gleichen Höhe alle die gleiche Breite erhalte. Auch so ein Fehler im Skript!?!

              1. Hallo Take Three,

                Meinst du, du könntest mir mal dein Skript schicken? Wär' furchtbar nett :-)
                Wahrscheinlich ist bei mir nur irgendein Schreibfehler (z.B. ":" statt ";") vorhanden, den ich aber leider nicht sehe.

                Hmmm, das Skript, das ich gestern abend kurz hingekritzelt habe ist zwar nicht auskommentiert und extrem auf meine Vorstellungen zugeschnitten, aber wenn Du willst kann ich es dir gerne geben. Auf jeden Fall unterstützt auch die Features welche Du dir wünscht. Aber um es hier zu posten ist es doch zu gross, hat mittlerweile um die 500 Zeilen, mit Kommentaren wären es vielleicht 700 Zeilen. Wenn Du willst, werde ich mich bemühen es heute (aber erst später) kurz online zu stellen, und wenn es so funkt wie Du es dir vorstellst, schicke ich es dir via E-Mail, auskommentieren werde ich es allerdings nicht, müsstest dich halt reinlesen.

                Wie nicht anders zu erwarten war, liefern auch sowohl deine als auch meine Methode beim Skalieren identische Ergebnisse und auch die Breiten und Höhen sind korrekt.
                Was heißt das? Haben bei dir alle Bilder die gleiche Höhe oder Breite? Bei mir ist nämlich das Problem, dass die Bilder statt der gleichen Höhe alle die gleiche Breite erhalte. Auch so ein Fehler im Skript!?!

                Nein, bei mir haben alle Thumbnails die gleiche Höhe (weil ich/Du das so will, geht natürlich genauso mit konstanter Breite), und je nachdem, eine unterschiedliche Breite (Höhe), kommt halt immmer auf das Seitenverhältnis des Orginals an. [1]: wie Du siehst, Höhe bleibt gleich, Breite passt sich an. Die Ergebnisse wurden sowohl mit "meiner" Methode, als auch mit "deiner" Methode gerechnet und wie Du siehst sind die Ergebnisse exakt gleich.

                Grüsse
                Frankie

                [1]

                Ausgabe Berechnung Thumbnailgrösse

                file: JPG: PICT1133.jpg

                $ratio = $org_x / $org_y = 780 / 600 = 1.3
                $new_width = $new_height * $ratio = 200 * 1.3 = 260
                $quot = $org_y / $new_height = 600 / 200 = 3
                $new_width = $org_x / $quot = 780 / 3 = 260

                Zusammenfassung:
                ($org_x, $org_y) = (780, 600)
                $new_width auf/ab gerundet weil Pixel
                ($new_width, $new_height) = (260, 200)

                file: JPG: PICT1199.jpg

                $ratio = $org_x / $org_y = 590 / 600 = 0.983333333333
                $new_width = $new_height * $ratio = 200 * 0.983333333333 = 196.666666667
                $quot = $org_y / $new_height = 600 / 200 = 3
                $new_width = $org_x / $quot = 590 / 3 = 196.666666667

                Zusammenfassung:
                ($org_x, $org_y) = (590, 600)
                $new_width auf/ab gerundet weil Pixel
                ($new_width, $new_height) = (197, 200)