[PHP] Thumbnails maken

Pagina: 1
Acties:
  • 736 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers,

Ik heb met PHP een script geschreven dat de directory structuur van de HD gebruikt als categorie overzicht. In de laatste subdirectory kan de gebruiker via FTP plaatjes uploaden (het gaat om duizenden plaatjes, vandaar dat het niet via een upload script gebeurt) en zodra deze subdirectory in het script aangeklikt wordt krijgt men de plaatjes te zien.

Het script kiest random een aantal plaatjes uit om die als thumbnails neer te zetten, dus niet alle plaatjes staan er iedere keer (zou een beetje veel worden). Het aanklikken van de thumbnails levert de grote versies op (duh :P). Het probleem is alleen dat ik die thumbnails pas in de html maak (dus <img width=..>). Dit is natuurlijk te sloom. Ik weet wel hoe ik thumbnails moet maken van een geupload plaatje, maar als ik dit iedere keer als de pagina opgeroepen wordt toepas dan zal dit de parse time absoluut niet ten goede komen...ik heb er zelf aan zitten denken om een scriptje te schrijven die gewoon de directories na gaat en controleert welke files geen thumbnail hebben om deze dan alsnog te thumbnailen. Iedere keer na een upload zou de gebruiker dit script dan dus moeten draaien. Maar dat lijkt me ook niet de ideale oplossing.

Weet iemand anders misschien een beter alternatief?

Acties:
  • 0 Henk 'm!

Verwijderd

ik heb er zelf aan zitten denken om een scriptje te schrijven die gewoon de directories na gaat en controleert welke files geen thumbnail hebben om deze dan alsnog te thumbnailen. Iedere keer na een upload zou de gebruiker dit script dan dus moeten draaien. Maar dat lijkt me ook niet de ideale oplossing.
Je zou dat script in een cronjob kunnen zetten (mits je phpcgi hebt, anders met lynx -dump), en dit script bijvoorbeeld om het uur kunnen laten runnen...

Acties:
  • 0 Henk 'm!

Verwijderd

Lazy thumpnailen:
Stel je wilt een thumbnail van afbeelding x tonen.
Maak dan alleen een thumbnail aan als
1) deze er nog niet is
2) als de gewijzigddatum van x groter is dan die van de thumbnail van x

Acties:
  • 0 Henk 'm!

Verwijderd

Als je nou een upload-formpje maakt, waarbij de image wordt weggeschreven (dus checken of de ge-uploade file een image is) en dan maakt ie vanzelf een thumb aan :)

Tenminste, zo doe ik het met nog wat andere features eraan vast :)

Zoek op phpfreakz.nl (kant-en-klare functions/script voor dit) of php.net voor de functions (http://nl.php.net/image) die nodig zijn :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je zou dat script in een cronjob kunnen zetten (mits je phpcgi hebt, anders met lynx -dump), en dit script bijvoorbeeld om het uur kunnen laten runnen...
Daar heb ik ook aan zitten denken maar van dat gebied weet ik niet echt veel. De servers zijn in ieder geval van de opdrachtgever en kunnen dus in principe aangepast worden..
Lazy thumpnailen:
Stel je wilt een thumbnail van afbeelding x tonen.
Maak dan alleen een thumbnail aan als
1) deze er nog niet is
2) als de gewijzigddatum van x groter is dan die van de thumbnail van x
Als er duizenden plaatjes staan en er worden er 50 plaatjes getoond, dan is de kans dat je iedere keer 50 plaatjes moet thumbnailen vrij groot lijkt me. Of zie ik dat verkeerd? :)
Als je nou een upload-formpje maakt, waarbij de image wordt weggeschreven (dus checken of de ge-uploade file een image is) en dan maakt ie vanzelf een thumb aan

Tenminste, zo doe ik het met nog wat andere features eraan vast

