[php] Imageresize versnellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dentist
  • Registratie: December 2000
  • Laatst online: 16-09 10:36

Dentist

Next patient please...

Topicstarter
Ik heb een tooltje gemaakt dat jpegs automatisch thumbnailed. Nu gaat dat op zich prima, alleen de snelheid van het thumbnailen is niet echt om over naar huis te schrijven. Ik zou graag willen dat dat sneller gaat, maar ik heb een beperking : ik kan thumbnails niet opslaan als apart bestand.

Mijn vraag is dus : kan ik door slim coden of een andere gdlib het resizen van images versnellen?

Acties:
  • 0 Henk 'm!

  • reminder
  • Registratie: Maart 2001
  • Laatst online: 14-09 21:41

reminder

oi....

Ik geloof niet dat er een snellere manier is maar je zou ze ook in een database kunnen cachen ?

Each year, the Rainforest is responsible for over 3000 deaths from accidents, attacks or illnesses. There are over 700 things in the rainforest that cause cancer. Join the fight now and help stop the Rainforest before it's too late


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Mijn vraag is dus : kan ik door slim coden of een andere gdlib het resizen van images versnellen?
Mijn glazen bol vertelt me helaas niet hoe je code er nu uit ziet :?

Ik denk overigens dat de performance niet zo zeer in je eigen code zal zitten. Je zou natuurlijk met headers e.e.a. client-side caching kunnen "forceren".

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

Hmm, ik heb een image resize script gemaakt dat kijkt hoe groot het is, en dan de nieuwe grootte berekendt en die invult in <img height="$h" width="$w">

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

  • Badeend
  • Registratie: Juli 2000
  • Laatst online: 16-09 21:36
Roa schreef op 12 March 2003 @ 15:45:
Hmm, ik heb een image resize script gemaakt dat kijkt hoe groot het is, en dan de nieuwe grootte berekendt en die invult in <img height="$h" width="$w">
Dit kan natuurlijk, maar dan heb je als nadeel dat als je een plaatje van 1600*1200 upload dat het erg lang duurt met laden...

Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
Roa schreef op 12 maart 2003 @ 15:45:
Hmm, ik heb een image resize script gemaakt dat kijkt hoe groot het is, en dan de nieuwe grootte berekendt en die invult in <img height="$h" width="$w">
Dan laat je het plaatje alleen kleiner zien, wat deze user bedoelt is dat het plaatje ook echt verkleind wordt (dus ook kwa grootte)

Acties:
  • 0 Henk 'm!

Verwijderd

Tsja als je de bestanden niet op kan laten slaan... Kan je hier helaas niks tegen doen. And that's the reality :/

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
je kan niet opslaan als een apart bestand of mag je het niet? en je mag wel de gd-library aanpassen?

Maar ik denk niet dat er een oplossing is door "slim te coden". En een andere gdlib zal ook niet veel helpen, vrees ik. Als je een afbeelding van 800*600 moet resizen naar 80*60 dan duurt dat gewoon even...zelf op snelle computers duurt het een tijdje, dus ik _denk_ dat je het zo zal moeten laten, of toch een manier moet zien te vinden om de thumbnails te kunnen cachen.

Acties:
  • 0 Henk 'm!

  • Roa
  • Registratie: December 2002
  • Laatst online: 03-07-2024

Roa

Dit kan natuurlijk, maar dan heb je als nadeel dat als je een plaatje van 1600*1200 upload dat het erg lang duurt met laden...
True, in mijn geval alleen niet erg...
Dan laat je het plaatje alleen kleiner zien, wat deze user bedoelt is dat het plaatje ook echt verkleind wordt (dus ook kwa grootte)
Klopt, maar omdat hij zei dat hij het niet kon slaan.....

PHP:
1
2
3
4
5
6
7
8
9
10
function checkImg2 ( $img ) {  
   list ( $w, $h ) = GetImageSize ( $img );  
   if($w > 450){
   $h = $h / ($w / 450);
   $w = 450;
return "<center><a href=\"$img\" target=\"_new\">[img]\"$img\"[/img]</a></center>";  
   }else{
return "<center><a href=\"$img\" target=\"_new\">[img]\"$img\"></a></center[/img]";
}
}

die 450 vervangen voor de grootte die jij wilt. Dit script gaat uit van de opgegeven width, die 450 is width, maar tis niet moeilijk om hem aan te passen

Research is what I'm doing when I don't know what I'm doing.


Acties:
  • 0 Henk 'm!

Verwijderd

