Problem mit erstellen eines Thumbnails

Alles, was PHP betrifft, kann hier besprochen werden.

Problem mit erstellen eines Thumbnails

Postby Knight1 » 30. September 2006 12:35

Hi Com,
ich bin zur Zeit dran mir ein Fotoablum zu Coden.
Dabei möchte ich auch Thumbnails erstellen da ich nicht jedesmal die großen Dateien mitschicken will. Ist denek ich mal verständlich, die Grafiken sidn ja teilweise über 1,5MB groß. :shock:

Nun habe ich mir da ein PHP-Script ausgedacht.
Das Problem ist aber dass die erstellte Thumbnail-Grafik Schwarz bleibt.

Code: Select all
$bilder_query = mysql_query("SELECT * FROM ".MYSQL_TABLE_BILDER." WHERE id = '{$_GET['img_id']}'");
$bilder = mysql_fetch_array($bilder_query);

$file_name = "file_tmp/{$bilder['film_name']}_large_{$bilder['filename']}";

header("Content-type: {$bilder['mime']}");
header("Content-Disposition: attachment; filename={$bilder['film_name']}_{$bilder['filename']}");
$tmp_file = fopen($file_name,'w+b');
fwrite ($tmp_file,$bilder['img_file']);
fclose($tmp_file);
chmod($file_name,0777);

$img_size = getimagesize($file_name);

imagecopyresized(
imagejpeg(imagecreate(bcdiv($img_size[0],16),bcdiv($img_size[1],16))), #Ziel-Bild (Direckte Ausgabe an den Browser)
$file_name, #Quell-Bild
0, #Start (X) im Ziel-Bild
0, #Start (Y) im Ziel-Bild
0, #Start (X) im Quell-Bild
0, #Start (Y) im Quell-Bild
bcdiv($img_size[0],16), #Breite im Ziel-Bild
bcdiv($img_size[1],16), #Höhe im Ziel-Bild
$img_size[0], #Breite im Quell-Bild
$img_size[1] #Höhe im Quell-Bild
);


Die Temporäre Grafik wird Ordnungsgemäß mit den Daten aus der Datenbank im richtigen Verzeichniss erstellt.

Zum "Debuggen" habe ich grundsätzlich in jeder Datei ganz am Anfang "error_reporting(E_ALL);" stehen.
Meldungen, egal welcher art, werden keine Ausgegeben.

Bitte teilt mir mit wo ich da einen Fehler/etwas vergessen/übersehen habe. Vielleicht sehe ich ja vor lauter Bäumen den Wald nicht.
Ist auch das erste mal dass ich mit der GD-Bibliothek arbeite.

Habe das aktuelle XAMPP für Linux auf einer Suse 9.1 Maschine am laufen.


Danke schin mal im vorraus.


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64

Postby Wiedmann » 30. September 2006 14:07

Also ungetestet würde ich das so machen:
Code: Select all
<?php
if (empty($_GET['img_id'])) {
    header('HTTP/1.0 404 Not Found');
    exit;
}

$sql = '
    SELECT `film_name`, `filename`, `mime`, `img_file`
    FROM `'.MYSQL_TABLE_BILDER.'`
    WHERE `id` = '.intval($_GET['img_id']).'
    LIMIT 1
';
$query = mysql_query($sql) or die(mysql_error());
if (1 !== mysql_num_rows($query)) {
    header('HTTP/1.0 404 Not Found');
    exit;
}
$result = mysql_fetch_array($query);

$src_image = imagecreatefromstring($result['img_file']);

$src_width = imagesx($src_image);
$src_height = imagesy($src_image);
$thumb_width = imagesx($src_image) / 16;
$thumb_height = imagesy($src_image) / 16;

$thumb_image = imagecreatetruecolor($thumb_width, $thumb_height);
imagecopyresampled($thumb_image, $src_image, 0, 0, 0, 0, $thumb_width, $thumb_height, $src_width, $src_height);

header("Content-Type: {$result['mime']}");
header("Content-Disposition: inline; filename={$result['film_name']}_{$result['filename']}");

if (false !== strpos($result['mime'], 'gif')) {
    imagegif($thumb_image);
} elseif (false !== strpos($result['mime'], 'png')) {
    imagepng($thumb_image);
} else {
    imagejpeg($thumb_image);
}
exit;
?>
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby Knight1 » 30. September 2006 18:36

Irgendwie habe ich ein Problem mit dem aufmerksamen durchlesen eines Manuals.
Wenn ich das getan hätte, dann hätte ich sicher auch das "imagecreatefromstring" gefunden.

Du bist einfach nur genial Wiedmann.
Dein "Beispiel" hat beim erstenmal funktioniert. (Keine Angst; Ich verstehe auch was das Script macht)

Eine Frage habe ich da aber noch (ist wahrscheinlich mehr eine MySQL-Frage).
Wie kann ich das ganze beschleunigen?
Die Tabelle mit den Bildern ist jetzt schon über 80MB groß ist.
Gibt es da vielleicht eine Konfigurationseinstellung die ich anpassen kann/muss?

Die EInstellunegn für den Server sind Standard bis auf folgende Einstellungen:
my.cnf
max_allowed_packet = 3M (Standard 1M)

php.ini
memory_limit = 96M (Standard 8M)
post_max_size = 8M (Standard 2M)

Das habe ich so eingetsellt dass ich auch Grafikdateien von 1,5MB und mehr reinstellen kann.
Das Script soll auf keinem Webspace laufen können, nur bei mir Privat, von daher ist es nicht so tragisch wenn ich die Settings verändere.

Die Speicherengine ist vom Typ MyISAM.

Danke schon im vorraus für Tipps


Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64


Return to PHP

Who is online

Users browsing this forum: No registered users and 20 guests