Zoek op phpfreakz.nl (kant-en-klare functions/script voor dit) of php.net voor de functions (http://nl.php.net/image) die nodig zijn
Om mijzelf te quoten:
het gaat om duizenden plaatjes, vandaar dat het niet via een upload script gebeurt

[ Voor 26% gewijzigd door Verwijderd op 01-02-2003 12:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 01 februari 2003 @ 12:14:
[...]


Daar heb ik ook aan zitten denken maar van dat gebied weet ik niet echt veel. De servers zijn in ieder geval van de opdrachtgever en kunnen dus in principe aangepast worden..


[...]


Als er duizenden plaatjes staan en er worden er 50 plaatjes getoond, dan is de kans dat je iedere keer 50 plaatjes moet thumbnailen vrij groot lijkt me. Of zie ik dat verkeerd? :)
Daarom moet je ook gelijk die thumb aanmaken (en wegschrijven) als de file ge-upload wordt... En dan niet via FTP uploaden, anders werkt de opzet alsnog niet :)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 01 februari 2003 @ 12:12:
Als je nou een upload-formpje maakt, waarbij de image wordt weggeschreven (dus checken of de ge-uploade file een image is) en dan maakt ie vanzelf een thumb aan :)

Tenminste, zo doe ik het met nog wat andere features eraan vast :)

Zoek op phpfreakz.nl (kant-en-klare functions/script voor dit) of php.net voor de functions (http://nl.php.net/image) die nodig zijn :)
Volgens mij moest het via FTP ;)
Daar heb ik ook aan zitten denken maar van dat gebied weet ik niet echt veel. De servers zijn in ieder geval van de opdrachtgever en kunnen dus in principe aangepast worden..
man crontab, achter de linux prompt... cron is trouwens echt niet ingewikkeld, is dus zeker het proberen waard...

[ Voor 23% gewijzigd door Verwijderd op 01-02-2003 12:23 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het hoeft niet per se via FTP hoor, maar dan als CowMike zich dan vrijwillig aanbiedt om tientallen cd's met plaatjes te uploaden ;).

Acties:
  • 0 Henk 'm!

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 08-09 13:47
Lazy thumbnailen en telkens de eerste 50 thumbnails pakken.. Dat maakt het ook een heel stuk logischer voor de user lijkt me. Beetje verwarrend als je iedere keer een andere set plaatjes krijgt.

Maar goed, verder zijn er natuurlijk een aantal dingen van belang die bepalen wat je het beste kan doen..

Hoevaak worden er nieuwe imgs geupload? Door hoeveel personen? Hoeveel users heb je die de plaatjes bekijken? Hoe groot zijn de images?

't is niet echt zo dat het een half uur duurt om een thumbnail te maken trouwens.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Lazy thumbnailen en telkens de eerste 50 thumbnails pakken.. Dat maakt het ook een heel stuk logischer voor de user lijkt me. Beetje verwarrend als je iedere keer een andere set plaatjes krijgt.
Klant is koning he...
Hoevaak worden er nieuwe imgs geupload? Door hoeveel personen? Hoeveel users heb je die de plaatjes bekijken? Hoe groot zijn de images?
Wekelijks door 1 persoon maar wel in grote hoeveelheden. Aantal bezoekers weet ik niet, plaatjes zijn vrij groot (meer dan 800*600), verschilt per plaatje.

Acties:
  • 0 Henk 'm!

Verwijderd

Als er duizenden plaatjes staan en er worden er 50 plaatjes getoond, dan is de kans dat je iedere keer 50 plaatjes moet thumbnailen vrij groot lijkt me. Of zie ik dat verkeerd? :)
Dat is natuurlijk afhankelijk van hoeveel afbeeldingen je hebt. Per plaatje uiteraard maar 1 maal.

Omdat je weet van welke plaatjes je al wel een thumbnail hebt, kan je het begrip "random" wat verzwakken en een limiet op het aantal afbeeldingen dat je wilt thumbnailen zetten. Zodra je dit limiet overschrijdt kies je alleen afbeeldingen uit de afbeeldingen die al gethumbnaild zijn.

