Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Thumbnail wird nicht erstellt
Antwort
 
Themen-Optionen
Alt 11.02.2008, 14:20   Nach oben    #1
Gerrit
Neuer Benutzer
 
Registriert seit: 11.02.2008
Beiträge: 5
Standard Thumbnail wird nicht erstellt

Hallo,

mit folgenden Script versuche ich ein Vorschaubild zu generieren.
Es funktioniert aber nicht.
Was aber kurios ist, es wird nicht einmal ein Fehler ausgegeben.
Das einzige was passiert ist, es wurde das Verzeichnis angelegt.

Achso, die Berechnung habe ich hier von Jann Hendrik her: thumbnail-Klasse; Qualität ok?

PHP-Code:
<?php

 error_reporting
(E_ALL);


 
// Ausgabe eventueller Fehler
 
function error_message($text '')
 {
     echo 
"<p style=\"border: 1px #BE4B6C solid; background: #F9CDD8; padding: .5em;\">"addslashes($text) ."</p>\n";
 }
 
 
 
// Verzeichnis erstellen, wenn dies nicht vorhanden ist
 
function mkPath($path$chmod 0644)
 {
     if(!
file_exists($path))
     {
         
mkdir($path);
         
chmod($path$chmod);
     }
 }


 
// zufälligen String für neuen Dateiname erstellen
 
function RandomString($maxLen 8)
 {
     
$temp array_merge(range('a''z'), range('A''Z'), range('0''9'));
     
shuffle($temp);
     for(
$i 0$i $maxLen$i++)
     {
         
$str substr(implode(''$temp), 1$maxLen);
     }

     return 
$str;
 }
 

 
// Funktion, zum erstellen von Vorschaubildern
 
