Willkommen in der Webstatt Zum Webstatt Blog und Stories
Sven Sven am 05.04.06 21:07

...die nicht will wie ich. Ich poste erstmal den Code und das Ergebnis :
thumb.php
<?php
header('Content-type: image/jpeg');
$scale = 3;
$size = getimagesize($_GET['image']);
$width = 200;
$height = 200;

$text = explode('/', $_GET['image']);
$text = $text[1];

$src = imagecreatefromjpeg($_GET['image']);
$dest = imagecreatetruecolor($width, $height);
$fcol = imagecolorallocate($dest, 255, 255, 255);
$fcol2 = imagecolorallocate($dest, 0, 0, 0);

imagecopyresized($dest, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagestring($dest, 3, 10, 11, $text, $fcol2);
imagestring($dest, 3, 10, 9, $text, $fcol2);
imagestring($dest, 3, 11, 10, $text, $fcol2);
imagestring($dest, 3, 9, 10, $text, $fcol2);
imagestring($dest, 3, 10, 10, $text, $fcol);
imagejpeg($dest, '', 100);
imagedestroy($dest);
imagedestroy($src);
?>


imagemanager.php
<?php
$verzeichnis = dir('events');
$i = '0';

while($bild = $verzeichnis->read()) {
if(eregi('.jpg$', $bild) OR eregi('.jpeg$', $bild)) {
echo '<a href="events/' . $bild . '">';
echo '<img src="thumb.php?image=events/'. $bild . '" alt="' . $bild . '" title="' . $bild .'" border="0"></a> ';

if($i % 2) {
echo "<br />\n";
}

$i++;
}
}
?>


Ergebnis : http://mmsky.de/imagemanager.php

Ironischer Weise funktioniert das ganze lokal ganz gut.
Hier noch phpinfo(); vom Server :
http://mmsky.de/info.php

netcup.de Warum gibt es hier Werbung?
Franky Franky am 05.04.06 22:44

Ich glaube das es an zu großen Bildern liegt. Weis PHP mal mehr Speicher zu (z.B. von 8M auf 16M) und teste es noch einmal ;)

Sven Sven am 05.04.06 23:13

Kann ich das per Ini-Set temporär vornehmen? Weil ich habe keinen Zugriff auf die php.ini

milahu milahu am 06.04.06 15:59

Die Thumbs solltest du nicht dynamisch erzeugen. Lieber im selben Verzeichnix ablegen wie das Bild und wenn zu einem Bild noch keins generiert wurde, dann musst du das eben nachholen.
Spart auf jeden Fall Serverlast und Aufbauzeit.

Sven Sven am 08.04.06 19:48

Langsam verliere ich den Glauben daran :/
Jetzt hab ich das ganze umgemodelt, jetzt klappts aber gar nicht mehr, auch nicht mit einem Bild :

