 |
11.02.2008, 14:20
| Nach oben
#1 | | Neuer Benutzer
Registriert seit: 11.02.2008
Beiträge: 7
| 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 ."/". $newPath, 0777);
// 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, $oldImage, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $imageWidth, $imageHeight); // 14. neues Bild speichern if($extInfo['extension'] == 'gif') { ImageColorTransparent($newImage, ImageColorAllocate($newImage, 0, 0, 0)); ImageGIF($newImage, $oldImage); return TRUE; } elseif($extInfo['extension'] == 'jpg' || $extInfo['extension'] == 'jpeg') { ImageJPEG($newImage, $oldImage, $imageQuality); return TRUE; } elseif($extInfo['extension'] == 'png') { ImageAlphaBlending($newImage, FALSE); ImageSaveAlpha($newImage, TRUE); 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', 220, 220, 100);
?> 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
|
| |
11.02.2008, 14:57
| Nach oben
#2 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
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!
Geändert von Jann Hendrik (11.02.2008 um 15:05 Uhr).
|
| |
11.02.2008, 15:08
| Nach oben
#3 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
|
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?
|
| |
11.02.2008, 21:07
| Nach oben
#4 | | Neuer Benutzer
Registriert seit: 11.02.2008
Beiträge: 7
| Zitat:
Zitat von Jann Hendrik 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
|
| |
11.02.2008, 22:54
| Nach oben
#5 | | Jann Hendrik Bekaan
Registriert seit: 02.12.2004 Ort: Wildeshausen
Beiträge: 2.213
| Zitat:
Zitat von Gerrit 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;
}
Geändert von Jann Hendrik (11.02.2008 um 23:00 Uhr).
|
| |
12.02.2008, 15:08
| Nach oben
#6 | | Neuer Benutzer
Registriert seit: 11.02.2008
Beiträge: 7
|
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 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($mainImagePath, 0777); // 8. prüfen, ob das Verzeichnis für die Originalbilder existiert mkPath($mainImagePath."/".$normalImagePath, 0777); // 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."/".$middleImagePath, 0777); // 11. Bild mit neuen Maßen erstellen und im Verzeichnis für die Bilder der Galerieansicht speichern if(!ImageResizer($mainImagePath."/".$normalImagePath."/".$newName, $mainImagePath."/".$middleImagePath."/".$newName, 450, 450, 100)) { 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."/".$smallImagePath, 0777); // 13. Bild mit neuen Maßen erstellen und im Verzeichnis für die Vorschaubilder speichern if(!ImageResizer($mainImagePath."/".$normalImagePath."/".$newName, $mainImagePath."/".$smallImagePath."/".$newName, 196, 196, 100)) { 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\"> upload </button>"; echo "</form>\n"; } // als erstes abfragen, wieviele Dateien upgeloaded werden sollen else { echo "<select name=\"anz\">\n"; for($i = 0; $i < 10; $i++) { echo " <option value=\"". ($i+1) ."\">". ($i+1) ."</option>\n"; } echo "</select>\n"; echo "<p><button type=\"submit\" name=\"countFiles\"> Anzahl der Felder </button>\n"; }
?> </form> Thumbnail.php PHP-Code: <?php
// Funktion, zum erstellen von Vorschaubildern function ImageResizer($originalImage = '', $newPath = '', $thumbWidth = 196, $thumbHeight = 196, $imageQuality = 75) { // 1. prüfen, ob eine Datei übergeben wurde if(empty($originalImage)) { error_message('Bitte geben Sie ein Bild an, wovon ein Vorschaubild erstellt werden soll.'); return FALSE; } // 2. prüfen, ob ob ein Verzeichnis angegeben wurde, um das Vorschaubild zu speichern if(empty($newPath)) { error_message('Bitte geben Sie ein Verzeichnis an, worin das Vorschaubild gespeichert werden soll.'); return FALSE; }
// 3. Breite und Höhe des Originalbildes ermitteln list($imageWidth, $imageHeight) = @GetImageSize($originalImage);
// 4. erlaubte Bildformate zur Weiterverarbeitung festlegen $trueExt = array('gif', 'jpg', 'jpeg', 'png'); $extInfo = pathinfo(strtolower($originalImage));
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; }
// 5. erzeugt das neue Bild im jeweiligen Format if($extInfo['extension'] == 'gif') { $oldImage = ImageCreateFromGIF($originalImage); } elseif($extInfo['extension'] == 'jpg' || $extInfo['extension'] == 'jpeg') { $oldImage = ImageCreateFromJPEG($originalImage); } elseif($extInfo['extension'] == 'png') { $oldImage = ImageCreateFromPNG($originalImage); } else { return FALSE; } // 6. 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 = | |