function ImageResizer($originalImage ''$originalPath 'Images'$newPath 'Thumbnails'$thumbWidth 196$thumbHeight 196$imageQuality 75)
 {
     
// 1. und 2. prüfen, ob und welche GD Version installiert ist, es muss < 2 sein
     
if(function_exists('gd_info'))
     {
         
$gdVersion gd_info();
         if(
substr_count($gdVersion['GD Version'], '2') < '2')
         {
             
error_message('Es muss die GD2 Library mindestens in der Version 2.0.* installiert sein, um die Bearbeitung von Bildern durchzuführen.');
             return 
FALSE;
         }
     }
     else
     {
         
error_message('Es ist keine GD Library installiert, somit kann die Bearbeitung von Bilder nicht durchgeführt werden.');
         return 
FALSE;
     }


     
// 3. aus Sicherheitsgründen keine '..' erlauben und letztes Slash entfernen
     
$originalImage str_replace('..'''$originalImage);
     if(
$originalPath str_replace('/'''$originalPath))
     {
         
$originalPath $originalPath;
     }
     
     
     
// 4. Pfad+Dateinamen zum Originalbild wieder zusammenbauen
     
$originalName $originalPath ."/"$originalImage;

     
     
// 5. prüfen, ob überhaupt eine Datei übergeben wurde
     
if(empty($originalName))
     {
         
error_message('Bitte geben Sie an Bild an, wovon ein Vorschaubild erstellt werden soll.');
         return 
FALSE;
     }


     
// 6. prüfen, ob das Verzeichnis zum speichern der Vorschaubilder existiert
     
mkPath($originalPath ."/"$newPath0777);


     
// 7. Breite und Höhe des Originalbildes ermitteln
     
list($imageWidth$imageHeight) = @GetImageSize($originalName);
     

     
// 8. erlaubte Bildformate zur Weiterverarbeitung festlegen
     
$trueExt = array('gif''jpg''jpeg''png');
     
$extInfo pathinfo(strtolower($originalName));

     if (!
in_array($extInfo['extension'], $trueExt))
     {
         
error_message('Das Dateiformat <strong>'$extInfo['extension'] .'</strong> ist nicht zulässig.<br />An dieser Stelle wird die Weiterverarbeitung abgebrochen.');
         return 
FALSE;
     }
     
     
     
// 9. neuen Dateinamen festlegen
     
$newName $originalPath ."/"$newPath ."/"RandomString(12) ."."$extInfo['extension'];
     
     
     
// 10. erzeugt das neue Bild im jeweiligen Format
     
if($extInfo['extension'] == 'gif')
     {
         
$oldImage ImageCreateFromGIF($originalName);
         return 
TRUE;
     }
     elseif(
$extInfo['extension'] == 'jpg' || $extInfo['extension'] == 'jpeg')
     {
         
$oldImage ImageCreateFromJPEG($originalName);
         return 
TRUE;
     }
     elseif(
$extInfo['extension'] == 'png')
     {
         
$oldImage ImageCreateFromPNG($originalName);
         return 
TRUE;
     }
     else
     {
         return 
FALSE;
     }
     
     
     
// 11. neue Breite und Höhe berechnen
     
if ($imageWidth >= $imageHeight)
     {
         
$thumbWidth  round($thumbWidth);
         
$thumbHeight round($imageHeight $imageWidth $thumbWidth);

         if (
$thumbHeight $thumbHeight)
         {
             
$thumbWidth  round($thumbWidth $thumbHeight $thumbHeight);
             
$thumbHeight round($thumbHeight);
         }
     }
     else
     {
         
$thumbWidth  round($imageWidth $imageHeight $thumbHeight);
         
$thumbHeight round($thumbHeight);

         if (
$thumbWidth $thumbWidth)
         {
             
$thumbWidth  round($thumbWidth);
             
$thumbHeight round($thumbHeight $thumbWidth $thumbWidth);
         }
     }
     if(
$thumbHeight $imageHeight)
     {
         
$thumbWidth  round($thumbWidth $imageHeight $thumbHeight);
         
$thumbHeight round($imageHeight);
     }
     if(
$thumbWidth $imageWidth)
     {
         
$thumbWidth  round($imageWidth);
         
$thumbHeight round($thumbHeight $thumbWidth $imageWidth);
     }
     
     
     
// 12. Thumbnail mit den neuen Massen erzeugen
     
if(function_exists('ImageCreateTrueColor'))
     {
         
$newImage ImageCreateTrueColor($thumbWidth$thumbHeight);
     }
     else
     {
         
$newImage ImageCreate($thumbWidth$thumbHeight);
     }
     
     
     
// 13. Bild in das neue Format kopieren
     
ImageCopyResampled($newImage$oldImage0000$thumbWidth$thumbHeight$imageWidth$imageHeight);
     
     
     
// 14. neues Bild speichern
     
if($extInfo['extension'] == 'gif')
     {
         
ImageColorTransparent($newImageImageColorAllocate($newImage000));
         
ImageGIF($newImage$oldImage);
         return 
TRUE;
     }
     elseif(
$extInfo['extension'] == 'jpg' || $extInfo['extension'] == 'jpeg')
     {
         
ImageJPEG($newImage$oldImage$imageQuality);
         return 
TRUE;
     }
     elseif(
$extInfo['extension'] == 'png')
     {
         
ImageAlphaBlending($newImageFALSE);
         
ImageSaveAlpha($newImageTRUE);
         
ImagePNG($newImage$oldImage);
         return 
TRUE;
     }
     else
     {
         return 
FALSE;
     }


     echo 
"Aus dem Originalbild <strong>"$originalName ."</strong> mit den Maßen: "$imageWidth ."px * "$imageHeight."px, ";
     echo 
"wird das Vorschaubild <strong>"$newName ."</strong> mit den Maßen: "$thumbWidth ."px * "$thumbHeight."px erzeugt.";


     
// 15. Datenbankeintrag machen
     #mysql_query('INSERT INTO');
     
     
     // 16. Speicher leeren
     
ImageDestroy($oldImage);
     
ImageDestroy($newImage);
 }
 
 
 
ImageResizer('testbild.jpg''Images/''Thumbnails'220220100);

?>
Was mir noch aufgefallen ist, ist dass wenn kein Bild angegeben wurde, das Script auch nicht die Fehlermeldung unter Punkt 5 ausgibt.

Könnt ihr mir auf die Sprünge helfen, was damit im argen ist.
Ich denke mal in ImageCreateTrueColor wird bei Breite und Höhe 0 anstatt des Wertes eingetragen. Wenn es so ist, WISO?
Es wird doch richtig berechnet.


Gruß, Gerrit
Gerrit ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.02.2008, 14:57   Nach oben    #2
Jann Hendrik
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.241
Standard

In Abschnitt 10 hast du ein paar return zu viel drin. Damit erreichst du, dass die Funktion verlassen wird.

Wenn du die mal kommentierst, dann fallen dir auch weitere Fehler auf. Mindestens einer jedenfalls.

In Abschnitt 14 wiederholst du den return-Fehler..

Wenn du dann noch den einen Tippfehler in der Größenberechnung korrigierst, dann funktioniert es auch - zumindest bei mir . Jedenfalls was die Browserausgabe angeht.

Das Skript zickt dann noch an einer anderen Stelle, denn die Grafik wird unter einem - ich sage mal merkwürdigem Namen gespeichert - an falscher Stelle, aber das findest du schon noch! Das ist nur eine falsche Variable. Willst du es selbst finden/suchen? Sonst kann ich dir das auch sagen....