<?php
function thumb($image, $folder = 'thumbs', $width = '200', $height = '200') {
$size = getimagesize('events/' . $image);
$width = 200;
$height = 200;

$text = explode('/', $image);
$text = $text[1];

$src = imagecreatefromjpeg('events/' . $image);
$dest = imagecreatetruecolor($width, $height);
$fcol = imagecolorallocate($dest, 255, 255, 255);
$fcol2 = imagecolorallocate($dest, 0, 0, 0);

imagecopyresized($dest, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagestring($dest, 3, 10, 11, $text, $fcol2);
imagestring($dest, 3, 10, 9, $text, $fcol2);
imagestring($dest, 3, 11, 10, $text, $fcol2);
imagestring($dest, 3, 9, 10, $text, $fcol2);
imagestring($dest, 3, 10, 10, $text, $fcol);
imagejpeg($dest, $folder, 100);
imagedestroy($dest);
imagedestroy($src);

return TRUE;
}

function rename_image($image) {
$bild2 = $image;
$bild2 = str_replace('ä', 'ae', $bild2);
$bild2 = str_replace('ü', 'ue', $bild2);
$bild2 = str_replace('ö', 'oe', $bild2);
$bild2 = str_replace('Ä', 'Ae', $bild2);
$bild2 = str_replace('Ü', 'Ue', $bild2);
$bild2 = str_replace('Ö', 'Oe', $bild2);
$bild2 = str_replace(' ', '_', $bild2);

if($image != $bild2) {
rename('events/' . $image, 'events/' . $bild2);
return $bild2;
} else {
return $image;
}
}
?>


<?php
$verzeichnis = dir('events');
include('functions.php');

while($bild = $verzeichnis->read()) {
if(eregi('.jpg$', $bild) OR eregi('.jpeg$', $bild)) {
echo "Alt : $bild <br />\n";

$n_bild = rename_image($bild);
echo "Neu : $n_bild <br />\n";

if(!file_exists('thumbs/' . $n_bild)) {
thumb($n_bild);
echo "Thumb erstellt<br /><br />\n\n";
} else {
echo "Thumb existiert bereits<br /><br />\n\n";
}
}
}
?>


Das zieht jetzt noch mehr als zuvor :
Fatal error: Allowed memory size of 12582912 bytes exhausted (tried to allocate 8192 bytes) in /var/www/l3s8506/html/functions.php on line 86

milahu milahu am 08.04.06 20:20

Dein Skript frisst zu viel Arbeitsspeicher. :\

Du könntest versuchen, imagedestroy($src);schon nach Zeile 15 aufzurufen.

Mit der Funktion memory_get_usage() kannst du noch bei jedem Thumb generieren die Auslastung prüfen.
Wäre mal interessant zu sehen, wie gut der garbage collector in PHP arbeitet :)

Sven Sven am 08.04.06 20:45

http://mmsky.de/thumb.php
Kommt nicht weit :/

