[PHP]Optimalisatie van gegenereerde images.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Ik ben bezig met het bouwen van grafieken on-the-fly de grafieken zijn bijna niet te cachen om dat het continu wordt aangepast.

Ik bouw een image met een afmeting van 500x150px dit doe dit laat ik doen door een losse functie die van uit een classe wordt aan geroepen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function img_grafiek($arrayData,$arrayLabel,$jaar,$filepath,$sizeX = 500,$sizeY = 150){
    $kleur      = new kleuren();    //classe met voor gedefineerde kleuren.

    $imgp       = imageCreate($sizeX,$sizeY); 
    $sizeY      = $sizeY-15;
    
    $BGI            = imagecreatefrompng($_SERVER['DOCUMENT_ROOT'].'/final/bg.png');
    imagecopymerge($imgp, $BGI, 0, 0, 0, 0, 80, 35, 100);

    $wit        = imageColorAllocate($imgp, 255,255,255); 
    $rood       = imageColorAllocate($imgp, 241,25,35); 
    
    $zwart    = imageColorAllocate($imgp, 0,0,0); 
    $grijs    = imageColorAllocate($imgp, 228,228,228); 
//KNIP
// hier bouw ik de grafiek met een aantal fillrects..
//KNIP
    imagepng($imgp,$_SERVER['DOCUMENT_ROOT'].$filepath);  
    imageDestroy($imgp);
}


Nu duurt dit heel erg lang om te genereren, kan iemand me een eindje op weg helpen, ik heb gezocht of er een tutorial is die me kan helpen maar die zijn door mij niet te vinden.

Verder:
is imagepng wel snel of kan ik beter jpeg, gif of bmp gebruiken

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
als het plaatje bepaalde vaste elementen heeft die nooit veranderen dan zou je die kunnen maken als basisplaatje, die vervolgens openen en dan de dynamische content toevoegen.
Verder:
is imagepng wel snel of kan ik beter jpeg, gif of bmp gebruiken
Ik heb geen idee wat sneller is, maar dat lijkt me vrij eenvoudig te benchmarken.
Ik gok overigens dat png en gif sneller zijn dan jpeg en bmp

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
Daar was ik niet zelf opgekomen tnx, ik zal kijken of ik ImageMagick op de server geinstaleerd kan krijgen.

De afbeelding is geheel dynamisch alles wat vast is heb ik er al uitgeript

Acties:
  • 0 Henk 'm!

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Ik weet niet wat voor grafieken je moet genereren, maar je zou misschien naar een pakket als mrtg kunnen kijken?

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Voor een grafiek kun je beter geen jpeg gebruiken. Jpeg is bedoeld voor foto's, niet voor diagrammen. Voor diagrammen en logo's heb je gewoon een lossless bestandsformaat nodig.

Waarom schrijf je je image trouwens weg? Als hij daarwerkelijk zo dynamisch is dat hij elke keer opnieuw getekend moet worden, dan kun je hem natuurlijk ook gewoon gelijk naar de client sturen ipv de omweg via het filesysteem.

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!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Overigens kun je je alle calls naar imageColorAllocate besparen. Die functie is heel simpel te vervangen:
PHP:
1
$wit = imageColorAllocate($imgp, 255,255,255);

is gelijk aan:
PHP:
1
$wit = 0xFFFFFF

Niet dat dat veel zal schelen, maar alle beetjes helpen. :)

Overigens, ik heb zelf pasgeleden nog een grafiekenclass geschreven. Wat probeer je te maken? Een staafdiagram?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
...
Overigens, ik heb zelf pasgeleden nog een grafiekenclass geschreven. Wat probeer je te maken? Een staafdiagram?
Het is een grafiek van een levensloop van iemand, dit wordt gebruikt op verschillende plaatsen op de site, zoals wel in PDF's als in een site.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat de grafiek weergeeft is verder niet zo interessant, ik vroeg dan ook wat voor grafiek je maakt, niet waarvan je die maakt. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

-NMe- schreef op vrijdag 07 oktober 2005 @ 12:56:
Overigens kun je je alle calls naar imageColorAllocate besparen. Die functie is heel simpel te vervangen:
PHP:
1
$wit = imageColorAllocate($imgp, 255,255,255);

is gelijk aan:
PHP:
1
$wit = 0xFFFFFF

Niet dat dat veel zal schelen, maar alle beetjes helpen. :)
hmm, dat wist ik niet, ik dacht dat ImageColorAllocate namelijk de kleur in het pallet van het plaatje zet, als je zo'n hexwaarde (simpele integer dus ;) ) neerzet dan weet je image niet welke kleur het is toch?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

Erkens schreef op vrijdag 07 oktober 2005 @ 13:57:
[...]

hmm, dat wist ik niet, ik dacht dat ImageColorAllocate namelijk de kleur in het pallet van het plaatje zet, als je zo'n hexwaarde (simpele integer dus ;) ) neerzet dan weet je image niet welke kleur het is toch?
Volgens mij werkt dat ook alleen bij true color images, en niet bij images met een pallet.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • BBrunekreeft
  • Registratie: Mei 2004
  • Laatst online: 08:29