btw: willkommen im Forum!
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!

Geändert von Jann Hendrik (11.02.2008 um 15:05 Uhr).
Jann Hendrik ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.02.2008, 15:08   Nach oben    #3
Jann Hendrik
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.241
Standard

kleiner Nachtrag noch.

Ich habe Teil 1 und 2 mal bei mir auskommentiert, denn ich habe laut phpinfo() folgende Version:
Code:
bundled (2.0.34 compatible)
Damit hätte ich mich selbst rausgeworfen, ob es funktioniert!

Ich denke mal, dass du das machst, weil du sicherstellen möchtest, dass der gif-support gegeben ist.
In den aktuellen gd-Versionen ist das wieder mit drin - also kein Grund user wie mich deshalb auszuschliessen, oder?
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!
Jann Hendrik ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.02.2008, 21:07   Nach oben    #4
Gerrit
Neuer Benutzer
 
Registriert seit: 11.02.2008
Beiträge: 5
Standard

Zitat:
Zitat von Jann Hendrik Beitrag anzeigen
In Abschnitt 10 hast du ein paar return zu viel drin. Damit erreichst du, dass die Funktion verlassen wird.

Wenn du die mal kommentierst, dann fallen dir auch weitere Fehler auf. Mindestens einer jedenfalls.

In Abschnitt 14 wiederholst du den return-Fehler..

Wenn du dann noch den einen Tippfehler in der Größenberechnung korrigierst, dann funktioniert es auch - zumindest bei mir . Jedenfalls was die Browserausgabe angeht.

Das Skript zickt dann noch an einer anderen Stelle, denn die Grafik wird unter einem - ich sage mal merkwürdigem Namen gespeichert - an falscher Stelle, aber das findest du schon noch! Das ist nur eine falsche Variable. Willst du es selbst finden/suchen? Sonst kann ich dir das auch sagen....
hallo Jann Hendrik,

ich habe die returns aus Abschnitt 10 und 14 herausgenommen und er gibt mir das echo am Browser aus.
Die Größenberechnung habe ich nochmal mit der von Dir verglichen, aber einen Tippfehler habe ich nicht entdeckt.
Was die Sache mit dem neuen Dateinamen angeht, wird dieser im Browser richtig angezeigt.
Daher nehme ich Dein Angebot gerne an, bitte sag mir, wo der Wurm drin steckt.

Gruß, Gerrit
Gerrit ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 11.02.2008, 22:54   Nach oben    #5
Jann Hendrik
Projektleiter
 
Benutzerbild von Jann Hendrik
 
Registriert seit: 02.12.2004
Ort: Wildeshausen
Beiträge: 2.241
Standard

Zitat:
Zitat von Gerrit Beitrag anzeigen
Die Größenberechnung habe ich nochmal mit der von Dir verglichen, aber einen Tippfehler habe ich nicht entdeckt.
Merkwürdig - ich kann ihn nun auch nicht mehr finden. Ggf. habe ich ihn selbst beim testen reingehauen

Also - der Fehler, den ich noch meinte mit dem falschen Namen der erzeugten Grafik liegt in Abschnitt 14 versteckt.

Ich zeige dir das mal am Beispiel vom jpeg:

Du hast dort stehen:
Code:
ImageJPEG($newImage, $oldImage, $imageQuality);
Ich denke aber, dass du das hier meinst:
Code:
ImageJPEG($newImage, $newName, $imageQuality);
Denn mit $oldImage übergibst du eine Ressource; aber du willst ja den neuen Namen übergeben, oder?

---

Was mich an dem Skript stört ist die Grafik jedes Mal neu erzeugt wird - das ist echt irre. 10 Mal das gleiche Bild angeschaut ergibt dann 20 Dateien. Ich weiß ja nicht, wie du das letztlich einsetzen willst - aber ggf. solltest du das nochmal überdenken.



Nachtrag.
Da es so scheint, dass du lieber kleine Funktionen hast, hier noch ein Vorschlag:

Um Weite, Höhe und Typ zu erfahren:
PHP-Code:
list($src_width$src_height$src_typ) = GetImageSize($file); 
um die neuen Dimensionen in Abhängigkeit von maximaler Höhe/Breite zu berchnen:
PHP-Code:
list($new_image_width$new_image_height) = CalculateImageNewSize($src_width$src_height$max_x$max_y); 