Op welke manier doe je het? Met imagecopyresampled is bijvoorbeeld wel net, maar niet snel, terwijl imagecopyresized minder goede resultaat geeft maar wel snel is

Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 16-09 06:34
Uuuhh met dit blijft je plaatje toch even groot of pas je echt de grootte (zowel qua lengtexbreedte als qua bytes) aan tijdens het uploaden?? Dat is niet echt duidelijk uit het stukje code. Hieruit maak ik juist op dat je alleen voor het bekijken van het plaatje de grootte ff aanpast tot een formaat, nadeel is dan wel dat de gebruiker het hele plaatje alsnog download (het is dan geen echte thumbnail).

Maar denk niet dat je het gewoon snel krijgt. Mijn code maakt echt een thumbnail aan en slaat beiden op maar het duurt gewoon ff. Ik zou heeb id hebben hoe je dat proces kunt versnellen. Interesse heb ik wel :)

[edit]
ImageCopyResized is idd de snelste manier al krijg je minder resultaat maar als het toch maar thumbs zijn....

[ Voor 9% gewijzigd door TheRebell op 12-03-2003 18:55 ]


Acties:
  • 0 Henk 'm!

  • Dentist
  • Registratie: December 2000
  • Laatst online: 16-09 10:36

Dentist

Next patient please...

Topicstarter
Dit is de code.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$filename = $_GET["url"];
$size = getimagesize ($filename);
$ratio = $sizew/$size[0];
$new_w = $ratio*$size[0];
$new_h = $ratio*$size[1];

header("Content-type: image/jpeg");
$dst_img=imagecreate($new_w,$new_h);
$src_img=ImageCreateFromJPEG($filename);
($src_img),ImageSY($src_img));
ImageCopyResized($dst_img,$src_img,0,0,0,0,$new_w,$new_h,ImageSX($src_img),ImageSY($src_img));
ImageJPEG($dst_img);


Ik wil overigens gewoon niet cachen, omdat dit script min of meer openbaar beschikbaar is. Ik heb het geschreven nav een onwillige forumadmin, die een maximumgrootte van de images in heeft gesteld. Ik heb echter geen zin in allerlei thumbnails op mijn server, al helemaal niet omdat ik niet zo extreem veel ruimte heb.

Acties:
  • 0 Henk 'm!

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-09 19:14
Qua code is het gewoon niet sneller te krijgen. Ik zou ze zelf opslaan (ja op Counter-Strike.nl doe ik het ook fout) maar omdat je weinig ruimte hebt is dat geen oplossing. Je zou misschien wat nieuwe expire headers mee kunnen sturen, zodat de client de pics cached. Maar dat is ook niet echt een oplossing.

zeroxcool.net - curity.eu


Acties:
  • 0 Henk 'm!

Verwijderd

Ik doe dit soort dingen met convert van ImageMagick. Werkt supersnel en als een trein. Gewoon in php een exec() gebruiken en dan convert aanroepen. Zelfs GIF wordt goed ondersteund.

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Inderdaad.. de enige oplossing is om gebruik te maken van een (extern) alternatief om je images te resizen ipv GD.

bijv ImageMagick of NetPBM

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou persoonlijk aanraden om toch gewoon de thumbnails 1 maal te genereren en dan ergens opslaan. Als je on the fly elke plaatje elke keer opnieuw gaat resizen dan krijg je een behoorlijke serverload. Dit is hetzelfde als je externe programma's gaat gebruiken.

Dus gewoon de eerste keer resizen en opslaan. Heb je ook geen last met traagheid.

Acties:
  • 0 Henk 'm!

  • tweakerbee
  • Registratie: Maart 2000
  • Laatst online: 14-09 11:35

tweakerbee

dus..?

Om welke grootte gaat het, en om hoeveel plaatjes gaat het.
Anders moet je de users van je script even een nieuwe HDD laten sponsoren. Dan kan het vast wel ;) :D

You can't have everything. Where would you put it?


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Ik denk dat de beste oplossing is om toch van een chashing systeem uit te gaan. controleer eerst of er van een bepaald plaatje al een thumbnail is en of deze thumbnail nieuwer is dan het orgineel (voor het geval deze gewiezigd is) en zorg anders dat de gegenereerde plaatjes in een speciale dir worden opgeslagen. Misschien is het handig om enkele vars bij te houden in een db mbt het opvragen. Denk hierbij aan de tijd dat de thumbnail voor het laatst opgevraagd is en de grootte. Hierdoor kun je met een redelijk simpel sql + php de thumnail dir terugbrengen tot een bepaalde grootte door die thumbnails te verwijderen die het langst niet opgevraagd zijn.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Dentist
  • Registratie: December 2000
  • Laatst online: 16-09 10:36

Dentist

Next patient please...

