Forum
Tipps
News
Menu-Icon

[PHP] Thumbnail automatisch erstellen // bessere Qualität?

Hallo, hoffentlich nerv ich noch net oder so  ;D

nächstes Problem: Ich hab ein Php-Script (teils selbst erstellt, teils kopiert), das mir von einem hochgeladenen Bild ein Thumbnail in einer bestimmten Größe, Format JPEG generiert. Nur irgendwie lässt die Qualität sehr zu wünschen übrig, es sind seltsamerweise weniger Farben enthalten, als im Orginal. Hier mein Code


<?php    error_reporting(E_ALL);    include "config.php";    @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());    mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());    if($_FILES[&#39;uploaddata&#39;][&#39;type&#39;] != "image/jpeg") {	die("Das Bild ist nicht im JPEG-Format und kann demnach nicht verwendet werden.");    }    $sql = "SELECT                ID,                picture_original,                picture_thumbnail,		title            FROM                gallery            ORDER BY                ID ASC";    $result = mysql_query($sql) OR die(mysql_error());    $save_original = "C:/Program Files/xampp/htdocs/upload/uploads/picture_original/";    $save_thumbnail = "C:/Program Files/xampp/htdocs/upload/uploads/picture_thumbnail/";    $name = "IMG_";    $number = mysql_num_rows($result) + 1;    $type = ".jpg";    move_uploaded_file($_FILES[&#39;uploaddata&#39;][&#39;tmp_name&#39;], $save_original.$name.$number.$type);    $size=GetImageSize($save_original.$name.$number.$type);    $old=ImageCreateFromJPEG($save_original.$name.$number.$type);    $new=ImageCreate(140,105);    ImageCopyResized($new,$old,0,0,0,0,140,105,$size[0],$size[1]);    ImageJPEG($new,$save_thumbnail.$name.$number.$type);    ImageDestroy($old);    ImageDestroy($new);    echo "<h4>Hochgeladene Datei:</h4>	    ".$_FILES[&#39;uploaddata&#39;][&#39;name&#39;]."<br>	    ".$save_original.$name.$number.$type."<br>	    ".$_FILES[&#39;uploaddata&#39;][&#39;type&#39;]."<br>	    ".$_FILES[&#39;uploaddata&#39;][&#39;size&#39;]."<br>	";?>




Hoffe ihr könnt mir sagen woran es liegt, und evtl  ;) den code verbessern. Thx schonmal, Guuul.

Antworten zu [PHP] Thumbnail automatisch erstellen // bessere Qualität?:

Moin |

Einfach mal im Manual schauen, was die einzelnen Anweisungen so zu bedeuten haben! ;)

Da offenbart sich z.B., dass die Funktion ImageJPEG() einen dritten, optionalen Parameter unterstützt, der die Qualität regelt. Dort einfach mal einen Wert so um die 80 oder aufwärts einsetzen (max. 100), dann wird die Qualität sehr gut.

Weiterhin würde ich imagecopyresized() durch imagecopyresampled() ersetzen, weil du sonst bei Größenberechnungen eine saumäßige Qualität hast (exakt vergleichbar mit einem Resizing, dass in HTML durch width und height erzwungen wird).

greez 8)
JoSsiF

Sry, das Manual ist mir bis jetzt noch nicht so vertraut gewesen, daher dachte ich, hier einfach mal zu fragen  ;)

Also ich hab das jetzt so ausprobiert wie du es mir beschrieben hast, allerdingss seh ichda keinen wirklichen Unterschied  ???

Mein Code sieht jetzt so aus:


<?php    error_reporting(E_ALL);    include "config.php";    @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());    mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());    if($_FILES[&#39;uploaddata&#39;][&#39;type&#39;] != "image/jpeg") {	die("Das Bild ist nicht im JPEG-Format und kann demnach nicht verwendet werden.");    }    $sql = "SELECT                ID,                picture_original,                picture_thumbnail,		title            FROM                gallery            ORDER BY                ID ASC";    $result = mysql_query($sql) OR die(mysql_error());    $save_original = "C:/Program Files/xampp/htdocs/upload/uploads/picture_original/";    $save_thumbnail = "C:/Program Files/xampp/htdocs/upload/uploads/picture_thumbnail/";    $name = "IMG_";    $number = mysql_num_rows($result) + 1;    $type = ".jpg";    move_uploaded_file($_FILES[&#39;uploaddata&#39;][&#39;tmp_name&#39;], $save_original.$name.$number.$type);    $size=GetImageSize($save_original.$name.$number.$type);    $old=ImageCreateFromJPEG($save_original.$name.$number.$type);    $new=ImageCreate(140,105);    imagecopyresampled($new,$old,0,0,0,0,140,105,$size[0],$size[1]);    ImageJPEG($new, $save_thumbnail.$name.$number.$type, 100);    ImageDestroy($old);    ImageDestroy($new);    echo "<h4>Hochgeladene Datei:</h4>	    ".$_FILES[&#39;uploaddata&#39;][&#39;name&#39;]."<br>	    ".$save_original.$name.$number.$type."<br>	    ".$_FILES[&#39;uploaddata&#39;][&#39;type&#39;]."<br>	    ".$_FILES[&#39;uploaddata&#39;][&#39;size&#39;]."<br>	";?>



Woran liegt das?

// edit:

Ich hab jetzt doch das Manual zu Rate gezogen und jetzt gehts, ich musste noch  ImageCreate durch ImageCreateTrueColor ersetzen.

Dankeschön dir :)
« Letzte Änderung: 03.10.06, 12:51:47 von Guuul »

Ersetze mal imagecreate() durch imagecreatetruecolor(). Das sollte bessere Resultate bringen ;)