dazu dann diese Funktion nutzen:
PHP-Code:
function CalculateImageNewSize($src_width$src_height$ThumbnailMaxX$ThumbnailMaxY)
    {
        if (
$src_width >= $src_height)
        {
          
$new_image_height $src_height $src_width $ThumbnailMaxX;
          
$new_image_width  $ThumbnailMaxX;

          if (
$new_image_height $ThumbnailMaxY)
          {
            
$new_image_width  $new_image_width $new_image_height $ThumbnailMaxY;
            
$new_image_height $ThumbnailMaxY;
          }
        }
        else
        {
          
$new_image_width  $src_width $src_height $ThumbnailMaxY;
          
$new_image_height $ThumbnailMaxY;

          if (
$new_image_width $ThumbnailMaxX)
          {
            
$new_image_height $new_image_height $new_image_width $ThumbnailMaxX;
            
$new_image_width  $ThumbnailMaxX;
          }
        }

        
// for the case that the thumbnail would be bigger then the original picture
        
if($new_image_height $src_height)
        {
          
$new_image_width  $new_image_width $src_height/$new_image_height;
          
$new_image_height $src_height;
        }

        if(
$new_image_width $src_width)
        {
          
$new_image_height $new_image_height $new_image_width/$src_width;
          
$new_image_width  $src_width;
        }

        
$newvalues = array();
        
$newvalues[] = $new_image_width;
        
$newvalues[] = $new_image_height;
        return 
$newvalues;
    } 
__________________

Umfragen:
bitte beachten: Vorschläge für künftige Umfragen
Woher weißt du vom developers-guide?

Wenn du dich in ein interessantes Thema eingearbeitet hast, dann lass andere daran teilhaben! Schreibe ein Tutorial und beschreibe, wie es geht, was nicht klappt, wo man aufpassen muss usw.
Danke!

Geändert von Jann Hendrik (11.02.2008 um 23:00 Uhr).
Jann Hendrik ist gerade online  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.02.2008, 15:08   Nach oben    #6
Gerrit
Neuer Benutzer
 
Registriert seit: 11.02.2008
Beiträge: 5
Standard

Hallo Jann Hendrik,

danke, für Deine Hilfe.
Jetzt werden die Bilder da abgelegt, wo sie auch hin sollen.

Ich schildere mal mein Vorhaben.
Vor habe ich, ein Bildupload zu machen, wobei dann die Bilder je nach Vorgabe neu berechnet und auf dem Server in einer vorgegeben Verzeichnisstruktur abgelegt und die Daten in einer Datenbank abgespeichert werden.
Letztendlich soll es eine Bildergalerie werden, die die Bilder in 3 Größen, wenn möglich (hängt vom Originalbild ab) darstellen soll.

Verzeichnisstruktur:
imagegallery
small (196*196),
middle (450*450),
normal (Originalgröße)

Das bedeutet, dass die Abschnitte 3, 4, 5, 8, 9 und 15 mit in das Uploadscript wandern. Richtig?
Zitat:
Zitat von Gerrit Beitrag anzeigen
Nachtrag.
Da es so scheint, dass du lieber kleine Funktionen hast, hier noch ein Vorschlag:
Ehrlich gesagt, dass mit den Funktionen steht bei mir noch unter experimentieren, da ich leider bloß ein Quartalscoder bin. Leider gibt die Zeit nicht mehr her.

Ich habe das Uploadscript geschrieben und das Script für das Erstellen der Thumbnails angepasst.
Und prompt, gibt er mir den Fehler aus, dass er das Bild nicht im Verzeichnis imagegallery/middle speichern kann.
Das Verzeichnis wird aber angelegt und das Bild reinkopiert. Was aber auch quatsch ist, da es 440px * 440px ist.
Wobei das eine Schlüsselfrage ist.
Wenn das Bild nicht denn Maßen der Vorgabe entspricht, soll er mir dies nicht in das Verzeichnis middle und small kopieren, sondern es soll nur in den Spalten der DB der Eintrag erfolgen middle=’no’.


Gruß, Gerrit

Upload.php
PHP-Code:
<form action="<?php $_SERVER['PHP_SELF'?>" method="post" enctype="multipart/form-data">
<?php

 
include_once('Inc/global.func.php');
 include_once(
'Inc/thumbnail.php');


 
// Felder verarbeiten
 