Hoe groter het aantal page hits, des te meer de keuze van de plaatjes op de originele random verdeling gaat lijken. Het voordeel is dan nu wel dat je het thumbnailen uitspreidt over de tijd.

[ Voor 16% gewijzigd door Verwijderd op 01-02-2003 12:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 01 februari 2003 @ 12:20:
Het hoeft niet per se via FTP hoor, maar dan als CowMike zich dan vrijwillig aanbiedt om tientallen cd's met plaatjes te uploaden ;).
Sorry, had
het gaat om duizenden plaatjes, vandaar dat het niet via een upload script gebeurt
niet gelezen :X

Is het erop zetten van deze pics eenmalig of komt er elke keer zo'n bus (CD ;))-lading aan images aan? Als het eenmalig is en later sporadisch een image: maak een 'mass-thumbnailer' (dus gewoon dir uitlezen en thumbs maken) en maak ook zo'n upload-script :)

Acties:
  • 0 Henk 'm!

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 08-09 13:47
Idd, ik zou voor dezelfde oplossing gaan als Infinitive. Als je een beetje server hebt kan je in redelijk korte tijd 50 thumbs maken.

Verder heeft dat helemaal geen invloed op je 'parse time' als je voor de thumbs een scriptje gebruikt. Dus in je overzichts pagina bouw je een table met IMG tags die wijzen naar je thumbnail script. Het thumbnail script kijkt of de thumb al bestaat en of deze nog actueel is, zo ja dan stuurt hij een 304 of het plaatje, zo nee dan bouwt hij de thumbnail..

Op die manier heeft de bezoeker meteen de overzichtspagina, het duurt alleen een paar seconde langer voor hij alle thumbnails ook daadwerkelijk op z'n scherm heeft als er veel thumbs gemaakt moeten worden. Ik weet trouwens niet in welk formaat je de plaatjes hebt maar sommige formaten bevatten zelf al een thumbnail. Deze kan je naar de client sturen terwijl je de echte thumb maakt. Op die manier heb je bijna helemaal geen vertraging alleen kan het dan zijn dat de thumbs die je de eerste keer ziet van een ietsje mindere kwaliteit zijn (nl de kwaliteit van de thumbs die al in je image file zaten).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, ik ben nu een thumbnail script aan het maken die alleen plaatjes verkleint als ze nog niet verkleint zijn...zal kijken wat voor invloed dat heeft op de parsetimes.

Acties:
  • 0 Henk 'm!

  • BetuweKees
  • Registratie: Januari 2003
  • Laatst online: 15-07 20:53

BetuweKees

Flipje uit Tiel

is ImageMagick hier geen optie?

Through meditation I program my heart to beat breakbeats and hum basslines on exhalation -Blackalicious || *BetuweKees was AFK; op de fiets richting China en verder


Acties:
  • 0 Henk 'm!

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 08-09 13:47
Eeeh, zoals ik al zei, als je een los script hebt voor het maken van de thumbs heb je allemaal extreem lage 'parse times'. De pagina met het thumbnail overzicht is dan dus in no-time gegenereerd.

ImageMagick is idd ook wat ik zou gebruiken in dit geval...

BTW als het maar 1 persoon is die 1x in de week nieuwe plaatjes add dan is het ook niet zo'n probleem om die persoon de thumbnails te laten updaten, toch?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het even getest met 10 plaatjes (heb hier zelf niet zo veel testplaatjes ;)). Ik kom dan op een parse time van 2 seconde uit ongeveer, normaal gesproken is me parse time rond de 0,1 secondes (op me eigen pc dus). Dit vind ik toch wel een verschil...als ze eenmaal gethumbnailed zijn dan dalen de parse times vanzelf tot 0,1 seconde uiteraard.

Ik denk toch dat ik dan maar ga voor een pagina die de admin moet openen om de boel te updaten.

Wat is imagemagick overigens?

Acties:
  • 0 Henk 'm!

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 08-09 13:47
www.imagemagick.org als ik me niet vergis.

