PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : thumbnails mit php erstellen



pogo
23.08.2004, 00:41
'tach zusammen,

ich möchte diesen code (hab ich aus nem tut)


$size = GetImageSize (\"bild1.jpg\"); // Bild einlesen
$imagewidth = $size[0]; // Breite auslesen
$imageheight = $size[1]; // Höhe auslesen
$maxwidth = \"640\";
if ($imagewidth > $maxwidth)
{
$imageprop=$maxwidth/$imagewidth;
$imagevsize= $imageheight*$imageprop;
$imagewidth=$maxwidth;
$imageheight=ceil($imagevsize);
}

gern auf einen ganzen ordner mit fotos anwenden und wenn möglich dann auch noch unter einem anderen namen abspeichern. ich brauch das für thumbnails einer gallerie, bis jetzt hab ich die fotos immer von hand verkleinert... (was seeeehr langweilig werden kann)

also, ich weiß nich ob das mit php möglich ist, da ich erst dabei bin, das zu lernen. vielen dank schonmal für eure antworten!

wrtlprnft
23.08.2004, 02:00
Ich weiß nicht, was du genau willst, aber versuchs doch mal mit diesem Code:
//Verzeichnis durchsuchen und filtern
$h = opendir('.');
while ($file = readdir($h))
{
$img = false;
if (eregi('\.png$', $file))
$img = @ImageCreateFromPNG($file);
elseif (eregi('\.jpe\\?g$', $file))
$img = @ImageCreateFromJPEG($file);
if ($img)
{
$alt_breite = imagesx($img);
$alt_hoehe = imagesy($img);
$neu_breite = 640; //Durch die Breite ersetzen
$neu_hoehe = round(($alt_hoehe / $alt_breite) * 100);
$thumb = imagecreate($neu_breite, $neu_hoehe);
imagecopyresized($thumb, $img, 0, 0, 0, 0, $neu_breite, $neu_hoehe, $alt_breite, $alt_hoehe);
imagePNG($img, 'thumb-' . $file);
}Verkleinert alle Bilder im Verzeichnis.

pogo
24.08.2004, 01:25
ich glaub das is genau das was ich suche. aber leider funktioniert es nicht. es gitb aber auch keine fehlermeldung....:confused:

ich habe einfach das script in den ordner mit den fotos gepackt und dann im browser die url zur datei eingegeben. es erscheint (wie nicht anders zu erwarten) ein weißer bildschrim. aber wenn ich dann in den ordner mit den fotos guck sind da nur die alten, so groß wie vorher.

das müsste die doch als neue dateien (namethumb.JPG) abspeichern? oder nur als PNGs?

P.S.: die while-schleife hab ich geschlossen ;)

wrtlprnft
24.08.2004, 01:46
<?php
//Verzeichnis durchsuchen und filtern
$h = opendir('.');
while ($file = readdir($h))
{
$img = false;
$png = false;
$img = false;
if (eregi('.png$', $file))
{
$img = ImageCreateFromPNG($file);
$png = true;
$im = true;
}
elseif (eregi('.jpg', $file))
{
$img = ImageCreateFromJPEG($file);
$im = true;
}
if ($im)
{
print('Wandle ' . $file . ' um.<br />');
$alt_breite = imagesx($img);
$alt_hoehe = imagesy($img);
$neu_breite = 640; //Durch die Breite ersetzen
$neu_hoehe = round(($alt_hoehe / $alt_breite) * 100);
$thumb = imagecreate($neu_breite, $neu_hoehe);
imagecopyresized($thumb, $img, 0, 0, 0, 0, $neu_breite, $neu_hoehe, $alt_breite, $alt_hoehe);
if ($png)
imagePNG($img, 'thumb-' . $file);
else
imageJPEG($img, 'thumb-' . $file);
imagedestroy($img);
$img = false;
}
}
?>Jetzt gehts auch mit jpg.
Ähm... und du musst den Ordner für PHP schreibbar machen.

pogo
24.08.2004, 02:02
Ähm...wie mach ich das? schreibbar machen? direkt im ftp uploader oder webftp oder ist es komplizierter?

wrtlprnft
24.08.2004, 02:08
irgentwo in den Eigenschaften vom Ordner (in jedem vernünftigen ftp-programm).
oder ssh->chmod 777 deinordner/

pogo
25.08.2004, 23:56
joa, danke erstmal für deine hilfe!

ich hab jetzt in meinem ftp programm die einstellungen für attribute gefunden und kann da so sachen wie "Anwender: 4 lesen, 2 schreiben, 1 ausführen" auswählen, jedoch kommt die meldung "Attrbitue konnten nicht geändert werden" wenn ich auf übernehmen klicke...

liegt das an den serversettings, die ich nich beeinflussen kann oder hab ich irgendwas falsch gemacht?

wrtlprnft
26.08.2004, 00:02
ruf mal in einer PHP-Datei die Funktion phpinfo() auf, vielleicht hast du einen Windoof-Server, dann ist dir nicht zu helfen.

pogo
26.08.2004, 02:58
Debian GNU/Linux - Bi PIII 1Ghz - 1 Gb RAM - Kernel 2.4.x

sieht nich grad nach windoof aus...

wrtlprnft
26.08.2004, 04:21
Was hast du denn für einen Provider? Ich glaubs zwar nicht, aber er könnte es abgestellt haben.

Ansonsten versuch mal ein anderes ftp-Programm, die gibts ja wie Sand am Meer. Ansonsten würd ich mal nach den Grundbefehlen des ftp-Protokolls suchen und eine telnet-Sitzung anfangen.

pogo
26.08.2004, 23:51
lycos und der support schreibt "evtl. sind ihre wünsche nicht mit unseren Servereinstellungen kompatibel"

ich guck ma ob ich da noch was machen kann, ansonsten werd ich was anderes probiern. ich mach dafür n neuen thread auf, weil das eigentlich nich mehr hier reinpasst

so, dank nochmal :D

pogo
27.08.2004, 03:46
tut mir leid das ich dich schon wieder nerven muss, aber folgendes:

hab jetz mal mit xampp nen eigenen webserver aufgemacht und das script da ausprobiert. es kamen neben dem "wandle xxx um" folgende meldungen:


Warning: imagesx(): supplied argument is not a valid Image resource in H:\Programme\xampp\htdocs\Griechenland2004\verkleinern.php on line 23

Warning: imagesy(): supplied argument is not a valid Image resource in H:\Programme\xampp\htdocs\Griechenland2004\verkleinern.php on line 24

Warning: Division by zero in H:\Programme\xampp\htdocs\Griechenland2004\verkleinern.php on line 26

Warning: imagecreate() [function.imagecreate]: Invalid image dimensions in H:\Programme\xampp\htdocs\Griechenland2004\verkleinern.php on line 27

Warning: imagecopyresized(): supplied argument is not a valid Image resource in H:\Programme\xampp\htdocs\Griechenland2004\verkleinern.php on line 28

Warning: imagejpeg(): supplied argument is not a valid Image resource in H:\Programme\xampp\htdocs\Griechenland2004\verkleinern.php on line 32

Warning: imagedestroy(): supplied argument is not a valid Image resource in H:\Programme\xampp\htdocs\Griechenland2004\verkleinern.php on line 33

und das komischste ist: es wurde eine kopie der bilder angelegt, die zwar die gleichen maße haben (1024*1536) aber deren größe von 1200 kb auf 200 kb geschrumpft ist. da kann doch irgendwas nicht stimmen :confused:
außerde möchte ich die alten bilder ja nich löschen...

wrtlprnft
27.08.2004, 03:56
Da bin ich überfragt...
Das Bild existiert doch, sonst hätte ja schon createimagefromjpeg() eine Meldung ausgespuckt...

Und vor allem: Exakt der gleiche Code funzt bei mir anstandslos...

Hirvine
02.09.2004, 20:05
wrtlprnft es siehst aus das du wirklich viel weiB, aber ich habe deinen script gebraucht und etwas geändert (weil es nicht funktioneerde). Aber nun "resized" es nicht mehr, meinen bild wird nicht kleiner, wie kommt das?


<?php
$path="test/this.png";
$thumbname="this.png";
$img=@imagecreatefrompng($path);
//---new
$afmetingen=getimagesize($path);
$oude_breedte=$afmetingen[0];
$oude_hoogte=$afmetingen[1];
print($afmetingen[0]." ".$afmetingen[1]);
if($oude_breedte>$oude_hoogte) {
$nieuwe_breedte=100; //Nieuwe breedte zetten
$nieuwe_hoogte_ratio=round(($nieuwe_breedte / $oude_breedte)*100); //neemt een ratio aan
$nieuwe_hoogte=round($oude_hoogte*($nieuwe_hoogte_ratio/100));
}else{
$nieuwe_hoogte=100; //Nieuwe hoogte zetten
$nieuwe_breedte_ratio=round(($nieuwe_hoogte / $oude_hoogte)*100); //neemt een ratio aan
$nieuwe_breedte=round($oude_breedte*($nieuwe_breedte_ratio/100));
}
$thumb=@imagecreate($nieuwe_breedte,$nieuwe_hoogte);
imagecopyresampled($thumb, $img, 0, 0, 0, 0, $nieuwe_breedte, $nieuwe_hoogte, $oude_breedte, $oude_hoogte);
imagePNG($img, "test/th_".$thumbname);
imagedestroy($img);
//---end
print("
Oude breedte: $oude_breedte<BR>
Oude hoogte: $oude_hoogte<BR>
Nieuwe breedte: $nieuwe_breedte<BR>
Nieuwe hoogte: $nieuwe_hoogte<BR>
imagecopyresized($thumb, $img, 0, 0, 0, 0, $nieuwe_breedte, $nieuwe_hoogte, $oude_breedte, $oude_hoogte)<BR>
");
?>

Chocwise
02.09.2004, 21:41
wrtlprnft es siehst aus das du wirklich viel weiB, aber ich habe deinen script gebraucht und etwas geändert (weil es nicht funktioneerde). Aber nun "resized" es nicht mehr, meinen bild wird nicht kleiner, wie kommt das?
...
Ja ist das denn 'n Wunder?!
Is ja alles holländisch. Is ja klar das PHP da streikt. :D
Nah, Joke. ;)
Ich mag Holland. Nette Menschen, leckerer Fisch, keine Berge viel Meer. :D:A

Zur Sache: Gib mal mehr Informationen über die Symptome.
Werden überhaupt die tn_???.png-Dateien im Ordner "test" angelegt?
Kommen Fehlermeldungen (mach evtl. mal die "@" vor den beiden image...()-Funktionen weg, die verhindern nämlich Fehlerausgaben), hast du den Ordner "test" 777 ge"chmod"det, hat der Server überhaupt gdlib um Imagefunktionen bieten zu können (ggf einmal phpinfo() machen.)?

Latency
02.09.2004, 22:17
Mal ne kleine Frage meinerseits: Ist es möglich ein Bild zu verkleiner und dann das verkleinerte Bild direkt an den Browser zu senden, ohne den Umweg über die thumb_*.png Datei zu gehen?

Chocwise
02.09.2004, 22:32
Mal ne kleine Frage meinerseits: Ist es möglich ein Bild zu verkleiner und dann das verkleinerte Bild direkt an den Browser zu senden, ohne den Umweg über die thumb_*.png Datei zu gehen?

header('Content-type: image/png');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');

imagepng($img);

Die no-Cache-Anweisungen sind im Falle dynamisch erzeugter Grafiken, die sich laufend ändern aber den gleichen Dateinamen behalten, zumeist zu empfehlen.
Denk dran das sonst nichts anderes an den Client ausgegeben werden darf außer das Bild und die Header, andernfalls funzts nicht.

Latency
02.09.2004, 22:43
Och schade :\

Dann funktioniert das was ich im Kopf hatte nich so wirklich :(
Ich hatte nämlich die Idee per Script ein Verzeichniss auszulesen, alle Bilder automatisch zu verkleinern, in die Galerie einfügen und an den Browser schicken. Vorteil wäre halt, dass man sich keine Thumbs bauen muss, da dies das Script von alleine macht, sobald ein Bild im Verzeichniss liegt. Aber da hat klein Nance wohl zu viel geträumt :\

Chocwise
02.09.2004, 22:54
Och schade :\

Dann funktioniert das was ich im Kopf hatte nich so wirklich :(
Ich hatte nämlich die Idee per Script ein Verzeichniss auszulesen, alle Bilder automatisch zu verkleinern, in die Galerie einfügen und an den Browser schicken. Vorteil wäre halt, dass man sich keine Thumbs bauen muss, da dies das Script von alleine macht, sobald ein Bild im Verzeichniss liegt. Aber da hat klein Nance wohl zu viel geträumt :\
Klar geht das. :D
Du darfst eben nur nichts an den Client ausgeben lassen, außer eben das Bild selbst und Headeranweisungen. ;)
Alles andere was auf Serverseite bleibt, geht. ;)

Latency
02.09.2004, 22:58
Klar geht das. :D
Du darfst eben nur nichts an den Client ausgeben lassen, außer eben das Bild selbst und Headeranweisungen. ;)
Alles andere was auf Serverseite bleibt, geht. ;)
Nah? So wie ich das verstanden habe ist es doch nur dann möglich ein verkleinertes Bild an den Client zu schicken, solang nur das Bild selbst verschickt wird, ohne jeglichen HTML Content, oder hab ich da was nicht ganz kapiert?

Chocwise
02.09.2004, 23:14
Nah? So wie ich das verstanden habe ist es doch nur dann möglich ein verkleinertes Bild an den Client zu schicken, solang nur das Bild selbst verschickt wird, ohne jeglichen HTML Content, oder hab ich da was nicht ganz kapiert?
So ist es.
Aber wenn du einen gesamten Ordner mit seinen Bildern gethumnailed und in HTML eingebunden, ausgeben willst, geht das dennoch.
Einen mit PHP-Erzeugten Thumbnail, kannst du ja wie ein ganz gewöhnliches Bild in HTML einbinden.

<img src="ordner/thumbscript.php?file=<?php echo $file; ?>">
Und das dann in die while-Schleife eingebunden die den Ordnerinhalt ausliest...
Wenn du magst kannst du sogar das Script das den Ordnerinhalt ausliest und das Thumbnailscript, welches die Thumbs an den Client sendet, in eine einzige Scriptdatei packen.
In meinem Kopf funktioniert das Script bereits, nur bin ich zu faul es zu scripten. :D