if(isset($_POST['uploadFiles']))
 {
     
$mainImagePath   "imagegallery";                        // Hauptverzeichnis
     
$smallImagePath  "small";                               // Verzeichnis für Vorschaubild (196*196)
     
$middleImagePath "middle";                              // Verzeichnis für Galerieansicht (450*450)
     
$normalImagePath "normal";                              // Verzeichnis für Originalbild (Originalgröße)
     
     
$trueExt = array('gif''jpg''jpeg''png');            // erlaubte Dateierweiterungen


      // 1. superglobals $_FILES auslesen
      
foreach($_FILES as $key => $value)
      {
          
$browserName $_FILES[$key]['name'];
          
$tempName $_FILES[$key]['tmp_name'];
          
// 2. aus Sicherheitsgründen keine '..' erlauben
          
$tempName str_replace('..'''$tempName);

          
// 3. prüfen, ob überhaupt eine Datei übergeben wurde
          
if(empty($browserName))
          {
              
error_message('Bitte geben Sie eine Datei an, die auf dem Server gespeichert werden soll.');
              return 
FALSE;
          }
          
          
// 4. erlaubte Bildformate zur Weiterverarbeitung festlegen
          
$extInfo pathinfo(strtolower($browserName));
          if (!
in_array($extInfo['extension'], $trueExt))
          {
              
error_message('Das Dateiformat <strong>'$extInfo['extension'] .'</strong> ist nicht zulässig, es sind nur Dateien im Format <strong>'implode (", "$trueExt) .'</strong> gestattet.');
              return 
FALSE;
          }
          
          
// 5. neuen Dateinamen festlegen
          
$newName RandomString(12) ."."$extInfo['extension'];

          
// 6. prüfen, ob die Datei upgeloaded wurde
          
if(is_uploaded_file($tempName))
          {
              
// 7. prüfen, ob das Hauptverzeichnis existiert
              
mkPath($mainImagePath0777);
              
              
// 8. prüfen, ob das Verzeichnis für die Originalbilder existiert
              
mkPath($mainImagePath."/".$normalImagePath0777);
              
              
// 9. verschieben der upgeloadeten Datei in das Verzeichnis für Originalbilder
              
if(!move_uploaded_file($tempName$mainImagePath."/".$normalImagePath."/".$newName))
              {
                  
error_message($newName .' im Verzeichnis '$mainImagePath."/".$normalImagePath .' gespeichert werden.');
                  return 
FALSE;
              }
              else
              {
                  
// 10. prüfen, ob das Verzeichnis für die Bilder der Galerieansicht existiert
                  
mkPath($mainImagePath."/".$middleImagePath0777);
                  
// 11. Bild mit neuen Maßen erstellen und im Verzeichnis für die Bilder der Galerieansicht speichern
                  
if(!ImageResizer($mainImagePath."/".$normalImagePath."/".$newName$mainImagePath."/".$middleImagePath."/".$newName450450100))
                  {
                      
error_message('Vorschaubild: '$newName .' kann nicht im Verzeichnis '$mainImagePath."/".$middleImagePath .' gespeichert werden.');
                      return 
FALSE;
                  }
                  
                  
// 12. prüfen, ob das Verzeichnis für die Vorschaubilder existiert
                  
mkPath($mainImagePath."/".$smallImagePath0777);
                  
// 13. Bild mit neuen Maßen erstellen und im Verzeichnis für die Vorschaubilder speichern
                  
if(!ImageResizer($mainImagePath."/".$normalImagePath."/".$newName$mainImagePath."/".$smallImagePath."/".$newName196196100))
                  {
                      
error_message('Vorschaubild: '$newName .' kann nicht im Verzeichnis '$mainImagePath."/".$smallImagePath .' gespeichert werden.');
                      return 
FALSE;
                  }
              }
          }
          else
          {
              
// 14. Fehlermeldung, wenn die Datei aus unergründlicher Ursache nicht verarbeitet werden kann
              
error_message($tempName .' konnte nicht auf dem Server gespeichert werden.');
              return 
FALSE;
          }
          
          
          
// 15. hier soll eine Ergebnistabelle ausgegeben werden, die bei Erfolg ein
          // Vorschaubild + Text, bei Fehler, die entsprechende Fehlermeldung anzeigen soll.
          // Für den Fall, das if(empty($browserName)) sein sollte, soll zusätzlich die Funktion
          // uploadField(); aufgerufen werden, um nochmals die Möglichkeit eines uploads anzubieten.
          
echo "<img src=\""$mainImagePath."/".$smallImagePath."/".$newName ."\" /> "$newName ." wurde erfolgreich auf dem Server gespeichert.";
          
          
          
// 16. Daten in Datenbank eintragen
      
}
 }
 
// Anzahl der Felder bereitstellen
 
elseif(isset($_POST['countFiles']))
 {
     if(
$_POST['anz'] == 1)
     {
         
uploadField($_POST['anz']);
     }
     else
     {
         for(
$i 1$i <= $_POST['anz']; $i++)
         {
             
uploadField($i);
         }
     }
     echo 
"<button type=\"submit\" name=\"uploadFiles\">