Topicstarter
Hmm, da's inderdaad een idee.. dat ik een cache van een paar mb instel, waar de pics inkomen.. Ik zit alleen even met de implementatie ervan (net nu het script zo lekker simpel was :D).

Acties:
  • 0 Henk 'm!

  • Dentist
  • Registratie: December 2000
  • Laatst online: 16-09 10:36

Dentist

Next patient please...

Topicstarter
Goed, ik ben nu verder, heb het script uitgebreid, zodat hij checkt of de thumb er al is op basis van de url die gegeven wordt. Ik wil echter, als de url gegeven wordt, direct de jpeg als output van het script. Wat is nu de snelste manier om die jpg te openen en op het scherm te toveren (middels headerbla & imagecreatefromjpeg)?

Edit : Hoe kan ik, als een thumb nog niet bestaat, die ten eerst maken en wegschrijven en ten tweede als output van de file genereren?

[ Voor 22% gewijzigd door Dentist op 13-03-2003 13:58 ]


Acties:
  • 0 Henk 'm!

  • Dentist
  • Registratie: December 2000
  • Laatst online: 16-09 10:36

Dentist

Next patient please...

Topicstarter
Ik krijg de volgende error : Warning: fopen("http://www.blabla.nl/atc/cache/1.jpg", "wb") - Undefined error: 0 in /var/www/htdocs/blabla/html/atc/atc2.php on line 69

en op line 69 staat :

PHP:
1
$fp = fopen($thumburl, "wb");


De file bestaat nog niet, maar cache is gechmod naar 777. Geen idee wat het probleem is.

Acties:
  • 0 Henk 'm!

  • Dentist
  • Registratie: December 2000
  • Laatst online: 16-09 10:36

Dentist

Next patient please...

Topicstarter
Iemand?

Acties:
  • 0 Henk 'm!

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 20-08 20:35
jah, je kan niet naar een http ding schrijven je moet volgens mij gewoon je locale adres opgeven.

Acties:
  • 0 Henk 'm!

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Ik gebruik nu Xnview. Hier zit een programmatje nconvert bij waarmee je echt vet veel mee kunt! Een heleboel bestanden importeren en ook een zooi 'filters'.

En snel ook...

Xnview: http://www.xnview.com

Acties:
  • 0 Henk 'm!

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 05-10-2024
Dentist schreef op 13 maart 2003 @ 14:25:
Ik krijg de volgende error : Warning: fopen("http://www.blabla.nl/atc/cache/1.jpg", "wb") - Undefined error: 0 in /var/www/htdocs/blabla/html/atc/atc2.php on line 69

en op line 69 staat :

PHP:
1
$fp = fopen($thumburl, "wb");


De file bestaat nog niet, maar cache is gechmod naar 777. Geen idee wat het probleem is.
Aan je chmod zag ik dat je op een unix/linux bak zit. Dan hoef je die b ook niet bij je fopen te gebruiken

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
Om wat al gezegd is maar een beetje aan te vullen: GD is notoir slecht in het efficient manipuleren van datastructuren (beetje crappy code en intern dataformaat), dus een wat betere tool zoals bijvoorbeeld ImageMagick levert vast betere resultaten op

Acties:
  • 0 Henk 'm!

  • Dentist
  • Registratie: December 2000
  • Laatst online: 16-09 10:36

Dentist

Next patient please...

Topicstarter
M4rt1nvW schreef op 13 maart 2003 @ 20:01:
jah, je kan niet naar een http ding schrijven je moet volgens mij gewoon je locale adres opgeven.
de php-manual zegt van niet :)
$handle = fopen ("http://www.example.com/", "r");
en verder...
Aan je chmod zag ik dat je op een unix/linux bak zit. Dan hoef je die b ook niet bij je fopen te gebruiken
Weet ik, is voor compatability-sake. Het script moet ook op windows kunnen draaien als het af is.

Verder is het gebruik van een andere tool nicht im frage. De gd lib werkt, mijn script werkt, het enige wat nog niet werkt is het wegschrijven naar een file. Ik ga niet de hele boel weer ombouwen of van een 3rd party tool gebruik maken.

Acties:
  • 0 Henk 'm!

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 17-09 07:55

thomaske

» » » » » »

Dentist schreef op 13 March 2003 @ 21:07:
de php-manual zegt van niet :)
Schrijven ('w') is iets anders dan lezen ('r')

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


Acties:
  • 0 Henk 'm!

  • Dentist
  • Registratie: December 2000
  • Laatst online: 16-09 10:36

Dentist

Next patient please...

Topicstarter
Doh.. Je hebt helemaal gelijk... Problem solved, thx.
Pagina: 1