Mijn een na laatste post al gelezen?

(wat is GoT trouwens bagger traag vandaag zeg :\)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mjah en mijn antwoord staat eigenlijk in me vorige posts: parse times nemen toch wel drastisch toe.

Maar wat is het voordeel van imagemagick? Is het sneller dan wanneer ik het handmatig met PHP doe?

[ Voor 34% gewijzigd door Verwijderd op 01-02-2003 13:51 ]


Acties:
  • 0 Henk 'm!

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 08-09 13:47
Als de tijd die je script nodig heeft toeneemt dan doe je toch echt iets fout :)
Ik bedoel dus het volgende:
je hebt 1 script dat alleen een HTML tabel uitpoept met iets als:
[img]"thumb.php?img=/directory/image.jpg"[/img]

dan heb je een script dat 'thumb.php' heet en dat ding doet het volgende:
- Kijk of /directory/thumbs/image.jpg bestaat
- Ja? stuurt dat ding naar de client (of stuur evt een 304)
- Nee? Maak die thumbnail aan en stuur deze naar de client (met fatsoenlijke expiry headers)

Op deze manier heb jij in minder dan 0.1 seconde je index pagina gemaakt (dus de HTML tabel) en heeft de user binnen een paar tiende seconde die pagina in beeld. Daarna duurt het dus een seconde of 2 voor de thumbs gemaakt zijn en deze bij de client in z'n HTML tabel staan.. Snappie?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah op die fiets. Het duurt nog wel net zo lang (langer zelfs omdat 2 pagina's opgevraagd worden door de client) alleen de pagina verschijnt alvast :).

Dat is op zich wel een goede oplossing denk ik dan...

Acties:
  • 0 Henk 'm!

Verwijderd

anders moet je dit eens bekijken:
http://gallery.sourceforge.net/

Als het niet perfect is wat je zoekt, kan je nog altijd hun code voor thumbs te creeëren eens bekijken. Maakt gebruik van die Imagemick of nog een andere lib.
Er is ook een module om via php een gehele directory met plaatjes te uploaden, en dan genereert hij daar automatisch thumbs voor.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben toch voor BArt's manier gegaan nu, maar het werkt nog niet helemaal. Plaatjes verkleinen wel maar hoe stuur ik ze dan terug? Welke headers moet ik dus gebruiken? Dit werkt in ieder geval niet:

code:
1
2
header('Content-Type: image/jpeg');
header('Content-Disposition: inline; filename=$smallfile);


geeft ook parse error. $small file bevat de link naar het bestand (dus members/pics/ etc) als string.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nog even een toevoeging, de parse error is weg (was gewoon een typo) maar ik krijg dus geen plaatje te zien. Hoe wel?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Niemand? :)

Acties:
  • 0 Henk 'm!

Verwijderd

probeer dit eens:
PHP:
1
2
header("content-type: image/jpeg");
readfile($smallfile);



overigens kan je plaatje ook laten verkleinen met gdlib....
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$maximumWidth = 150; // De breedte van je thumbnail
    
header("content-type: image/jpeg");

$img = imageCreateFromJpeg($url); // De lokatie van je plaatje
$width = (ImageSX($img) > $maximumWidth)? $maximumWidth : ImageSX($img);
$height = round((ImageSX($img) > $maximumWidth) ? ImageSY($img)/(ImageSX($img)/$maximumWidth):ImageSY($img));

$outputImage = imageCreate($width,$height);
ImageCopyResized($outputImage,$img,0,0,0,0,$width,$height,ImageSX($img),ImageSY($img)); 
ImageJpeg($outputImage,'',100);

ImageDestroy($img);
ImageDestroy($outputImage);

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanx Fung! readfile() werkt. En de GDLibraries is ook precies wat ik nu gebruik ;). Parse time is nu weer ongeveer 0,1 seconde, alleen de plaatjes zijn dan nog niet geladen maar dat boeit dus niet. Bedankt allen!
Pagina: 1