BBrunekreeft

Dus...

Bpje schreef op vrijdag 07 oktober 2005 @ 12:13:
Ik ben bezig met het bouwen van grafieken on-the-fly de grafieken zijn bijna niet te cachen om dat het continu wordt aangepast.

Ik bouw een image met een afmeting van 500x150px dit doe dit laat ik doen door een losse functie die van uit een classe wordt aan geroepen.
Heb je al eens naar JpGraph gekeken?
http://www.aditus.nu/jpgraph/
Die neemt je ontzettend veel werk uit handen en is nog snel ook.

Acties:
  • 0 Henk 'm!

  • Bpje
  • Registratie: November 2000
  • Laatst online: 25-04 22:59
-NMe- schreef op vrijdag 07 oktober 2005 @ 13:10:
Wat de grafiek weergeeft is verder niet zo interessant, ik vroeg dan ook wat voor grafiek je maakt, niet waarvan je die maakt. ;)
Sorry, een staaf grafiek.

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

Het stuk code uit je post is nu net niet de bottleneck, maar het stuk dat je eruit geknipt hebt (het tekenen van de grafiek).

Er valt zo weinig over te zeggen, want het enige dat deze code doet is een plaatje maken en weer opslaan en daar is gdlib aardig rap in.

JPGraph gebruikt ook gewoon GDlib overigens, dus ook daar zal de bottleneck in het tekenen van de afbeelding zitten. Dat gaat dus niks oplossen. Sterker nog, het zelf doen is dan een stuk sneller dan de overhead van de hele JPGraph library erbij nemen.

[ Voor 34% gewijzigd door Bosmonster op 07-10-2005 14:16 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

crisp schreef op vrijdag 07 oktober 2005 @ 14:03:
[...]

Volgens mij werkt dat ook alleen bij true color images, en niet bij images met een pallet.
imagecolorallocate() returns a color identifier representing the color composed of the given RGB components. The image argument is the return from the imagecreatetruecolor() function. red, green and blue are the values of the red, green and blue component of the requested color respectively. These parameters are integers between 0 and 255 or hexadecimals between 0x00 and 0xFF. imagecolorallocate() must be called to create each color that is to be used in the image represented by image.
hmm, daar noemen ze expliciet imagecreatetruecolor.

hmm, als ik tijd heb ga ik dit eens testen vanmiddag (en ook meteen of het kwa tijd wat uitmaakt)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Erkens schreef op vrijdag 07 oktober 2005 @ 14:14:
hmm, als ik tijd heb ga ik dit eens testen vanmiddag (en ook meteen of het kwa tijd wat uitmaakt)
Dat het bij truecolor images ook gewoon met hexcodes werkt weet ik zeker, dat heb ik 2 weken geleden nog toegepast. :P

Wat er sneller is weet ik niet, maar het zal sowieso een marginaal verschil zijn, zoals ik ook al meteen aangaf. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Hmm, maargoed dan nog had de TS er niks aan want die gebruikt gewoon imagecreate zoals je had kunnen lezen :P

(maar iig bedankt voor de tip, raar dat ik het nergens @ php.net kon vinden :) )

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
-NMe- schreef op vrijdag 07 oktober 2005 @ 12:56:
Niet dat dat veel zal schelen, maar alle beetjes helpen. :)
Dat gaat alleen op voor true color images, en dan nog niet eens helemaal omdat je ook rekening dient te houden met alpha waarden. (Die mag je wel weglaten als je ze niet gebruikt inderdaad). Intern worden ze afgehandeld met de gdTrueColorAlpha macro welke niet meer doet als wat bitshifts. Als je een paleted afbeelding gebruikt gaat het er wat anders aan toe, de kleuren worden dan namelijk opgenomen in het palet, vermits er nog plaats is.

Ja er is ook een macro gdTrueColor maar die word voor zover ik kan zien niet gebruikt als je imageColorAllocate aanroept

Overigens zou je best een redelijke snelheid moeten kunnen behalen als je enkel Gd functies gebruikt voor de 'effecten' en niet met imagecolorat en imagesetpixel over je afbeelding gaat itereren, dat gaat behoorlijk traag kan ik je vertellen.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 15:29

crisp

Devver

Pixelated

Hoe belangrijk is het om die grafieken 'on-the-fly' te maken, en hoe vaak wordt een bepaalde grafiek opgevraagd? Je zou een constructie kunnen maken die checked of een eerder gegenereerde en opgeslagen grafiek ouder is dan X minuten - zo ja dan genereer je een nieuwe, zo nee dan serveer je gewoon de eerder opgeslagen grafiek.
Een dergelijk systeem gebruiken wij ook voor de pricewatch grafieken waarbij X zelfs een dag is.

Intentionally left blank

Pagina: 1