48
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.
// Eksempel 1
$im = @imagecreate (400, 400);
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/imagecreateOg så til næste eksempel, hvor jeg viser hvordan man indlæser et, henholdsvis, png og jpeg billede.
// Eksempel 2
$im_png = @imagecreatefrompng ("billede.png");
$im_jpg = @imagecreatefromjpeg ("billede.jpg");
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/imagecreatefrompngSyntax for imagecreatefromjpeg: resource
imagecreatefromjpeg ( string filename)
http://dk2.php.net/imagecreatefromjpegBaggrundsfarve / 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.
// Eksempel 3
// Her sætter vi baggrundsfarven til rød
$background = imagecolorallocate ($im, 255, 0, 0);
// Her sætter vi to farver, sort og hvid
$black = imagecolorallocate ($im, 0, 0, 0);
$white = imagecolorallocate ($im, 255, 255, 255);
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/imagecolorallocateKoordinatsystemet 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).
// Eksempel 4
imagerectangle ($im, 49, 49, 450, 150, $black);
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/imagerectangleKopiering 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).
// Eksempel 5
$im_jpg = imagecreatefromjpeg (”billede.jpg”);
imagecopy ($im, $im_jpg, 50, 50, 0, 0, 400, 100);
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/imagecopyTekst
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.
// Eksempel 6
imagestring ($im, 2, 52, 52, ”Dette er et eksempel”, $white);
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/imagestringAfslutning
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.
// Eksempel 7
imagepng ($im);
imagedestroy ($im);
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” />.
$im = @imagecreate (400, 400);
// Her sætter vi baggrundsfarven til rød
$background = imagecolorallocate ($im, 255, 0, 0);
// Her sætter vi to farver, sort og hvid
$black = imagecolorallocate ($im, 0, 0, 0);
$white = imagecolorallocate ($im, 255, 255, 255);
imagerectangle ($im, 49, 49, 450, 150, $black);
$im_jpg = imagecreatefromjpeg (”billede.jpg”);
imagecopy ($im, $im_jpg, 50, 50, 0, 0, 400, 100);
imagestring ($im, 2, 52, 52, ”Dette er et eksempel”, $white);
imagepng ($im);
imagedestroy ($im);
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)
Billeder kommer snarligt...
Dejlig artikel, virkelig!
4 fra mig!
(bare billederne ville komme snart)
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...
og på billederne
Jeg håber de kommer snart
Juhhuuu... Så kom billederne
...
Det er en fed artikel.. Har altid ønsket mig at lære gd lib... Så tak for det
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
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.
sorry... fejl opdaget og karakter opgraderet, der skete en fejl med " under copy->paste, min fejl har været tidligt oppe
Fatter ik lige skal jeg bare lave et .php dokument og kupere det der ind ????
Dini: Det er en mulighed
For at lave noed alá numsefisk, kan man starte med at sige
http://domæne.dk/din-gd-side.php?navn=heheog 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)
Nice artikel den har virkelig hjulpet meget! 5 fra mig
jeg for bare en masse data:
ÊâÿÚòÿÄaXÈ£`*ˆ0ˆˆ€“î!æîî~ötséÉ_üê“_zêóŸØË®HÜÖµõï¿úò^zá_~òÖkƒÁdx »yÊ
KANON! anede faktisk ikke hvad GD-lib var (eller rettere, anede ikke at dette hed GD-lib)
Må lige prøves
5 herfra!
Buchi, hvis du i topnne af din billedeside tiløjere
header('Content-Type: image/png');
ville det hjælpe, gjorde det ivhertfald hos mig.
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?
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
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œreÇ`;-û[Öä´HÏZI§]22·züÞj²_²µi‘˵"£Åèëµ"ã/ëµ÷ó"ýØ“º[Ëc7¶cЖŒŠ´‰¯+¶sÞ"uçÜjòx]Ó"cÙ×øØøúfk\\ƒ¬o}¯ßI‘»Wòî•¿™HDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDä?DòÇ>ë!qqnt¸IEND®B`‚
<?
header('Content-Type: image/png');
$im = @imagecreate (400, 400);
// Her sætter vi baggrundsfarven til rød
$background = imagecolorallocate ($im, 255, 0, 0);
// Her sætter vi to farver, sort og hvid
$black = imagecolorallocate ($im, 0, 0, 0);
$white = imagecolorallocate ($im, 255, 255, 255);
imagerectangle ($im, 49, 49, 450, 150, $black);
$im_jpg = imagecreatefromjpeg (”Vinter.jpg”);
imagecopy ($im, $im_jpg, 50, 50, 0, 0, 400, 100);
imagestring ($im, 2, 52, 52, "Dette er et eksempel", $white);
imagepng ($im);
imagedestroy ($im);
?>
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!
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.