<?php
function thumb($image, $folder = 'thumbs', $width = '200', $height = '200') {
$size = getimagesize('events/' . $image);

$text = explode('/', $image);
$text = $text[1];

$src = imagecreatefromjpeg('events/' . $image);
$dest = imagecreatetruecolor($width, $height);
$fcol = imagecolorallocate($dest, 255, 255, 255);
$fcol2 = imagecolorallocate($dest, 0, 0, 0);

imagecopyresized($dest, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
imagedestroy($src);
imagestring($dest, 3, 10, 11, $text, $fcol2);
imagestring($dest, 3, 10, 9, $text, $fcol2);
imagestring($dest, 3, 11, 10, $text, $fcol2);
imagestring($dest, 3, 9, 10, $text, $fcol2);
imagestring($dest, 3, 10, 10, $text, $fcol);
imagejpeg($dest, $folder, 100);
imagedestroy($dest);

return TRUE;
}

function rename_image($image) {
$bild2 = $image;
$bild2 = str_replace('ä', 'ae', $bild2);
$bild2 = str_replace('ü', 'ue', $bild2);
$bild2 = str_replace('ö', 'oe', $bild2);
$bild2 = str_replace('Ä', 'Ae', $bild2);
$bild2 = str_replace('Ü', 'Ue', $bild2);
$bild2 = str_replace('Ö', 'Oe', $bild2);
$bild2 = str_replace(' ', '_', $bild2);

if($image != $bild2) {
rename('events/' . $image, 'events/' . $bild2);
return $bild2;
} else {
return $image;
}
}
?>


<?php
$verzeichnis = dir('events');
include('functions.php');

while($bild = $verzeichnis->read()) {
if(eregi('.jpg$', $bild) OR eregi('.jpeg$', $bild)) {
echo "Alt : $bild <br />\n";

$n_bild = rename_image($bild);
echo "Neu : $n_bild <br />\n";
echo "Bytes nach Rename : " . memory_get_usage() . "<br \>\n";

if(!file_exists('thumbs/' . $n_bild)) {
thumb($n_bild);
echo "Thumb erstellt<br /><br />\n\n";
} else {
echo "Thumb existiert bereits<br />\n";
}
echo "Bytes nach Thumb : " . memory_get_usage() . "<br /><br />\n\n";
}
}
?>

milahu milahu am 08.04.06 21:12

Mach auch mal ein paar Ausgaben innerhalb der Funktion thumb.
Die Dateigröße vom Quellbild wäre auch noch interessant, schließlich stehen dir 12MB zur Verfügung..

Sven Sven am 08.04.06 21:19

Habe ich ausprobiert, aber ich komm gar nicht erst rein. Der Fehler zischt gleich alle Ausgaben weg. Die 3 Testbilder die ich hochgeladen habe :
Rüsselsheim Opel 3.jpg - 1,31MB
Rüsselsheim Opel .jpg - 266KB
Rüsselsheim Opel Fest der Jubiläre.jpg - 287KB
Sagt zumindest mein Explorer etc.

milahu milahu am 08.04.06 23:43

Bei welcher Funktion tritt der Fehler denn auf? imagecopyresized() ?

Sven Sven am 09.04.06 00:12

<?php
function thumb($image, $folder = 'thumbs', $width = '200', $height = '200') {
$size = getimagesize('events/' . $image);
echo 'getimagesize() : ' . memory_get_usage() . "<br />\n";

$text = explode('/', $image);
echo 'explode() : ' . memory_get_usage() . "<br />\n";

$text = $text[1];

$src = imagecreatefromjpeg('events/' . $image);
echo 'imagecreatefromjpeg() : ' . memory_get_usage() . "<br />\n";

$dest = imagecreatetruecolor($width, $height);
echo 'imagecreatetruecolor() : ' . memory_get_usage() . "<br />\n";

$fcol = imagecolorallocate($dest, 255, 255, 255);
echo 'imagecolorallocate() 1 : ' . memory_get_usage() . "<br />\n";

$fcol2 = imagecolorallocate($dest, 0, 0, 0);
echo 'imagecolorallocate() 2 : ' . memory_get_usage() . "<br />\n";


imagecopyresized($dest, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
echo 'imagecopyresized() : ' . memory_get_usage() . "<br />\n";

imagedestroy($src);
echo 'imagedestroy() 1 : ' . memory_get_usage() . "<br />\n";

imagestring($dest, 3, 10, 11, $text, $fcol2);
echo 'imagestring() 1 : ' . memory_get_usage() . "<br />\n";

imagestring($dest, 3, 10, 9, $text, $fcol2);
echo 'imagestring() 2 : ' . memory_get_usage() . "<br />\n";

imagestring($dest, 3, 11, 10, $text, $fcol2);
echo 'imagestring() 3 : ' . memory_get_usage() . "<br />\n";

imagestring($dest, 3, 9, 10, $text, $fcol2);
echo 'imagestring() 4 : ' . memory_get_usage() . "<br />\n";

imagestring($dest, 3, 10, 10, $text, $fcol);
echo 'imagestring() 4 : ' . memory_get_usage() . "<br />\n";

imagejpeg($dest, $folder, 100);
echo 'imagejpeg() : ' . memory_get_usage() . "<br />\n";

imagedestroy($dest);
echo 'imagedestroy() 2 : ' . memory_get_usage() . "<br />\n";

return TRUE;
}
?>


Laut dem hier ganz oben bei imagecreatefromjpeg.
http://www.mmsky.de/thumb.php

Franky Franky am 09.04.06 01:39

wenn GARNIX geht, thumbs auf einem entfernten hoster generieren und dann via file_get_contents holen ;)

milahu milahu am 09.04.06 09:11

Das muss ein Bug von PHP sein, denn 52kB + 8kB sind nie und nimmer 12MB... Also entweder holst du dir die neueste Version von PHP oder wenn das schon die neueste ist, schau mal bei den Mailinglisten von PHP.net vorbei.

Sven Sven am 09.04.06 12:23

Wäähhh :( http://beatboxscene.de/mmsky/thumb.php
Selbes Ergebnis. Hier grad mal die phpinfo()´s von den beiden Servern :
http://beatboxscene.de/info.php
http://mmsky.de/info.php

Ich hab da mal was gelesen, das die GDLib die Bilder unkomprimiert verarbeitet.
Kann es daran liegen, das dann die Bildgröße enorm ansteigt?

Franky Franky am 26.05.06 20:08

Sorry das ich den Thread nochmal nach oben hole, aber habe gerade etwas recht interessantes gefunden: http://www.cix88.de/projekte/laberbrett/?RID=20060128130914

Ist sicher für den einen oder anderen recht hilfreich :)

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt