Start på GD lib - Del 1

Tags:    php
Skrevet af Bruger #846 @ 23.12.2003

Indledning


Jeg vil i denne artikel gennemgå PHP-tilføjelsen GD lib, som giver dig mulighed for at oprette eller manipulere billeder. I denne, første artikel, vil vi kigge på koordinatsystemet, nogle få funktioner og komme med et enkelt færdigt script til sidst i artiklen.


Om GD lib


De nyere versioner af GD lib understøtter jpeg, png og xpm, samt læsning af gif. Vi vil ikke komme ind på gif og xpm i denne artikel.

Men hvorfor er der kun understøttet læsning af gif? Jo, eftersom gif formatet ikke er gratis for programmører at understøtte i deres programmer, har man fjernet dette fra versioner af GD lib over 1.6, da GD lib er en gratis tilføjelse til PHP.
Programmørerne bag GD lib slipper altså for at betale licens for at understøtte gif.


Indlæsning af billeder


For at komme i gang med at oprette nye billeder eller manipulere med allerede eksisterende, skal man altid starte med at indlæse billedet i scriptet.

Her giver jeg to eksempler på indlæsning af billeder, vi skal huske at gemme det i en variabel, så vi kan manipulere dem senere.

I første eksempel opretter jeg et nyt billede og indlæser det i en variabel. At der er et @ foran funktionen, betyder at en eventuel fejl, ikke vil blive skrevet ud til browseren.

Fold kodeboks ind/udKode 


Som det kan ses har jeg valgt at bruge variablen $im, det er forkortet for image og der er altså en mening med navnet. Jeg indlæser så dette nye billede, som jeg giver størrelsen 400 x 400 pixel, i denne variabel.

Syntax for imagecreate: resource imagecreate ( int x_size, int y_size)
http://dk2.php.net/imagecreate


Og så til næste eksempel, hvor jeg viser hvordan man indlæser et, henholdsvis, png og jpeg billede.

Fold kodeboks ind/udKode 


Her indlæser vi altså to forskellige billeder i de to variabler $im_png og $im_jpg, så kan vi begynde at manipulere med billederne.

Syntax for imagecreatefrompng: resource imagecreatefrompng ( string filename)
http://dk2.php.net/imagecreatefrompng

Syntax for imagecreatefromjpeg: resource imagecreatefromjpeg ( string filename)
http://dk2.php.net/imagecreatefromjpeg


Baggrundsfarve / allokering af farver


Nu har vi gennemgået indlæsning af billeder, på to forskellige måder, og jeg vil nu fortælle hvordan vi kommer videre med det nye billede, altså det vi lavede med imagecreate ().

Vi vil starte med at allokere nogle farver, som vi skal bruge senere i forløbet. Til dette skal vi bruge funktionen imagecolorallocate (). Farven til denne funktion første gang den kaldes, bliver baggrundsfarve, dette forklares lettest ved at tage et kig på næste eksempel.

Fold kodeboks ind/udKode 


Vi kan nu kigge på dette eksempel, og jeg har valgt at allokere baggrundsfarven i variablen $background, og da dette er den første farve som vi allokerer, vil denne automatisk blive sat som baggrund på vores billede, dette er med mindre vi indlæser farven til et billede som er hentet fra et allerede eksisterende, som i eksempel 2.
Derudover har jeg allokeret farverne sort og hvid i henholdsvis $black og $white.

Det første argument vi angiver i funktionen, er variablen til det billede vi vil manipulere, i det her tilfælde $im. De næste tre argumenter er farveværdier i først rød, grøn og så blå, på en skala fra 0-255, som vi kender det fra RGB-skalaen.

Syntax for imagecolorallocate: int imagecolorallocate ( resource image, int red, int green, int blue)
http://dk2.php.net/imagecolorallocate


Koordinatsystemet i GD lib


For at komme længere med vores billede, er vi nødt til at vide noget om hvordan koordinatsystemet i GD lib fungerer, dette har jeg illustreret med nedenstående billede, forklaring følger.




Som du kan se er 2. aksen (bedre kendt som y aksen) vendt på hovedet, og man vil ikke kunne se negative værdier. For at få et mere grafisk eksempel, kan du kigge på nedenstående billede, hvor jeg har tegnet en linie fra punktet (50,50) til (300,200).




Tegning af firkant


Så er vi kommet så langt, og vi har – forhåbentlig – fået banket det mest væsentlige ind i bevidstheden. Så nu skal vi have lavet vores billede lidt sjovere.

Lad os tilføje billedet en firkant. I følgende eksempel, tilføjer jeg en sort firkant som starter i punktet (49, 49) og slutter i (450, 150).

Fold kodeboks ind/udKode 


Lad os kigge på hvad de forskellige argumenter skal bruges til. I første argument fortæller vi hvilket billede vi vil ligge firkanten på, de næste to argumenter er startpunktet (x1, y1), altså (49, 49), de næste er ligeledes et punkt, dog slutpunkt (x2, y2), i dette tilfælde (450, 150), og til sidst angiver vi hvilken farve denne firkant skal have.

Syntax af imagerectangle: int imagerectangle ( resource image, int x1, int y1, int x2, int y2, int col)
http://dk2.php.net/imagerectangle


Kopiering af billede


Nu synes jeg så at vi skal sætte et billede ind i denne firkant, så vi henter et billede med imagecreatefromjpeg() og kopierer dette ind i firkanten med imagecopy().

Dette bliver et lidt mere forvirrende eksempel, hvor vi kopierer fra billede.jpg, fra (0, 0) til (400, 100), og sætter dette ind i firkanten, på punktet (50, 50).

Fold kodeboks ind/udKode 


Vi kender allerede funktionen imagecreatefromjpeg, så lad os kigge på imagecopy. I imagecopy starter man, som for det meste, med at angive hvor vi vil placere det man vil indsætte. Andet argument er billedet man vil kopiere fra. Tredje og fjerde argument, hvor i destinationsbilledet man vil sætte det kopierede stykke ind, i dette tilfælde (50, 50). Og de næste to argumenter, hvorfra i billedet man vil kopiere. Det syvende argument hvor bredt et stykke man vil kopiere og det sidste argument er hvor højt dette stykke skal være.

Syntax af imagecopy: int imagecopy ( resource dst_im, resource src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)
http://dk2.php.net/imagecopy


Tekst


Nu har hvor vi har lavet en firkant og indsat et billede, hvad med så at tilføje lidt tekst? Det gør vi.

Vi skriver teksten ”Dette er et eksempel” oven på billedet, med hvid skrift.

Fold kodeboks ind/udKode 


Første argument, er destinationsbilledet. Andet argument er hvilken skrifttype vi vil benytte, der er i GD lib, 5 indbyggede bitmap skrifttyper, forskellen på de 5 er størrelsen. Placeringen af teksten er angivet ved de næste to argumenter, i dette tilfælde (52, 52). Femte argument er så selve teksten. Og så i sidste argument fortæller vi hvilken farve teksten skal stå med.

Syntax af imagestring: int imagestring ( resource image, int font, int x, int y, string s, int col)
http://dk2.php.net/imagestring


Afslutning


Nu har vi lavet et nyt billede, vi har lært om koordinatsystemet, indsat en firkant, en del af et billede og et stykke tekst.

Nu mangler vi blot at skrive billedet ud til browseren, og destruere dette. Det gøres som med følgende eksempel.

Fold kodeboks ind/udKode 


imagepng skriver vores billede ud til browseren som et png billede, hvis du hellere vil have det ud som jpg, bruger du blot imagejpeg.
Og imagedestroy sletter alt hvad vi har lavet, sådan at det ikke bliver gemt hvis man skal bruge $im igen.


Og for at give en god afslutning, vil jeg her komme med hele scriptet, så det er nemmere for dig at afprøve det. Gem scriptet som image.php og hent det med <img src=”image.php” />.

Fold kodeboks ind/udKode 


Og her er det endelige resultat.




Så håber jeg at I har fået noget ud af denne artikel, og at I har lyst til at læse de næste i rækken.

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (21)

User
Bruger #1425 @ 23.12.03 21:15
Billeder kommer snarligt... :)
User
Bruger #3530 @ 25.12.03 16:40
Dejlig artikel, virkelig!
4 fra mig!
(bare billederne ville komme snart)
User
Bruger #3494 @ 26.12.03 00:00
Fin artikel. Jeg har længe ledt efter GD-Lib artikler, men jeg synes det er svært at finde dem. Nu venter jeg bare på del 2...
User
Bruger #2959 @ 29.12.03 21:59
og på billederne :)
User
Bruger #846 @ 30.12.03 02:57
Jeg håber de kommer snart :)
User
Bruger #4503 @ 04.01.04 14:13
Juhhuuu... Så kom billederne :)...

Det er en fed artikel.. Har altid ønsket mig at lære gd lib... Så tak for det ;)
User
Bruger #3530 @ 07.01.04 22:11
Den næste artikel, synes jeg, bør handle om hvordan man kan lave en service lidt ala numsefisk.dk !
Det kunne jeg i hvert fald godt tænke mig at lære :)
User
Bruger #2356 @ 26.01.04 21:17
Ok artikel, desværre får jeg en fejl når kopierer koden.
Parse error: parse error, unexpected T_STRING in c:\\inetpub\\wwwroot\\php\\test\\udvikl.php on line 16 i Linjen med imagestring.
User
Bruger #2356 @ 26.01.04 21:19
sorry... fejl opdaget og karakter opgraderet, der skete en fejl med " under copy->paste, min fejl har været tidligt oppe
User
Bruger #4578 @ 08.03.04 21:28
Fatter ik lige skal jeg bare lave et .php dokument og kupere det der ind ????
User
Bruger #846 @ 29.04.04 01:37
Dini: Det er en mulighed :)
User
Bruger #5067 @ 10.06.04 11:49
For at lave noed alá numsefisk, kan man starte med at sige http://domæne.dk/din-gd-side.php?navn=hehe
og så hvor man skriver hvad der skal stå i scriptet, skrive $navn er en numsefisk ;o)

Ellers meget god artikel.. hjalp mig lige MONSTER meget :o)
User
Bruger #6528 @ 20.06.05 03:29
Nice artikel den har virkelig hjulpet meget! 5 fra mig :)
User
Bruger #8006 @ 15.12.05 16:57
jeg for bare en masse data:

ÊâÿÚòÿÄaXÈ£`*ˆ0ˆˆ€“î!æîî~ötséÉ_üê“_zêóŸØË®HÜÖµõï¿úò^zá_~òÖkƒÁdx »yÊ
User
Bruger #4734 @ 19.01.06 14:30
KANON! anede faktisk ikke hvad GD-lib var (eller rettere, anede ikke at dette hed GD-lib)

Må lige prøves :P

5 herfra!
User
Bruger #65 @ 15.02.06 14:14
Buchi, hvis du i topnne af din billedeside tiløjere
header('Content-Type: image/png');
ville det hjælpe, gjorde det ivhertfald hos mig.
User
Bruger #4414 @ 25.02.06 19:28
Er der evt en der kan fortælle mig hvordan jeg får det her til at virke?
Jeg blev ved med at få en fejl i:
imagestring ($im, 2, 52, 52, ”Dette er et eksempel”, $white);
ændrede det til:
imagestring ($im, 2, 52, 52, 'Dette er et eksempel', $white);
og fejlmeddelelsen forsvandt, men jeg fik stadig intet resultat.
Jeg prøvede at insætte headeren foreslået af TC, men det hjalp heller ikke, hvad er det jeg gør galt?
User
Bruger #65 @ 31.05.06 09:58
Felix prøv
imagestring ($im, 2, 52, 52, "Dette er et eksempel", $white);

de gåseøjne der er i artiklen er ikke rigtige gåseøjene

men at bruge ' burde give samme resultat.

-Thomas
User
Bruger #7695 @ 23.10.06 12:54
Jeg får følgene fejl:

Warning: imagecreatefromjpeg(”Vinterjpg”) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /mounted-storage/home26b/sub002/sc24152-ERZJ/test/billede.php on line 15

Warning: imagecopy(): supplied argument is not a valid Image resource in /mounted-storage/home26b/sub002/sc24152-ERZJ/test/billede.php on line 16
‰PNG  IHDRýÑÞ_ PLTEÿÿÿÿʒÙIDATxœíÚ1jÃ0€á‡§‡§.Ý=–ܧ÷™DNa:²Ï”:d)jhé÷ƒ,ƒËò˜àûž_Æ—ÈÓ#V"ò ##b[nç[ùy²´I‘ÖîGbZ伏u?EœreÇ`;-û[Öä´HÏZI­§]22·züÞj²_²µi‘˵"£Åèëµ"ã/ëµ÷ó"ýØ“º[Ëc7¶cЖŒŠ´‰¯+¶sÞ"uçÜjòx]Ó"cÙ×øØøúfk\\ƒ¬o}¯ßI‘»Wòî•¿™HDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDä?DòÇ>ë!qqnt¸IEND®B`‚

Fold kodeboks ind/udKode 
User
Bruger #8782 @ 17.03.07 11:37
Fed artikel! 4 herfra!
Jeg har brugt GB-lib lidt, men der er en ting som jeg virkelig prøver at finde ud af..

Hvordan får jeg font'en (skrifttypen) til at blive fx. Tahoma eller Verdana?
Har læst mange engelske guides om det, men kan ikke hitte ud af det!:O
User
Bruger #8985 @ 15.06.07 22:28
Jens > Gå ind i C:\\WINDOWS\\Fonts, og læg fx Tahoma ud på din ftp. Brug dernæst funktionen imagettftext (), til at skrive med Tahoma.
Du skal være logget ind for at skrive en kommentar.
t