Jop, hat geklappt, wie ich dir auch schon wenige Zeilen über deinem Post geschrieben hatte  ;D

Aber wenn du schonmal da bist, wie kann ich, wenn ich in eine Tabbellenspalte (MySQL) genau die Zahl einfügen, die sie auch in der ID (auto increment) erhält? zB. füge ich einen neuen Eintrag in die Tabelle ein, und in eine Spalte soll dann genau die Nummer stehen, die der neue Eintrag auch als ID erhalten hat. Sinn davon ist ja jetzt erstmal egal, nur, wie geht das?

// edit:

das soll funktionieren, ohne die spalte auch auf auto increment zu stellen!

« Letzte Änderung: 03.10.06, 13:36:05 von Guuul »

Speichern & wieder auslesen ;)

Geht's um Foreign Keys?

Foreign Keys? Ka was das ist, eigentlich will ich ein Bildergalleriescrpit machen, und dann die Bilder der Reihe nach durchnummerieren. Die Nummer der ID soll dann immer auch hinter dem Bildnamen stehen (zB. IMG_214.jpg). Des weiteren wird dann der Link für das Orginalbild und für das Thumbnail in die Tabelle gespeichert und dann wie bei nem Gästebuch mit ner while Schleife ausgelesen.

oder ist das so ungeschickt gelöst?  ???
irgendwie bin ich net so der konventionelle Typ, hab ich das gefühl  :D

Ich finde es etwas umständlich, das zusätzlich in eine Datenbank zu schreiben. Das ist sicher sinnvoll, wenn du Kommentare zu den Bildern oder ähnliche Sachen speichern willst, aber für die Bilder an sich isses unnötig.

Wie wär's, wenn du einfach die Verzeichnisse ausliest, in denen die Bilder liegen. Und für jede Galerie machst du ein Verzeichnis mit den Thumbnails beispielsweise in einem Unterordner.

greez 8)
JoSsiF

Joa, so wärs schon einfacher, aber ich will ja zu jedem Bild nen Titel schreiben können...

OK, dann isses gerechtfertigt ;)

Aber lass' doch einfach die ID als eindeutigen Identifier stehen, und trage den Bildpfad in eine extra Spalte ein. Ergibt zwar ein wenig Redundanz, lässt sich aber viel besser handhaben.

greez 8)
JoSsiF

ok, so werd ichs machen, vielen dank und so  ;)

mhh...eine frage hätt ich dann doch noch  ;D

wie kann ich es hinbekommen, dass immer 3 Bilder nebeneinander angezeigt werden und dann ein <br> folgt? Die Bilder werden ja über eine while schleife angezeigt, daher hab ich irgendwie keine ahnung wies gehen soll  :'(

//edit: vielleicht hilft mein code:


<?php    error_reporting(E_ALL);    include "config.php";    @mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR die(mysql_error());    mysql_select_db(MYSQL_DATABASE) OR die(mysql_error());    $sql = "SELECT                ID,                picture_original,                picture_thumbnail,		datetime            FROM                gallery            ORDER BY                ID ASC";    $result = mysql_query($sql) OR die(mysql_error());    echo "<!DOCTYPE [url=http://www.computerhilfen.de/fachbegriffe-h-HTML.html][b]html [/b][/url] PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"   \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html><head>  <title>Bildergallerie</title></head><body><h3>~ Bildergallerie (".mysql_num_rows($result)." Bilder vorhanden) ~</h3>	";    if(!mysql_num_rows($result)) {    die("Es sind keine Bilder vorhanden.");    }    while($row = mysql_fetch_assoc($result)) {    echo "<a href=\"".$row[&#39;picture_original&#39;]."\" target=\"_BLANK\"style=\"margin-right: 0px; margin-bottom: 0px\" ><img src=\"".$row[&#39;picture_thumbnail&#39;]."\" style=\"margin-right: 10px; margin-bottom: 5px; border: 1px solid black\" alt=\"\" onmouseover=\"style.borderColor=&#39;#fb6&#39;\" onmouseout=\"style.borderColor=&#39;black&#39;\" /></a>";    }    echo "</body></html>	";?>


Sicher die einfachste Lösung: einfach einen Counter mitzählen lassen und nach 3 Schritten den Break setzen sowie Counter auf null setzen. Müsste mit 3 Codezeilen zu machen sein ;)

greez 8)
JoSsiF

Argl, da hätt ich jetzt auch selbst drauf kommen können  ;D danke jedenfalls, manchmal steh ich aufm schlauch.. ():-)


« AjaxPHP? »
 

Fremdwörter? Erklärungen im Lexikon!
Bildpunkte
Bilder, die von einem Monitor wiedergegeben werden, bestehen aus einzelnen Bildpunkten (Pixeln). Je höher die Pixelanzahl ist, desto genauer und besser kann das Bild...

Bildschirmschoner
Der eigentliche Sinn des Bildschirmschoners ist, den Bildschirm vor dem Einbrennen des Monitorbildes zu schützen.Während das bei neueren Monitoren (außer ...

Bildwiederholfrequenz
Auf Bildschirmen erscheint ein Bild nur Bruchteile von Sekunden, weil die es erzeugenden Elektronenstrahlen oder Impulse sehr kurzzeitig wirken. Deshalb wird es mit einer...


Falschen Browser-Tab geschlossen? Kein Problem mit diesem Shortcut!

SD Karte: Daten Retten und Fotos wiederherstellen