Tegning anmeldelse php. Oprettelse af en graf ved hjælp af GD-biblioteket

Oprettelse af en linjegraf ved hjælp af GD-biblioteket

For at oprette en linjegraf bør vi blive fortrolige med flere nyttige funktioner i GD-biblioteket. Først og fremmest skal vi bruge værktøjer til at tegne linjer. For at gøre dette er der billedlinjefunktionen (int im, int x1, int y1, int x2, int y2, int col), hvortil du som parametre skal overføre identifikatoren for det allerede oprettede tegneområde, koordinaterne for start- og slutpunkter, samt farven på linjen. Til grafen skal vi bruge koordinatakser, der ender med pile. For at tegne dem skal du bruge en anden funktion, der skaber en lukket polygon af enhver form. Den har følgende opkaldsformat:
billedfyldt polygon(int im, matrixpunkter, int antal_punkter, int col),
hvor im er identifikatoren for tegneområdet, point er en matrix,
indeholdende koordinaterne for polygonpunkterne (arr=x0; arr=y0; arr=x1; osv.),
antal_punkter - antal polygonpunkter,
col - fyldfarve.
En lignende funktion - imagepolygon - er designet til at skabe en ufyldt polygon.

Lad os begynde at skrive manuskriptet. Lad os oprette en ny fil og kalde den line_chart.php. Lad os først definere en funktion til at tegne koordinatakser, hvortil vi vil overføre bredden og højden af ​​tegneområdet. Da vi i fremtiden planlægger at vise etiketter med værdier plottet langs akserne, er det nødvendigt at tage hensyn til denne faktor og følgelig lidt flytte punktet, der angiver oprindelsen af ​​koordinater i forhold til midten. Sådan kan den funktion, du leder efter, se ud:

Funktion draw_axises($im_width,$im_heignt) ( global $im,$black,$l_grey,$x0,$y0,$maxX,$maxY; $x0=25.0; //oprindelse af X-koordinataksen $y0=20.0; / /oprindelse af Y-aksen $maxX=$im_width-$x0; //maksimal værdi af aksen //X-koordinater i pixels $maxY=$im_heignt-$y0 //maksimal værdi af aksen //Y-koordinater i pixels // tegne X-aksens billedlinje($im, $x0, $maxY, $maxX, $maxY, $sort //tegn Y-aksens billedlinje($im, $x0, $y0, $x0, $maxY); , $sort); //tegn en pil på X-aksen $xArrow=$maxX; Y-akse $yArrow=$x0-2; $yArrow=$x0+2; $yArrow=$y0+6;
En anden vigtig egenskab ved en graf er koordinatgitteret. For at oprette den, vil vi skrive en anden funktion, hvortil vi som parametre overfører trinstørrelsen i pixels langs X- og Y-akserne og afstanden mellem gitterlinjer for hver akse: function draw_grid($xStep,$yStep,$xCoef,$ yCoef) (global $im,$sort,$l_grey,$x0,$y0,$maxX,$maxY; $xSteps=($maxX-$x0)/$xStep-1; //bestem antallet af //trin langs X-aksen $ySteps= ($maxY-$y0)/$yStep-1 //bestem antallet //af trin langs Y-aksen //viser gitteret langs X-aksen for($i=1;$; jeg<$xSteps+1;$i++){ imageline($im, $x0+$xStep*$i, $y0, $x0+$xStep*$i,$maxY-1, $l_grey); //при необходимости выводим значения линий сетки по оси X imagestring($im, 1, ($x0+$xStep*$i)-1, $maxY+2, $i*$xCoef, $black); } //выводим сетку по оси Y for($i=1;$i<$ySteps+1;$i++){ imageline($im, $x0+1, $maxY-$yStep*$i, $maxX, $maxY-$yStep*$i, $l_grey); //при необходимости выводим значения линий сетки по оси Y imagestring($im, 1, 0, ($maxY-$yStep*$i)-3, $i*$yCoef, $black); } }
Nu kan du begynde at tegne selve grafen. Et billede vil blive oprettet ved at kalde en separat funktion, som vil modtage arrays af X- og Y-koordinater, antallet af elementer i arrays og farven på den givne graf. Sådan implementeres det: funktion draw_data($data_x,$data_y,$points_count,$color) (global $im,$x0,$y0,$maxY,$scaleX,$scaleY; for($i=1;$i<$points_count;$i++){ //рисуем линейный график по точкам из массивов данных imageline($im, $x0+$data_x[$i-1]*$scaleX, $maxY-$data_y[$i-1]*$scaleY, $x0+$data_x[$i]*$scaleX, $maxY-$data_y[$i]*$scaleY,$color); } }
Så alle underopgaverne ved at lave en graf er løst. Lad os nu bruge de funktioner, vi oprettede, til direkte at skabe et billede: //opret et billede med en bredde på 500 og en højde på 400 pixels $im = @ImageCreate(500, 400); $hvid = ImageColorAllocate($im, 255, 255, 255); $sort = ImageColorAllocate($im, 0, 0, 0); $rød = ImageColorAllocate($im, 255, 0, 0); $grøn = ImageColorAllocate($im, 0, 255, 0); $blå = ImageColorAllocate($im, 0, 0, 255); $yellow = ImageColorAllocate($im, 255, 255, 0); $magenta = ImageColorAllocate($im, 255, 0, 255); $cyan = ImageColorAllocate($im, 0, 255, 255); $l_grey = ImageColorAllocate($im, 221, 221, 221); //tegn koordinatakserne draw_axises(500.400); //sæt diagramdataarrays $x1=1; $y1=1; $x1=2; $y1=4; $x1=3; $y1=8; $x1=4; $y1=16; $x2=1,5; $y2=1; $x2=2,5; $y2=4; $x2=3,5; $y2=8; $x2=4,5; $y2=16; //flet data fra dataarrays //for at beregne skalaen $x=array_merge($x1,$x2); $y=array_merge($y1,$y2); //hent de maksimale værdier // af elementer for hvert array $maxXVal=max($x); $maxYVal=max($y); //beregn skalaen for datatransformation //ind i koordinaterne for arbejdsområdet $scaleX=($maxX-$x0)/$maxXVal; $scaleY=($maxY-$y0)/$maxYVal; //indstil trinnet for koordinatgitteret i pixels $xStep=30; $yStep=30; //tegn et koordinatgitter draw_grid($xStep,$yStep, round($xStep/$scaleX,1), round($yStep/$scaleY,1), true); //tegn den første graf draw_data($x1,$y1,4,$red); //tegn den anden graf draw_data($x2,$y2,4,$blue); //vis billedet Header("Content-Type: image/png"); ImagePNG($im); //frigør hukommelsen optaget af billedet imagedestroy($im);

Viser grafen i browseren: echo "

";

For at identificere brugen af ​​grafikværktøjer i webscenarier skal du overveje følgende række mulige grafikanvendelsessager:

  • Statiske billeder, oprettet uafhængigt eller lånt et sted fra, kan indlejres i en HTML-side.
  • Programmatisk genererede billeder (HTML + CSS) kan bruges.
  • Du kan bruge gd-biblioteket til at præ-skabe statisk grafik til alle mulige situationer, der kan opstå under et scripts udførelse, gemme dem i filer og vise dem betinget.

Vi vil ikke overveje muligheden for at implementere grafik ved hjælp af statiske billeder på grund af dens enkelhed, så først vil vi overveje en simpel mulighed (HTML + CSS-grafik), og derefter vil vi overveje at bruge gd-biblioteket i PHP.

Grafik HTML + CSS

Besøgende på webstedet er bekendt med vandrette søjlediagrammer med farvede sider, som især ofte bruges til at illustrere undersøgelsesresultater. Ved første øjekast ser det ud til, at der bruges en form for grafiske værktøjer til at skabe sådanne diagrammer, men i virkeligheden er det nok at bruge et par enkle scripts:

" . $ex->getMessage() .""; } } ?> Arbejde med grafik i PHP, HTML, CSS

Bestillingsblanket

Frugter
Grøntsager
Du bestilte:Appelsiner:

Æbler:

Bananer:

Tomater:

Agurker:

Kartoffel:

EOT; ?>

Dette eksempel viser ingen nye funktioner i PHP, men viser blot en enkel måde at skabe grafik ved hjælp af HTML og CSS (i dette tilfælde søjlediagrammer):

gd bibliotek

De grafikværktøjer, der er beskrevet i det foregående afsnit, udtømmer praktisk talt funktionerne i standard HTML-kode (selvom det er værd at bemærke, at vi ikke dækkede det ret kraftfulde HTML5 Canvas grafikværktøj). Lad os nu gå videre til at beskrive metoder til at skabe virkelig vilkårlig grafik ved hjælp af gd-biblioteket.

Generel beskrivelse af gd-biblioteket

Generelt er gd-værktøjssættet et bibliotek med C-kode til at skabe og manipulere billeder. Dette bibliotek blev oprindeligt udviklet og gjort tilgængeligt for offentligheden af ​​de talentfulde og generøse medarbejdere på Boutell.com.

Selve gd-biblioteket er ikke et grafik- eller tegneprogram, og det udgør heller ikke et selvstændigt program eller en grafisk brugergrænseflade. I stedet giver gd-biblioteket funktioner, der kan kaldes af ethvert program for at udføre den ønskede billedmanipulation. Det betyder, at gd-biblioteket kan linkes til ethvert C-program, hvor det er nødvendigt at bruge koden til dette bibliotek. Det er præcis det problem, som udviklerne af PHP-systemet løste.

Faktisk er der skrevet et sæt grænsefladefunktioner til dette formål, som gør det nemt at kalde gd-procedurer fra et PHP-script. Men selve gd-biblioteket indeholder ikke nogen PHP-specifik kode, og der er udviklet grænseflader, så biblioteket kan tilgås fra flere andre programmeringssprog og programmeringsmiljøer, herunder Perl, Pascal, Haskell og REXX.

gd-biblioteket giver dig mulighed for at kalde funktioner til at oprette kildebilleder (i første omgang tomme, der ligner et blankt ark papir), tegne og tegne i disse kildebilleder på en række forskellige måder og i sidste ende konvertere billedet fra gd's interne billedformat til et standard billedformat, og send det derefter til den endelige destination (output i et browservindue eller gem i en fil eller database). Og da alle disse operationer udføres under programmets kontrol og ikke udføres manuelt, kan de oprettede billeder blive så komplekse som ønsket og afhænge af enhver situation under udførelsen af ​​programmet, som det er ønskeligt at gøre dem afhængige af.

Billedformater

Gd-biblioteket giver dig grundlæggende mulighed for at importere og eksportere billeder ved hjælp af en lang række formater. De mest populære billedformater er GIF, JPEG og PNG, selvom de anvendte eksempler primært bruger sidstnævnte.

GIF- og PNG-formaterne er beregnet til at beskrive et gitter af farvede elementer, der svarer til pixels, med nogle tilføjelser. Den første tilføjelse er, at celler kan indeholde faktiske farvenumre eller indekser i en tabel med farvenumre. (Den første mulighed giver dig mulighed for at skabe mere udtryksfulde billeder, da den giver dig mulighed for at give et vilkårligt antal forskellige farver, og den sidste mulighed hjælper dig med at skabe mere kompakte billeder.)

Den anden tilføjelse er som følger. Selvfølgelig er den konceptuelle repræsentation af GIF- og PNG-formaterne ret enkel, men i praksis foregår læsning, skrivning og transmission af billeder i disse formater altid i en komprimeret form. Kompression er nødvendig, fordi lagring af data repræsenteret som et gitter af celler kræver en stor mængde hukommelse. Et simpelt billede på 500x400 pixel indeholder 200.000 pixel, og hvis hver pixel kræver tre bytes, er den nødvendige mængde hukommelse allerede over en halv megabyte.

Emnet komprimering er bredt og komplekst, men de fleste komprimeringsalgoritmer er baseret på at reducere billedredundans for at reducere dets størrelse. (For eksempel vil det tage mindre hukommelsesplads at angive, at hver pixel i et billede er grøn, end at angive den grønne værdi for hver pixel individuelt). Desværre er komprimeringsalgoritmer ikke afhængige af at bruge disse egenskaber, fordi de skal beslutte sådanne komplekse problemer, at metoderne til at løse disse problemer, implementeret i komprimeringsalgoritmen, der bruges til at generere billeder i GIF-formatet, endda er blevet patenteret.

Installation af biblioteket

Helt ærligt, opgaven med at installere gd-biblioteket og få det til at fungere med succes i forbindelse med et PHP-system er ret kompleks. Dette skyldes ikke nogen mangler i PHP- eller gd-softwaren, men er udelukkende på grund af konfigurationsproblemer; især skal du forstå, hvor gd-bibliotekerne skal være og faktisk er, og sikre, at kompilerings- og linktrinene for alle eksekverbare filer er gennemført korrekt. Derfor er den bedst mulige situation, at brugeren opdager, at gd-biblioteket allerede er installeret og gd-support allerede er aktiveret i PHP-systemet (enten med tilladelse fra webhostingfirmaet eller fordi det er inkluderet i installeret PHP-system).

Derfor skal installationen af ​​gd-biblioteket begynde fra trin nul - ved at tjekke om dette bibliotek allerede er installeret. Indtast først følgende kode i din scriptfil og se resultaterne af at køre den i din browser, uanset om dine scripts køres af dit webhostingfirma eller køres udelukkende af din egen installation:

Når du har vist denne side på skærmen, skal du blot søge efter tekststrengen "gd" i browservinduet. Dette skulle afsløre et underafsnit, der beskriver, i hvilket omfang din PHP-installation tillader understøttelse af gd-biblioteket. Hvis du kun har til hensigt at forberede bestemte typer billeder (for eksempel PNG), og resultaterne af phpinfo()-funktionen indikerer, at understøttelse af den type billeder er aktiveret, kan du komme i gang med det samme. Og hvis gd-versionsinformationen indeholder ordet "bundled", så bruges gd-biblioteket, der følger med PHP.

Hvis et forsøg på at finde en omtale af gd-biblioteket ender med at mislykkes, og du selv installerer PHP, så kan du installere og konfigurere gd-bibliotekets konfiguration. (På den anden side, hvis din PHP-installation håndteres af dit hostingfirma, er dine eneste muligheder at bede virksomheden om at yde support til gd-biblioteket eller bruge et andet webhostingfirma.)

Brug af gd-biblioteket, der følger med PHP, eliminerer mange af besværet forbundet med at installere gd, men ikke alle. Faktum er, at brug af selve versionen inkluderet i distributionssættet giver dig mulighed for at få gd-biblioteket, men ikke nødvendigvis alle de biblioteker, der er nødvendige for, at gd kan fungere. Selve gd-biblioteket afhænger af flere andre biblioteker: libpng (til at manipulere PNG-billeder), zlib (til komprimering) og jpeg-6b eller nyere (til at manipulere JPEG-billeder, hvis det er nødvendigt). Disse biblioteker er allerede til stede i mange Linux-installationer, i hvilket tilfælde det kan være tilstrækkeligt at inkludere den nødvendige med option (såsom --with-zlib) i indstillingerne uden at specificere installationsmappen. Hvis du selv laver PHP-konfigurationen, kan du blot tilføje --with-gd-indstillingen for at sikre, at den inkluderede version af gd er inkluderet i den eksekverbare. Og hvis du vil pege på en anden version, skal du bruge --with-gd=path muligheden i stedet.

Hvis du opdager, at et eller flere nødvendige biblioteker mangler, betyder det, at disse biblioteker skal bygges separat. For information om, hvor du kan finde aktuelle versioner, kan du starte med at gennemgå dokumentationen på www.libgd.org.

Grundlæggende principper for at arbejde med gd-biblioteket

Når du opretter eller manipulerer et billede ved hjælp af gd-værktøjssættet, er billedet repræsenteret i et specielt gd-format, der ikke svarer til nogen konventionel billedtype. Det er teoretisk muligt at eksportere billeder i dette gd-format, men en sådan operation bruges sjældent, fordi det resulterende billede ikke er komprimeret og ikke kan vises i en browser eller et simpelt grafikprogram.

Et billede, der behandles ved hjælp af gd-værktøjssættet, er kendetegnet ved information om bredden, højden og farven på alle pixels, hvis antal er lig med produktet af bredde og højde. Typisk begynder et program sin interaktion med gd-biblioteket ved enten at skabe et nyt tomt billede (som det kan tegne og tegne på), eller ved at importere et billede fra en fil. Følgende trin udføres normalt: for det første fordelingen af ​​farver i billedet, for det andet tegning og maling eller manipulering af billedet ved hjælp af nogle andre handlinger, for det tredje konvertering af billedet til et generelt accepteret format (f.eks. PNG eller JPEG) og overføre det til sin destination.

Repræsentation af farver

Der er to måder at repræsentere farver på i gd-billeder: en paletbaseret repræsentation, som er begrænset til 256 farver, og en ægte farverepræsentation, som giver dig mulighed for at angive et vilkårligt antal forskellige RBG-farvenumre. I gd 1.x var den eneste mulighed at bruge palettebaserede farver, men i gd 2.x og versionen af ​​dette bibliotek, der følger med PHP, er det muligt at lave både palettebaserede billeder og billeder i realistiske farver. En ting at huske på er, at ethvert givet gd-billede skal enten være palettebaseret eller have naturtro farver (RGB); det betyder, at der ikke er nogen mulighed for at introducere realistiske farver i billeder baseret på en palet.

For at få det originale tomme billede baseret på paletten, skal du kalde funktionen ImageCreate(), og den dag billedet modtages i realistiske farver, bruges funktionen ImageCreateTrueColor().

Palette-baserede billeder

Farverne er angivet i Red-Green-Blue (RGB)-formatet ved hjælp af tre tal fra 0 til 255. For eksempel er farven angivet af tallene (255, 0, 0) lys rød, farven ( 0, 255, 0) - grøn, farve (0, 0, 255) - blå, farve (0, 0, 0) - sort, farve (255, 255, 255) - hvid og farve (127, 127, 127) - grå. Ved at skabe flere og flere nye farver kan du vælge værdierne for de tre farvekomponenter vilkårligt.

Enhver tegning på et billede skal udføres med en bestemt farve, og farverne skal fordeles i billedet, før de tages i brug. Derudover bliver den første farve, der distribueres i billedet, automatisk baggrundsfarven. Så du bør under ingen omstændigheder antage, at du kan undvære at angive farver, og normalt er operationen med at distribuere farver den første operation efter at have oprettet et nyt tomt billede.

Farver i paletbaserede billeder oprettes ved hjælp af funktionen imagecolorallocate(), der tager et billede (oprettet tidligere) som parametre og tre heltal, der angiver forholdet mellem rød, grøn og blå. Returværdien er et heltal, der angiver indekset for den nye farve i billedets interne palet. Denne returværdi skal tildeles en variabel, fordi den angivne indeksværdi er nødvendig for at udføre alle fremtidige operationer med denne farve.

Palettebaserede billeder kan have et maksimalt antal farver på 256. (Læseren er måske eller måske ikke interesseret i, hvad sådanne billeder faktisk er baseret på, men hver pixel i et paletbaseret billede er faktisk en enkelt byte, der gemmer indekset af ét element i paletten med 256 farver.)

Bemærk, at det indeks, der returneres, når en af ​​farverne i et billede distribueres, kun har betydning for det billede. For eksempel, hvis et PHP-script tildeler $sort til en farve distribueret i ét billede, så giver det ingen mening at bruge den variabel som farveinput til en tegnekommando kaldet til at behandle et andet billede.

Billeder med realistiske farver

gd 2.0 og nyere giver også mulighed for at skabe ikke-palette-baserede billeder, hvor hver pixel gemmer et vilkårligt RGB-farvenummer. I dette såkaldte ægte farveformat er antallet af mulige farver ekstremt stort. Denne funktion udvider ikke kun omfanget af kunstneriske udtryk ubegrænset, men den giver dig også mulighed for at gengive PNG- og JPEG-billeder trofast med naturtro farver indlæst i hukommelsen ved hjælp af gd-værktøjssættet.

Bortset fra at der bruges en anden funktion til at skabe det oprindelige billede, og der ikke er nogen begrænsninger for valg af forskellige farver, er principperne for at arbejde med ægte farver billeder de samme som for palettebaserede billeder.

Især kan du stadig kalde ImageColorAllocate() for at skabe nye farver og tildele en variabel returværdien til senere brug i tegnekommandoer. Den eneste forskel er, at returværdien er RGB-farvenummeret, ikke indekset for elementet i paletten. Derudover er der i billeder med naturtro farver ikke noget koncept for en baggrundsfarve oprettet som en bivirkning af funktionen ImageColorAllocate(); Som et resultat af initialisering tildeles alle pixels betegnelsen sort (0, 0, 0).

Gennemsigtighed

Versioner af gd 2.x understøtter begrebet gennemsigtighed. Dette bruger en alfakanal (ud over de røde, grønne og blå værdier) til at angive, hvor gennemsigtig farven er. Dette tillader f.eks. en form at blive overlejret på en anden, således at den første form forbliver delvist synlig i stedet for fuldstændigt at overlappe den anden.

I PHP har mange funktioner til at arbejde med billeder en analog, der indeholder ordet "alpha" i navnet, hvilket indikerer, at i disse funktioner er farve repræsenteret af fire værdier (R, G, B, A). For eksempel tager funktionen imageColorAllocate() tre parametre, og når funktionen kaldes ImageColorAllocateAlpha() du skal indstille en fjerde parameter med en værdi mellem 0 og 127. En værdi på nul angiver, at farven er fuldstændig uigennemsigtig, og en værdi på 127 angiver, at farven er fuldstændig gennemsigtig.

Koordinater og tegnekommandoer

Efter at have oprettet et billede ved hjælp af gd-værktøjssættet, oprettes der implicit et koordinatsystem, der giver dig mulighed for at angive tegnekommandoer i det. De begrænsende koordinatværdier i dette system bestemmes af de angivne parametre for billedets bredde og højde.

Koordinaternes oprindelse i dette system, svarende til koordinaterne (0, 0), er placeret i øverste venstre hjørne af billedet. Den positive retning for X-værdier er fra venstre mod højre, og for Y-værdier er den fra top til bund. (I computergrafikkoordinatsystemer er denne placering af oprindelsen almindelig, men de, der har studeret analytisk geometri, ser ud til at være vant til, at oprindelsen er i det nederste venstre hjørne af diagrammet.)

Antallet af tegnekommandoer er meget stort. Disse kommandoer inkluderer, men er ikke begrænset til, kommandoer til at tegne linjesegmenter, rektangler og buer, samt kommandoer til indstilling af specifikke pixelværdier. Men husk på, at slutresultatet af alle disse tegne- og plotkommandoer er at indstille pixelværdier. Efter at have udført kommandoer, der ændrer pixelværdier, er der ingen spor tilbage i hukommelsen (ud over de ændrede værdier selv), så der er ingen måde at tilsidesætte tegne- og plotkommandoer eller at præsentere resultaterne af forskellige kommandoer separat.

Der er intet til hinder for tegnekommandoer, der strækker sig ud over det angivne billede, men en sådan tegning har ingen synlig effekt. For eksempel vil et rektangel ikke være synligt på billedet, hvis alle koordinatværdier er negative.

Formatkonvertering

Alle tegnings- og billedmanipulationsoperationer udføres på billedet repræsenteret i det interne gd-format. Og efter at disse operationer er afsluttet, kan scriptet kalde en af ​​konverterings- og outputkommandoerne (imagepng, imagetjpeg osv.) for at konvertere dette billede til det påkrævede grafiske format og udlæse det til brugerens browservindue (eller til en fil).

Frigør ressourcer

Når resultatet af konverteringen af ​​det færdige gd-billede er overført til brugeren, kan vi overveje, at arbejdet med den interne version er afsluttet. Det betyder, at denne version skal destrueres. Den korrekte måde at udføre en sådan operation på er at kalde funktionen imagedestroy() angive billedet som en parameter.

gd biblioteksfunktioner

Vi vil ikke separat liste og beskrive i denne artikel alle funktionerne i PHP-fortolkerens gd-grænseflade. For at gøre dig bekendt med denne information, anbefaler vi at bruge afsnittet "Billedbehandling og -generering" i php.net-manualen. De fleste gd-funktioner falder ind under en af ​​kategorierne vist i tabellen nedenfor. Bemærk, at funktionsnavnene i denne tabel er med stort for at gøre det første bogstav i hvert ord lettere at læse, men denne betingelse overholdes ikke altid i kodeeksemplerne, fordi PHP-funktionsnavne ikke skelner mellem store og små bogstaver:

Klassificering af gd-funktioner

Type Eksempel Bemærk
Funktioner til billedoprettelse ImageCreate(), ImageCreateTruecolor(), ImageCreateFromGd(), ImageCreateFromJpeg() Returner et nyt gd-billede. ImageCreate()-funktionen tager som parametre billedets bredde og højde, og parametrene for andre funktioner er en filsti, URL eller en streng, der indeholder et tidligere oprettet billede, der skal indlæses og konverteres til gd-format
Funktioner, der udfører farvefordelingsoperationer ImageColorAllocate(), ImageColorAllocateAlpha(), ImageColorDeallocate() ImageColorAllocate()-funktionen tager et billedhåndtag og de nødvendige værdier af rød, grøn og blå som parametre, og returnerer derefter et farvenummer til senere brug i tegne- og plotoperationer. ImageColorAllocateAlpha-funktionen accepterer en ekstra parameter - gennemsigtighedskoefficient (0-127)
Funktioner, der udfører farvetilpasning ImageColorClosest(), ImageColorClosestAlpha(), ImageColorExact(), ImageColorExactAlpha() Returner indekset for den matchende farve i det palettede billede. Funktioner, der indeholder ordet "Tættest" i deres navn, returnerer den mest matchede farve (matchningsnøjagtighed måles som afstanden mellem punkter i RGB-værdirummet); funktioner med betegnelsen "Exact" returnerer kun farvenummeret, hvis det er identisk med det søgte, ellers returnerer de værdien -1, funktioner med navnet "Alpha" fungerer på farver, som bestemmes ved hjælp af fire værdier (med gennemsigtige farver)
Linjetegningsfunktioner ImageLine(), ImageDashedLine(), ImageRectangle(), ImagePolygon(), ImageEllipse(), ImageArc() De bruges til at tegne lige segmenter eller kurver af den angivne form. Typisk er den første parameter for hver af disse funktioner billedet, den sidste parameter er farven, og de mellemliggende parametre er X- og Y-koordinaterne.
Indstillinger for linjetegning ImageSetStyle(), ImageSetThickness() Skift indstillinger, der påvirker karakteristikaene for de linjer, der produceres af efterfølgende linjetegningskommandoer (nogle af disse funktioner gælder kun for gd 2.0.1 eller nyere versioner)
Tegne- og udfyldningsfunktioner ImageFilledRectangle(), ImageFilledEllipse(), ImageFilledPolygon(), ImageFilledArc(), ImageFill() Som regel ligner de de tilsvarende funktioner til at tegne linjer, men de giver ikke kun mulighed for at tegne konturerne af områder, men også til at fylde de oprettede områder med farve. Den specielle funktion ImageFill() udfører en udfyldningsoperation ved hjælp af en specificeret udfyldningsfarve. Fyldning udføres i alle retninger startende fra de specificerede XY-koordinater (nogle af disse funktioner kræver gd 2.0.1 eller nyere)
Funktioner til at arbejde med tekst ImageString(), ImageLoadFont() ImageString-funktionen tager som parametre et billedhåndtag, skrifttypenummer, X- og Y-koordinater, en tekststreng og en farve. Hvis skrifttypenummeret er mellem 1 og 5, så bruges en af ​​de fem indbyggede skrifttyper til at vise linjen i denne farve. På den anden side angiver et skriftnummer større end 5 resultatet af indlæsning af en specialiseret skrifttype ved hjælp af funktionen ImageLoadFont()
Eksporter funktioner ImagePng(), ImageJpeg() Konverter det interne gd-billede til et billede i det passende format, og send derefter dette billede til outputstrømmen. Hvis der kun er angivet én parameter (billedhåndtaget), bliver billedet ekkoet til brugeren, og hvis der bruges en ekstra parameter, som er en filsti, bliver destinationen for outputstrømmen filen
Billeddestruktionsfunktion ImageDestroy() Tager et billedhåndtag som parameter og frigiver alle ressourcer forbundet med billedet

Understøttelse af HTTP-billeder

For at et billede kan præsenteres korrekt i brugerens browser, er det nødvendigt at angive, hvor billedet skal komme fra, og hvad dets format er. Derfor er det desværre ikke muligt blot at implementere for eksempel et kald til funktionen imageToPng() i den genererede HTML-fil og derved løse problemet med at vise billedet. I det væsentlige skal du sammenflette billedoutputkoden med HTML-koden, der er genereret i PHP-scriptet, og for at gøre dette kan du bruge en af ​​de tre muligheder, der er beskrevet nedenfor.

Oprettelse af fuldsidebilleder

Hele den genererede side kan formateres som et billede. I dette tilfælde skal du sende en HTTP-header forud for billeddataene og derved erklære, at det følgende er et billede af en bestemt type. For eksempel kan følgende linjer være angivet i slutningen af ​​scriptet:

// ... kode, der opretter et billede og tildeler det // til variablen $image header("Content-type: image/png"); // Vis titlen i browseren imagepng($image); // Send dataene fra selve billedet, konverteret til PNG-format imagedestroy($image); // Frigiv ressourcer

Fordelen ved denne tilgang er, at enhver information, herunder POST-parametre, kan bruges til at formidle instruktioner om sammensætningen af ​​det fremtidige billede. Ulempen er, at den resulterende side ikke kan indeholde nogen almindelig HTML-kode. Faktisk skal du endda passe på ikke at sende noget tekstoutput før titlen og billedet i scripts, da dette er ensbetydende med at sende indholdet for tidligt. I dette tilfælde vises fejlmeddelelsen "Overskrifter allerede sendt...".

Indlejring af billeder gemt i filer

Bemærk først og fremmest, at HTML understøtter deskriptoren , som giver dig mulighed for at integrere et billede ved at angive billedfilstien eller URL-adressen, som i følgende eksempel:

Dette design gælder for statiske billedfiler, men der er ingen grund til, at det ikke kunne aktivere indlejring af et nyoprettet billede. Derfor kan du forberede et script, hvor et billede først oprettes, derefter skrives billeddataene til en lokal fil, og derefter genereres HTML-koden med den tilsvarende deskriptor , og peger på den nyoprettede fil.

De eneste ulemper ved denne tilgang er, at for det første skal sideoprettelsesprocessen omfatte filskrivning, hvilket kan være tidskrævende, og for det andet skal du bestemme, hvad du skal gøre med filerne, når du er færdig med at bruge dem.

Men i en bestemt situation er denne tilgang ideel. Det handler om at skabe og cache billeder, der repræsenterer et begrænset sæt valgmuligheder. I dette tilfælde er der en specifik måde at knytte en bestemt situation til navnet på billedfilen. Når nogle af disse situationer opstår, der kræver, at et billede skal udskrives, kontrolleres det for at se, om der allerede findes en tilsvarende fil. Hvis svaret er positivt, anvendes et link til denne fil, formateret som en deskriptor , og hvis svaret er nej, så oprettes et billede, skrives til en fil, og derefter anvendes et link til dette billede igen. I sidste ende vil det simpelthen ikke være nødvendigt at oprette nye filer.

Indlejring af billeder genereret i scripts

Endelig er der ingen grund til, hvorfor du ikke kunne levere et selvstændigt billedscript og derefter indlejre det resulterende billede på en dynamisk side genereret af et andet script ved at specificere i deskriptoren URL for dette script. Den eneste vanskelighed er at vælge, hvordan man overfører de nødvendige data til den afhængige side. For eksempel kan et håndtag, der angiver et indlejret billede, se sådan ud:

I dette tilfælde returnerer ballpage.php-scriptet PNG-billeder af farvede kugler placeret på forskellige positioner i billedet.

Men at bruge denne tilgang kan forårsage problemer, fordi webservere og browsere nogle gange kontrollerer suffikserne for de filer, der behandles, og når de modtager resultaterne af kontrollen, reagerer de anderledes på dem. For eksempel skal ballpage-gengivelsesscriptet muligvis have en .php-udvidelse, så Apache-serveren kan bestemme, at serverkoden skal fortolkes som PHP-kode (selvom den påkrævede behandlingstilstand også kan specificeres gennem konfigurationsfiler).

Der er dog også ikke-standardversioner af browsere, der ikke tager højde for muligheden for, at en fil med en .php-udvidelse producerer et billede, selvom den beståede header indikerer, at et billede følger efter. Derfor, når du bruger denne metode, skal du teste scripts i forskellige browsere og sikre dig, at den påtænkte kreds af brugere vil modtage siderne i den form, du havde til hensigt.

Nedenfor er eksempler på brug af gd-biblioteket til at skabe billeder.

Et eksempel på brug af gd-biblioteket: skabe simple former

I det følgende eksempel vil vi vise, hvordan man bruger gd-biblioteket til at generere en tegning, der indeholder simple geometriske former:

Et eksempel på brug af gd-biblioteket: fraktale billeder

Der har allerede været en vidunderlig tradition for at udsmykke præsentationen af ​​emnet at tegne linjer, hvilket i princippet kan virke uinteressant, ved at bruge fraktaler som eksempel. Eksemplet nedenfor viser ikke kun, hvordan man skaber et komplekst billede programmatisk, men fungerer også som en god demonstration af PHP-sprogets muligheder. Faktum er, at arrays og løse datatyper i dette sprog gør det meget nemt at skabe komplekse datastrukturer svarende til fraktale billeder uden at bruge et stort antal deklarationer.

En fraktal er en geometrisk form, der ligner sig selv. Det betyder, at dele af en fraktal har en lignende form som hele fraktalen, dele af disse dele har også en lignende form osv.

I teorien kunne man anvende forstørrelsesoperationen på en ideel fraktal et ubegrænset antal gange og skabe mindre og mindre stykker, mens man fortsætter med at finde gentagelser af de samme mønstre. Men i praksis degenererer computergenererede fraktaler, efter at have brugt et vist begrænset antal deldannende operationer, til ikke-fraktale former, såsom almindelige segmenter af kurver og lige linjer.

Et eksempel på den type billede, vi vil forsøge at skabe, er vist på billedet nedenfor:

Selvfølgelig skabes ved første øjekast indtrykket af en kontinuerlig kurve, men dette billede er simpelthen en samling af et stort antal små lige segmenter, hvis endepunkter er forbundet i form af en lukket brudt linje.

Vores opgave er at beregne koordinaterne for endepunkterne for alle disse linjesegmenter, og derefter repræsentere alle linjesegmenterne korrekt som et PNG-billede. Vi kunne simpelthen have samlet ét fragment af et fraktalbillede, men vi besluttede at sætte os selv en mere kompleks opgave - ikke kun at levere output fra et fraktalbillede, men også at skabe en lille infrastruktur, der gør det muligt for os nemt at variere fraktalparametrene og skabe billeder af nye typer.

Lad os først forberede visse datastrukturer, der tillader os at repræsentere de komplekse former, der vises. Sådanne datastrukturer bør ikke kun give mellemliggende beregninger, men også tegning af segmenter, hvis position og længde bestemmes af de opnåede endelige resultater. Først og fremmest, lad os lave nogle ret vilkårlige antagelser:

  • et punkt i koordinatsystemet er angivet med et par tal;
  • stien er repræsenteret som en liste over punkter.

I sidste ende, for at tegne en brudt linje, er det nødvendigt at tegne lige segmenter mellem alle punkter på linjen. Hvis det var nødvendigt at tegne et enkelt linjestykke, så kunne denne opgave repræsenteres som at tegne en brudt linje, der passerer gennem to punkter, og at tegne et rektangel kunne repræsenteres som at skabe et billede af en brudt linje, der går gennem fem punkter (givet at startpunktet optræder to gange i en stiplet linje, og når det dukker op igen, lukker rektanglet). (I dette tilfælde kunne man betragte et lige linjesegment som et primitivt objekt, men tilsyneladende, når man løser problemet med at skabe fraktale billeder, er en repræsentation i form af en brudt linje mere kortfattet.)

Overvej nu spørgsmålet om, hvordan punkter og polylinjer skal repræsenteres. Den nemmeste måde at repræsentere lister over objekter på er i PHP ved hjælp af arrays. Lad os derfor tage udgangspunkt i, at et punkt er en matrix, der omfatter to tal, og en stiplet linje er en matrix, der indeholder et antal punkter. Denne tilgang bør resultere i strukturer, der er flerdimensionelle PHP-arrays, men hvis vi kan definere konstruktør- og accessorfunktioner med navne, der er nemme at huske, kan vi glemme, hvor komplekse disse strukturer er, og bare designe kode ved hjælp af sådanne operationer, som om disse strukturer repræsenterede virkelige datatyper.

Koden til at oprette billedet vist på billedet ovenfor er givet nedenfor. Den definerer datatyper i forhold til deres oprettelsesfunktioner (hvis navne begynder med præfikset make ), funktioner designet til at få adgang til komponenter i datastrukturer og funktioner, der giver visning af billeder baseret på data (disse funktionsnavne begynder med præfikset visning). Når du bruger denne tilgang, er der ingen mulighed for at vise punkter på skærmen, så der er ingen outputfunktioner for dem, og polylinjer tegnes ved at tegne lige segmenter mellem på hinanden følgende par af punkter.

Funktionen transform_path() tager den oprindelige polylinjedefinition som sin første parameter, og som sin anden parameter navnet på funktionen, som igen tager polylinjedefinitionen som en parameter og returnerer den transformerede polylinjedefinition som et resultat. Den tredje parameter i transform_path()-funktionen er multipliciteten af ​​den sekventielle anvendelse af denne funktion til at transformere en polylinje til en anden for at skabe en ny polylinje. Grunden til, at det gav mening at introducere en andenordens funktion som denne, er, at det ellers kunne være nødvendigt at oprette en ny round-robin funktion, hver gang en ny fraktal skal dannes. Ved at bruge denne fremgangsmåde kan du samle forskellige dele af fraktalgenereringskoden i en separat funktion, der kan overføres til transform_path()-funktionen og undgå dobbeltarbejde.

Spike-funktionen tager som parameter en definition af en polylinje og returnerer en anden definition af en polylinje, hvor hvert lige linjesegment, der går gennem to punkter, erstattes af en polylinje, der går gennem fem punkter med en top i midten. Og top-hat-funktionen udfører en nogenlunde lignende handling, bortset fra at den resulterende polylinje passerer gennem seks punkter, og den resulterende top er rektangulær i form. Derudover indeholder dette eksempel flere funktioner til at skabe polylinjer med standarddimensioner, hvor vinklerne mellem segmenterne er rette; Disse funktioner er beregnet til at blive brugt som typiske eksempler.

Efter at have indlæst alle funktionsdefinitionerne fra include-filerne, opretter denne kode et gd-billede med den givne højde og bredde og distribuerer derefter farverne i det billede. (Baggrunden er hvid, og de lige segmenter er sorte.)

Udførelse af fraktalbilledgenereringskoden begynder med skabelsen af ​​en standard lukket polylinje med en rektangulær form, der passerer gennem fem punkter og derfor inkluderer fire (implicit specificerede) lige linjesegmenter. Denne polylinjedefinition sendes derefter til transform_path() som et funktionskald med parametre, der specificerer, at polylinjedefinitionen, der er resultatet af at anvende spike() til det givne rektangel fire gange, skal returneres. Transformationen af ​​en lukket rektangulær polylinje begynder med at behandle fire lige segmenter, og hvert segment erstattes af fire segmenter. Derfor dannes der som et resultat af fire på hinanden følgende iterationer henholdsvis 16, 64, 256 og 1024 segmenter.

Efter dette er der kun tilbage at vise den dannede komplekse lukkede polylinje på skærmen. For at tegne alle linjesegmenterne i billedet kaldes display_path()-funktionen defineret i denne kode, en HTTP-header sendes, der angiver, at det følgende er et PNG-billede, imagepng()-funktionen kaldes til at transformere og udlæse, og derefter den interne gd-billeddefinition er ødelagt:

Disse billeder kan tage lang tid at generere og vise, og den brugte tid stiger, efterhånden som antallet af genererede linjesegmenter stiger, så webserveren kan timeout for scriptet, mens billedet stadig genereres. For at komme ud af denne situation kan du enten reducere antallet af generationstrin i den fraktale billedoprettelseskode eller øge timeoutværdierne i webserveren eller PHP-fortolkerens konfigurationsfiler.

Selvfølgelig grænser eksperimentering med kode til at skabe fraktale billeder til kunst, og de ydmyge forfattere af denne artikel betragter ikke sig selv som virkelig talentfulde kunstnere. Men vi kan ønske læserne held og lykke med at forbedre sådanne billeder.


Du ved, gamle mand, jeg har ikke set noget lignende i lang tid. Det virkede endda som om, jeg måtte opgive anime. Alderdommen sneg sig ubemærket frem, og alle disse drenge med skydende sværd og piger med animeret hår smeltede sammen til en solid klæbrig masse. Det begyndte at se ud til, at alle karaktererne kun talte dumt, kun højt og kun om det evige. Og alt bobler af pelsfantastisk ungdommelig sindssyge, wow!.. Og hvor er jeg glad for, at jeg fandt “Teater...”. Hvordan ser det ud? På, som vi er vant til at se hende – ikke for meget. Det vil sige panache – ja, selvfølgelig. Og med hensyn til humør er det mere "som" "," sandsynligvis. Eller til gamle georgiske kortfilm (kan du huske dem?), som er "endelig for livet." Alle mulige forskellige mennesker, unge og tværtimod, snakker, lever, lærer hinanden at kende, arbejder... Selvfølgelig blev der taget et vist nøglemoment for plottet, ikke det mest rutineprægede. Men det er så rart, at netop dette nøgleøjeblik ikke er det første kys eller erhvervelsen af ​​mystisk magt, men for eksempel at møde klassekammerater mange år senere, eller blive fyret fra et velbetalt job, eller møde sin svigermor . "Er der liv efter 30?", ikke? Jeg kan godt lide at tro, der er. Og jeg elsker, at Rumiko Takahashi også synes det.

Skrig ikke, killing, jeg varer ikke længe. Jeg er allerede ved at tjekke det ud. Og generelt, hvad betyder "min computer"?! Hvor er min så?.. Jeg har også brug for at se en anime eller to nogle gange. Se, jeg smed alle "" og ""... Er det muligt, undrer man sig, at have fred én gang i mit liv?! Hvad kigger jeg på? "Rumiko Takahashi Theatre", der er kasser derovre... Hvorfor "holy shit", kanin? For det første er det ikke gammelt, det er kun 2003, og for det andet kan du lide "", "" du læser med fornøjelse - mangakaen er den samme, men du kan ikke drikke dygtigheden, bogfink. Takahashi-san er fremragende til at tegne og opfinde intriger... Hvorfor er serien så kort? Og dette er ikke en serie, det er et sæt kortfilm - med separate plots, med forskellige karakterer. Sjovt eller tårevækkende? Begge - ser du, det er skrevet: "drama", "komedie", "hverdag"... Kan du ikke lide "hverdag"? Sig det ikke, lille top, ellers elsker hun dig heller ikke. En god hverdag er en stor ting! Lad mig vise dig, hvordan de i den japanske khrushchev gemte en pingvin for sine naboer. En serie til min mor, som i barndommen, og jeg går og laver aftensmad, okay?

Jeg græd bare, helt ærligt! Jeg troede aldrig, at jeg ville være i stand til at relatere til sådanne emner! Og det er sjovt, ved Gud, det er sjovt, især om den gamle kvinde, der faldt tilbage fra koma og leder efter, hvorfor hun blev bragt tilbage til livet. Og denne hendes forhistoriske kærlighedshistorie ses med andre øjne: hvordan hun fortæller det om sig selv, og hvordan det er hendes emne; som de siger, "mærk forskellen!" Og en happy-end på den gamle kvindes svage ben, jeg gnaskede bare på puden af ​​ømhed!.. Og den episode om bryllupspaladset! Jeg elsker ægte romantiske historier så meget, ikke når alt skinner med glamourøs polering, men når man virkelig kan sympatisere med et levende menneske. Og om den aldrende mand og kone, disse fortrydelser formidles så godt, disse forsøg på at fange ungdommen ved den undvigende og allerede skæve hale... og det hele ender så klogt og godt. Jeg tænkte endda: måske er mine forfædre heller ikke helt ligeglade med hinanden, men med alderen glemte de simpelthen, hvordan de skulle vise det...

Jeg ser serien om natten. Langsomt. De er meget forskellige, jeg vil ikke blande dem. Det er som om du besøger forskellige mennesker. Og stemningen og indtrykkene er helt anderledes. Ingen. Du vil sandsynligvis ikke kunne lide det. Fordi intet fantastisk. OG surnogo Samme. Og endda "psykologi" - "vanskelig barndom, mangel på vitaminer, hvis bare vi havde købt en gameboy til tiden, dine bastards, se, du ville ikke blive en morderisk galning" - nej. Og ikke noget særligt lærerigt. Sådanne ting lærer i princippet intet. Hvad kan en andens liv lære os? Kun fordi hun også eksisterer. Det kan du prøve at tage højde for... Uden patos og høje toner. Det er ikke engang et drama, ved du? Som Carlson sagde: "Det er ingenting, det er en hverdagssag!" Alt dette er hverdagsanliggender. Bespontovye. Vi bliver så ofte anklaget for sympati for professionelle mordere og alle mulige andre enkemænd, at at sympatisere med en kontorist eller en husmor, det er en slags dårlig manerer... men jeg læser ikke moral for dig, tag den væk . Du spurgte - jeg svarede. Kom nu, fortæl mig om dine nye produkter. Så tager jeg den, når "Teater..." slutter. Det er ligesom vin, du kan ikke sluge den. Nuancerne når ikke eller eftersmagen bliver sløret. Det ville være en skam...

Meget ofte, når du opretter tjenester, er du nødt til det tegne forskellige grafer. For eksempel, hvis du opretter et annoncenetværk, så kan du bygge afhængigheder af antallet af klik på annoncemateriale om dagen. Hvis dette er en form for netbutik, så kan du bygge grafer over butikkens indkomst. Hvordan man tegner grafer i PHP, vil jeg analysere nedenfor.

For det første kan du gøre alt selv ved at skrive dit eget bibliotek. Her skal der tages højde for det koordinater i PHP inkrementeres til højre og ned, hvorimod i matematik går de til højre og op. Ellers ikke noget særligt kompliceret.

Men hvis du ikke rigtig vil skrive, så er der simpelthen et vidunderligt bibliotek, der giver dig mulighed for at bygge en bred vifte af grafer, diagrammer, histogrammer osv. En hel masse forskellige funktioner (mærkning af akser, tegning af flere grafer på én akse, tegning af tærskler, visning af en forklaring osv.) gør dette bibliotek virkelig universelt.

Biblioteket hedder pChart: .

Jeg præsenterer dig for et eksempel:

/* Forbind klasser */
require_once "pChart/pData.class";
require_once "pChart/pChart.class";
$DataSet = ny pData(); // Opret et pData-objekt
$DataSet->AddPoint(array(0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100), "Serie1"); // Indlæs data fra diagram 1
$DataSet->AddPoint(array(0, 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000), "Serie2"); // Indlæs data fra diagram 2
$DataSet->AddAllSeries(); // Tilføj alle data til plotning
$Test = ny pChart(700, 230); // Tegn det grafiske plan
$Test->setFontProperties("Fonts/tahoma.ttf", 8); // Indstil skrifttypen
$Test->setGraphArea(50, 30, 585, 200); // Indstilling af søkortområdet
$Test->drawFilledRoundedRectangle(7, 7, 693, 223, 5, 240, 240, 240); // Vælg planet med et rektangel
$Test->drawRoundedRectangle(5, 5, 695, 225, 5, 230, 230, 230); // Lav et omrids af det grafiske plan
$Test->drawGraphArea(255, 255, 255, sand); // Tegn det grafiske plan
$Test->drawScale($DataSet->GetData(), $DataSet->GetDataDescription(), SCALE_NORMAL, 150, 150, 150, sand, 0, 2); // Tegn akserne og grafen
$Test->drawGrid(4, sand, 230, 230, 230, 50); // Tegn nettet
$Test->drawLineGraph($DataSet->GetData(),$DataSet->GetDataDescription()); // Forbind grafpunkterne med linjer
$Test->drawPlotGraph($DataSet->GetData(),$DataSet->GetDataDescription(), 3, 2, 255, 255, 255); // Tegn point
$Test->drawTitle(50, 22, "site", 50, 50, 50, 585); // Vis titlen på diagrammet
$Test->Stroke(); // Vis grafen i browservinduet;
?>

I dette eksempel bygger vi en parabel og en kubisk parabel og viser derefter denne graf i browseren. Du kan også gemme grafen i en fil til dette i stedet for Slag() du skal bruge metoden Render("filnavn.png").