Täydellinen opas kuvien lataamiseen PHP:llä. Kuvien käsittely PHP:ssä GD Php gd -esimerkkien avulla

Hyvät DvizhKod-projektin osallistujat! Tänään meillä on toinen mielenkiintoinen aihe odottaa sinua. Olemme kaikki tottuneet esimerkiksi lataamaan uusia avatareja sosiaalisiin verkostoihin. Mutta miten ne skaalautuvat vaadittuun kokoon? Mitä palvelimella tapahtuu? Vastaukset näihin ja moneen muuhun kysymykseen odottavat sinua leikkauksen alla.

Kyllä, jos joku ei tiedä, niin Internet-terminologiassa "leikkaus" (englanniksi cut - to cut) on paikka, joka jakaa uutiset lyhyeen (yleisessä luettelossa) ja täydelliseen esitykseen.

Monet ihmiset tietävät, että olen kehittämässä omaa verkkosivujen hallintajärjestelmääni nimeltä Cogear (http://cogear.ru). Tarina on monimutkainen ja pitkä, mutta eten sinnikkäästi kohti päämäärääni.

Katsotaanpa kuvien kanssa työskentelyn perusnäkökohtia.

PHP:ssä on sisäänrakennettu GD-kirjasto. Tässä sen dokumentaatio:

http://php.net/manual/ru/book.image.php

Tältä sivulta löydät valtavan määrän erilaisia ​​toimintoja. Mutta älä huolestu. Olemme kiinnostuneita hyvin erityisistä.

Kuten näette, kuvien kanssa työskentely tapahtuu tällä hetkellä proseduurien (funktioiden) muodossa, joten oliopohjainen kuori on kirjoitettava itse.

Yksinkertaisin esimerkki kuvan kanssa työskentelemisestä:

Kokeillaan paikallisella koneella.

Luo tiedosto kuva.php(Minulla on paikallinen verkkotunnus kokeiluja varten test.local).

Sijoita kuva 1.jpg sivustokansion test.local juureen:

Soita selaimessa osoitteeseen http://test.local/image.php (teidän tapauksessasi eri osoite).

Löydämme kuvan 2.jpg kansiosta:

Mittasuhteet eivät ole säilyneet, kuten näette. Koska emme laskeneet niitä.

Korjataan skriptimme niin, että uudelleenlaskenta tapahtuu:

$ratio_orig) ( $leveys = $korkeus*$ratio_orig; ) else ( $korkeus = $leveys/$ratio_orig; ) // siirrä kuva tiedostosta kankaalle muuttaen mittakaavaa imagecopyresampled($image_p, $image, 0, 0, 0, 0, $leveys, $korkeus, $leveys_alkuperä, $korkeus_alkuperä); // tulosta imagejpeg($image_p, "2.jpg", 100);

Katsotaanpa tulosta:

Koska laskemme korkeuden uudelleen, osa lopullisesta kuvasta osoittautui mustaksi (luodun kankaan alkuperäinen väri).

Mitä muuta voit tehdä kuvalla? Leikkaa se, kierrä sitä, kerros päällekkäin, piirrä siihen.

Olen varma, että olet kiinnostunut kuvankäsittelykurssistani. Se ei toimi järjestelmän ulkopuolella, koska se on "Images"-vaihteen (moduulin) ajuri.

Mutta löydät siitä paljon mielenkiintoista:

* @copyright Copyright (c) 2012, Belyaev Dmitry * @lisenssi http://cogear.ru/license.html * @linkki http://cogear.ru */ luokka Image_Driver_GD laajentaa Image_Driver_Abstract ( /** * Luo kuvan * / public function create() ( kytkin ($this->info->type) ( case IMAGETYPE_JPEG: case IMAGETYPE_JPEG2000: $this->source = imagecreatefromjpeg($this->info->file); break; kirjainkoko IMAGETYPE_PNG: $this - >lähde = imagecreatefrompng($this->info->file) imagecolortransparent($this->source, imagecolorallocate($this->source, 0, 0, 0)); imagesavealpha($this->source, TRUE: $this->source = imagecreatefromgif($this->source, imagecolorallocate; , 0, 0, 0)); kuvaalphab > tiedosto ) ) /** * Tuhoaa kuvan */ julkinen toiminto tuhoa() ( imagedestroy($this->source); is_resource($this->target) && imagedestroy($this->target); ) /** * Luo kohdekuvan * * @param sekoitettu $leveys * @param sekoitettu $korkeus */ julkinen toiminto createTarget($leveys, $korkeus) ( $this->target = imagecreatetruecolor($width, $height); if ($this->info->type == IMAGETYPE_PNG TAI IMAGETYPE_GIF == $this->info->type) ( imagecolortransparent($this->target, imagecolorallocate($this->target, 0, 0, 0)) ; imagealphablending($this->target, FALSE($this->target, TRUE) /** * Muuttaa kuvan mittakaavaa * * @param int|string $width * @ param); int|string $korkeus Korkeus * @param string $sovitus Skaalaustyyppi leveys, korkeus, sovi * @param int|string $scale Mitkä kuvat skaalataan, ylös, alas * @return objekti Kuva */ public function resize($width, $korkeus, $sovitus = "leveys", $mittakaava = "mikä tahansa") ( $lähdeleveys = $this->smartSize($leveys, "leveys"); $lähde_korkeus = $this->smartSize($korkeus, "korkeus" ); // Tarkista skaalaustyyppikytkin ($sovitus) ( // Jos säädämme leveyttä, niin tuomme korkeuden haluttuihin mittasuhteisiin case "width": $width = $source_width; $korkeus = pyöreä(($lähde_leveys * $this->info->height) / $this->info->width); tauko; // Jos trimmaamme korkeutta, tuomme leveyden haluttuun mittasuhteeseen tapaus "korkeus": $width = pyöreä(($this->info->width * $source_height) / $this->info->height) ; $korkeus = $lähde_korkeus; tauko; case "crop": if ($this->info->width > $this->info->height) ( $leveys = pyöreä(($this->info->width * $source_height) / $this->info ->korkeus = $lähde_korkeus ) else ( $leveys = $lähde_leveys; $korkeus = pyöreä(($this->info->height * $source_width) / $this->info->width); ) tauko; // Oletuksena yksinkertaisesti venytetään oletus: case "fit": ) // Tarkista tapahtuuko skaalaus kytkin ($scale) ( // Jos kuva on suurempi kuin määritetyt mitat, sille ei tapahdu mitään. case "up": if ($width< $this->info->leveys && $korkeus< $this-> info->height) ( palauta $this; ) tauko; // Jos kuva on pienempi kuin määritetyt mitat, sille ei tapahdu mitään. case "alas": if ($width > $this->info->width && $height > $this->info->height) ( return $ tämä ) tauko; case "mikä tahansa": oletus: // Emme tee mitään. Filonyymi ) $this->target = $this->createTarget($leveys, $korkeus); if (imagecopyresampled($this->target, $this->source, 0, 0, 0, 0, $width, $height, $this->info->width, $this->info->height)) ( $this->source = $this->target; $this->info->height = $korkeus; ->crop("keski","keski" ,$lähdeleveys,$lähde_korkeus) ) return $this; ) /** * Rajaa kuvan * * @param sekoitettu $x Rajauskoordinaatti x * @param sekoitettu $y Rajauskoordinaatti y * @param sekoitettu $width Rajauksen leveys * @param sekoitettu $korkeus Rajauskorkeus * @palautusobjekti Kuva */ julkinen funktio rajaa($x, $y, $leveys, $korkeus) ( $x = $this->smartSize($x, "leveys") - $leveys/2; $y = $this->smartSize($y , "korkeus") - $leveys = $this->smartSize($leveys = $this->smartSize($korkeus, "korkeus"); createTarget($leveys, $korkeus) if (kuvakoopyresampled($this->target, $this->source, 0, 0, $x, $y, $leveys, $korkeus, $leveys, $korkeus)) ($ tämä->lähde = $this->target = $this->info->height = $this ) /** * Suorittaa kuvan yhdistämisen */ julkinen; funktio merge(Kuva $kuva, $x, $y, $prosentti = 100) ( $x = $this->smartSize($x, "leveys"); $y = $this->smartSize ($y, "korkeus" "); if (imagecopymerge($this->source, $image->getSource(), $x, $y, 0, 0, $image->object()->image->width , $image->object ()->kuva->korkeus, $prosentti)) ( ) palauttaa $this; ) /** * Tallentaa kuvan */ julkinen toiminto save($tiedosto = NULL, $optiot = array()) ( $this->target TAI $this->target = $this->source; if (strpos($ tiedosto , ".") TAI $tiedosto = $this->info->file) ( $ext = polkutieto($tiedosto, PATHINFO_EXTENSION); $ext = strtolower($ext); ) else ( $ext = strtolower($tiedosto ) ; $tiedosto = NULL " gif": imagecolortransparent($this->target, imagecolorallocatealpha($this->target, 0, 0, 0, 127)); ) imagegif($this->target, $file' $filters = PNG_NO_FILTER ) else ( $laatu = isset($options["laatu"]) ? $optiot["laatu"] : 9; $suodattimet = isset($options["suodattimet"]) ? $optiot["suodattimet"] : PNG_NO_FILTER; ) imagepng($tämä->kohde, $tiedosto, $laatu, $suodattimet); tauko; ) $this->detroy(); ) /** * Tulostaa kuvan */ julkisen funktion tulos($muoto, $valinnat) ( $this->save($format, $optiot); ) )

Miten se toimii järjestelmässä? Miksi niin paljon koodia?

Katso:

$kuva = uusi kuva("1.jpg"); $kuva->muuta kokoa(200,200,"leveys")->rajaa(200200)->tallenna("2,jpg);

Ymmärrätkö? Toimii automaattisesti kaikkien tarvittavien formaattien kanssa. Toimintoja voidaan tarvittaessa laajentaa.

Kotitehtäväsi on tehdä yllä oleva (ennen luokkaani) paikallisella koneellasi. Jos haluat ja sinulla on aikaa, kokeile parametreja.

Jos olet innokas PHP-kehittäjä, olet luultavasti kuullut enemmän kuin vain GD-kirjastosta. Niille, jotka eivät tunne sitä, GD-kirjasto antaa sinun luoda, muokata ja hallita kuvia ilman paljon vaivaa. Tänään tutustumme PHP:n GD-kirjaston grafiikkakirjaston käytön perusteisiin.

Ensinnäkin

Varmista, että GD-kirjasto on asennettu ja aktivoitu palvelimellesi. Etkö tiedä miten tämä tehdään? Älä huoli, se on yksinkertaista! Sinun tarvitsee vain luoda PHP-tiedosto palvelimelle ja kirjoittaa sitten seuraava:

Avaa nyt selainsivu ja näet valtavan luettelon PHP-versiosi ominaisuuksista. Vieritä sivua hieman alas, etsi "GD" -osio ja varmista, että kirjasto on käytössä. Jos ei, ota yhteyttä isännöintiyritykseen. Onneksi useimmilla palvelimilla, joilla olen jo työskennellyt ja työskentelen, GD-kirjasto on asennettu ja yhdistetty.

Perushetkiä

Käydään läpi joitakin perusasioita. Ensin varmistamme, että selain raportoi kaikki virheraportit. Tämä voidaan saavuttaa kirjoittamalla seuraava php-koodisi alkuun:

virhe_raportointi(E_ALL);
?>

Piirretään neliö

Aloitetaan yksinkertaisimmasta asiasta ja piirretään sininen neliö PHP:llä - ei tietenkään mitään yliluonnollista, mutta meidän on ymmärrettävä perusasiat. Halutun neliön saamiseksi sinun on suoritettava seuraavat vaiheet:

Aseta sisältötyypiksi "image", jotta selain voi tulkita kuvan oikein;
. Luo uusi tyhjä kuva asettamalla haluamasi leveys ja korkeus;
. Aseta taustaväri siniseksi;
. Tallenna kuvan lopullinen versio ja siirrä se selaimeen;
. Tyhjennä muisti, jota käytettiin kuvan luomiseen ja tallentamiseen;
. Järjestä kuvan näyttö index.php-tiedostosta

Nyt kun olemme päättäneet toimintojen järjestyksestä, voimme aloittaa koodauksen. Yritin kommentoida jokaista koodiriviä, ja kerron koodausprosessin aikana käytetyistä toiminnoista myöhemmin. Joten tässä on koodi sinisen neliön luomiseksi. Kun se on kirjoitettu, tallennamme sen nimellä "basic_square.php".

//Aseta näytettävät virheilmoitukset
ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);


//Määritä kuvan mitat
//125px leveys, 125px korkeus
$kuva = kuvanluo(125, 125);

//Valitse taustaväri
$sininen = kuvan väriallokaatio($kuva, 0, 0, 255);

//Aseta toinen väri - vain varmistaaksesi, että kun kuva näytetään, taustaväri on ensin asetettu väri ()
//Huomaa, että neliö on sininen, ei punainen.
$punainen = kuvan väriallokaatio($kuva, 255, 0, 0);

//Tallenna tiedosto png-muodossa ja tulosta se
imagepng($kuva);

//Tyhjennä käytetty muisti
imagedestroy($kuva);
?>

Katsotaanpa nyt kaikkia käytettyjä toimintoja ja yllä olevan koodin jokaista vaihetta ymmärtääksemme paremmin, mitä tarkalleen ottaen teemme siinä:

Kuten jo selitin, lisäämme mahdollisuuden ilmoittaa virheistä, jotta ne voidaan tarvittaessa korjata nopeasti
. Sitten käytämme header()-funktiota asettamaan sisältötyypiksi png
. Tallenna kuva ja aseta tarvittava leveys ja korkeus - katso lisätietoja kohdasta imagecreate()
. Sitten käytämme imagecolorallocate-toimintoa valitaksemme sinisen värin kuvan taustalle. Huomaa, että lopullinen väri näyttää ensin määrittämäsi värin, joten neliöstämme tulee sininen punaisen sijaan.
. Tallentaaksesi kuvan lopuksi käytämme imagepng(). Jos haluat tallentaa piirustuksen johonkin hakemistoon, sinun on syötettävä lisäparametreja.
. Ja lopuksi tyhjennämme muistin käyttämällä imagedestroy()-funktiota

Voimme katsoa piirtämäämme neliötä avaamalla blue_square.php-tiedoston, ja olisi vielä parempi, jos laittaisimme linkin siihen etusivulle:

Jos kaikki tehtiin oikein, näet seuraavan sinisen neliön:

Hei maailma

Nyt kun olemme oppineet luomaan kuvia, yritetään tehdä kuva, jossa teksti on kirjoitettu valitsemallamme fontilla. Voimme käyttää mitä tahansa kirjasinta TrueType Font (.tff) -hakemistosta. Seuraavissa esimerkeissä käytän Advent-fonttia. Kirjoitetaan "Hello World" tummanharmaaseen neliöön. Huomio, katsomme koodia ja analysoimme sitten jokaisen vaiheen yksityiskohtaisesti.

ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);


header("sisältötyyppi: kuva/png");

//Määritä kuvan koko - 300x300 pikseliä

//Aseta taustaväriksi tummanharmaa

//Määritä kirjasimen polku
$font_path = "advent_light";

//Kirjoita tekstiä
$string = "Hei maailma!";

//Yhdistä teksti ja kuva
imagettftext($kuva, 50, 0, 10, 160, $valkoinen, $fontin_polku, $merkkijono);

//Tallenna kuva
imagepng($kuva);

//Tyhjennä muisti
imagedestroy($kuva);
?>

Tallennetaan koodi tiedostoon 'hello_world.php' ja avataan se yllä kuvatulla tavalla. Joten mitä uutta tässä on?

Valitsimme kuvan kooksi 300*300 pikseliä ja käytimme tummanharmaata taustaa
. Huomaa, kuinka määritimme kirjasimen polun käyttämällä kirjasimen nimeä: tosiasia on, että myöhemmin koodissa meidän on asetettava tekstiä kuvan päälle. Älä myöskään unohda, että fontin nimi kirjoitetaan ilman päätettä. Tämä riippuu kuitenkin siitä, mitä GD-kirjaston versiota PHP käyttää: jos kirjasimen nimi ei ala kirjaimella '/', tarvitaan ttf-tunniste - eli jos tiedostonimen edessä ei ole / fontti, ttf lisätään automaattisesti loppuun.
. Sitten kirjoitamme "Hei maailma!" ja tallenna teksti myöhempää käyttöä varten
. Tärkein tässä koodissa käytetty funktio on imagettftext(), joka vaatii 8 parametria: kuvan polku, kuvan koko, kulma, x-akseli, y-akseli, väri, fontti, teksti (tässä järjestyksessä)

Tallenna koodi, avaa se millä tahansa tavalla, niin näet tämän kuvan:

Käännä se ympäri!

Oletko huomannut, että imagettftext-funktiolla, joka yhdistää tekstin ja kuvan, on parametri "asento kulmassa" Tämä tarkoittaa, että voimme kääntää tekstiä missä tahansa kulmassa.

//Aseta virheilmoitukset
ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);

//Aseta sisältötyyppi
header("sisältötyyppi: kuva/png");

//Määritä kuvan koko: 300x300 pikseliä
$kuva = kuvanluo(300, 300);

//Määritä taustaväri - tummanharmaa
$tumma_harmaa = kuvan väriallokaatio($kuva, 102, 102, 102);
$valkoinen = imagecolorallocate($kuva, 255, 255, 255);

//Määritä kirjasimen polku
$font_path = "advent_light";

//Kirjoita tekstiä
$string = "Hei maailma!";

//Yhdistä teksti ja kuva
imagettftext($kuva, 50, -45, 30, 70, $valkoinen, $fontin_polku, $merkkijono);

//Tallenna kuva
imagepng($kuva);

//Tyhjennä muisti
imagedestroy($kuva);
?>

Huomaa, että olemme asettaneet arvoksi -45 astetta 0 asteen sijasta (kuten edellisessä esimerkissä) - siinä on kaikki tekstin kiertäminen. Katso kuvaa.

Niin miten? Mielenkiintoista? Ei? Sitten yritetään tehdä jotain käytännöllisempää.

Mikä on tämän päivän päivämäärä?

Emme voi vain piirtää itse kuvia, vaan myös käyttää valmiita! Hieman koodausta, ja meillä on kalenteri, joka näyttää nykyisen päivämäärän (kuukausi, päivä ja vuosi). Haemme Googlesta kalenterimallia ja löydämme kuvan .svg-muodossa - muutin sen kokoa ja muunsin sen png-muotoon. Katso työkappaletta:

Nyt meillä on perusta, voimme käsitellä sitä GD- ja PHP-funktioilla. Varoitan, etten väitä olevani maailman suurin suunnittelija - ehkä eri malli ja eri fontti näyttäisivät paremmilta sivustolla. Suunnittelu on siis sinun päätettävissäsi, mutta katsotaanpa nyt koodia:

//Aseta virheilmoitukset
ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);

//Aseta sisältötyyppi

//Tallenna päivämäärä
lista($kuukausi, $päivä, $vuosi) = explode("/", date("F/jS/Y"));

//Lataa taustakuva
$image = imagecreatefrompng("calendar_blank.png");
$kuvan_leveys = kuvatx($kuva);

//Taustavärin ja fontin määrittäminen
$valkoinen = imagecolorallocate($kuva, 255, 255, 255);
$musta = kuvan väriallokaatio($kuva, 0, 0, 0);
$font_path = "advent_light";

//Määritä tekstin paikat
$pos_kuukausi = imagettfbbox(13, 0, $fontin_polku, $kuukausi);
$pos_day = imagettfbbox(25, 0, $font_path, $day);
$pos_year = imagettfbbbox(8, 0, $font_path, $year);

//Kirjoita kuukausi
imagettftext($image, 13, 0, ($image_width - $pos_month) / 2, 40, $valkoinen, $fontin_polku, $kuukausi);

//Kirjoita päivä
imagettftext($kuva, 25, 0, ($kuvan_leveys - $pos_day) / 2, 80, $musta, $fontin_polku, $päivä);

//Kirjoita vuosi
imagettftext($kuva, 8, 0, ($kuvan_leveys - $pos_year) / 2, 100, $musta, $fontin_polku, $vuosi);

//Tallenna kuva
imagejpeg($kuva, "", 100);

//Tyhjennä muisti
imagedestroy($kuva);
?>

Joten mitä me täällä teemme? Mikä on lista()-funktio? Selvitetään se:

Kuten aina, asetimme sisältötyypin niin, että kuva näkyy oikein.
. Rivillä 10 näet luettelotoiminnon. Määritämme päivämäärän muodon käyttämällä explode()-funktiota ja tallennamme sen. Tällä tavalla voit järjestää kaiken tiedon. Nyt meillä on pääsy tiedot kuluvasta kuukaudesta, päivästä ja vuodesta.
. Riveillä 22-24 käytämme imagettfbbox()-funktiota päivämäärämuodon järjestämiseen. Toiminto varmistaa, että päivämäärä näytetään annetussa järjestyksessä, ja päästäksesi oikeaan alakulmaan kirjoitamme $pos_month. Kaikki tämä on tarpeen sen varmistamiseksi, että teksti sijoittuu automaattisesti oikein sen koosta riippumatta.
. Luomme sitten jokaisen rivin vuorotellen ja asetamme tekstin koon X-akselia pitkin.

Jos mitään katastrofeja ei ole tapahtunut, sinun pitäisi saada alla oleva kuva, sillä ainoa ero on, että päivämäärä on tietokoneellesi asetettu päivämäärä - kuvani, kuten voit arvata, on staattinen. Kiitos catpin-sivustolle avusta käsikirjoituksen kanssa.

Kissat ja kuvasuodattimet

Viimeinen asia, jonka opetan sinulle tänään, ovat kuvasuodattimet - erittäin mielenkiintoinen asia, usko minua. Imagefilter()-toiminto ottaa valmiin kuvan ja muuttaa sitä tietyllä tavalla - esimerkiksi vaihtaa sen mustavalkotilaan. Katsotaanpa kuvaa, jonka parissa työskentelemme alkuperäisessä muodossaan.

Tehdään nyt kissasta mustavalkoinen kuvansuodatustoiminnolla.

//Aseta virheilmoitukset
ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);

//tarkista, onko lähdevedos asennettu
if(isset($_GET["lähde"]))(
//suorittaa peruskuvankäsittelyn
$kuva = filter_var($_GET["lähde"], FILTER_SANITIZE_STRING);

//Lataa kuva
$kuva = kuvanluojpeg($image);

//Vaihda se mustavalkotilaan
kuvasuodatin($kuva, IMG_FILTER_GRAYSCALE);

//Aseta sisältötyyppi
header("sisältötyyppi: kuva/jpeg");

//Tallenna kuva 90%
imagejpeg($kuva, "", 90);

//tyhjennä muisti
imagedestroy($kuva);
}
?>

Yllä oleva skripti on tarpeeksi joustava, jotta voit helposti tehdä mistä tahansa piirroksesta mustavalkoisen - näin:

Laitamme minkä tahansa kuvan "lähteeseen", ja pian siitä tulee mustavalkoinen. Ne, jotka aikovat käyttää tätä ominaisuutta julkisilla palvelimilla, edellyttävät lisäturvatoimenpiteitä. Vaikka yllä oleva komentosarja määrittää .jpeg-kuvan, voit käyttää toimintoa minkä tahansa kuvatiedoston käsittelyyn. Nyt kissamme näyttää tältä:

Muut suodattimet:

Oppitunnin lopussa esittelen sinulle joitain muita graafisia suodattimia ja niiden soveltamisen tuloksia.

Kirkkauden suodatin

Kolmas parametri vastaa kuvan kirkkaudesta:


//kolmas parametri asettaa kuvan kirkkaustason.
kuvasuodatin($kuva, IMG_FILTER_BRIGHTNESS, 40);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Gaussin sumeus

Gaussin sumeus, ei lisäparametreja

header("content-type:image/jpeg");

$kuva = imagecreatefromjpeg("kissa.jpg");
kuvasuodatin($kuva, IMG_FILTER_GAUSSIAN_BLUR);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Kontrasti

Kolmas parametri määrittää kontrastin

header("sisältötyyppi: kuva/jpeg");
$kuva = imagecreatefromjpeg("kissa.jpg");
kuvasuodatin($kuva, IMG_FILTER_CONTRAST, -15);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Keskiarvon poistaminen (kuvion vaikutus)

Ei lisäparametreja.

header("sisältötyyppi: kuva/jpeg");
$kuva = imagecreatefromjpeg("kissa.jpg");
kuvasuodatin($kuva, IMG_FILTER_MEAN_REMOVAL);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Väritasapaino

Asettaa punaisen, vihreän, sinisen ja alfan (valinnainen) kylläisyyden tässä järjestyksessä.

header("content-type:image/jpeg");
$kuva = imagecreatefromjpeg("kissa.jpg");
//alpha-kanavan parametri on jätetty pois alla, koska se on valinnainen.
kuvasuodatin($kuva, IMG_SUODATIN_VÄRITÄ, 50, 0, 0);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Ensi kertaan...

Toivon, että olet enemmän tai vähemmän ymmärtänyt GD-kirjaston käytön PHP:ssä. Toisessa osassa tarkastellaan joitain edistyneitä tekniikoita ja tietysti opimme vielä mielenkiintoisempia asioita. Käytä GD-kirjastoa ja luovuuttasi ja muista kertoa minulle, mitä keksit!

Jos olet innokas PHP-kehittäjä, olet luultavasti kuullut enemmän kuin vain GD-kirjastosta. Niille, jotka eivät tunne sitä, GD-kirjasto antaa sinun luoda, muokata ja hallita kuvia ilman paljon vaivaa. Tänään tutustumme PHP:n GD-kirjaston grafiikkakirjaston käytön perusteisiin.

Ensinnäkin

Varmista, että GD-kirjasto on asennettu ja aktivoitu palvelimellesi. Etkö tiedä miten tämä tehdään? Älä huoli, se on yksinkertaista! Sinun tarvitsee vain luoda PHP-tiedosto palvelimelle ja kirjoittaa sitten seuraava:

Avaa nyt selainsivu ja näet valtavan luettelon PHP-versiosi ominaisuuksista. Vieritä sivua hieman alas, etsi "GD" -osio ja varmista, että kirjasto on käytössä. Jos ei, ota yhteyttä isännöintiyritykseen. Onneksi useimmilla palvelimilla, joilla olen jo työskennellyt ja työskentelen, GD-kirjasto on asennettu ja yhdistetty.

Perushetkiä

Käydään läpi joitakin perusasioita. Ensin varmistamme, että selain raportoi kaikki virheraportit. Tämä voidaan saavuttaa kirjoittamalla seuraava php-koodisi alkuun:

virhe_raportointi(E_ALL);
?>

Piirretään neliö

Aloitetaan yksinkertaisimmasta asiasta ja piirretään sininen neliö PHP:llä - ei tietenkään mitään yliluonnollista, mutta meidän on ymmärrettävä perusasiat. Halutun neliön saamiseksi sinun on suoritettava seuraavat vaiheet:

Aseta sisältötyypiksi "image", jotta selain voi tulkita kuvan oikein;
. Luo uusi tyhjä kuva asettamalla haluamasi leveys ja korkeus;
. Aseta taustaväri siniseksi;
. Tallenna kuvan lopullinen versio ja siirrä se selaimeen;
. Tyhjennä muisti, jota käytettiin kuvan luomiseen ja tallentamiseen;
. Järjestä kuvan näyttö index.php-tiedostosta

Nyt kun olemme päättäneet toimintojen järjestyksestä, voimme aloittaa koodauksen. Yritin kommentoida jokaista koodiriviä, ja kerron koodausprosessin aikana käytetyistä toiminnoista myöhemmin. Joten tässä on koodi sinisen neliön luomiseksi. Kun se on kirjoitettu, tallennamme sen nimellä "basic_square.php".

//Aseta näytettävät virheilmoitukset
ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);


//Määritä kuvan mitat
//125px leveys, 125px korkeus
$kuva = kuvanluo(125, 125);

//Valitse taustaväri
$sininen = kuvan väriallokaatio($kuva, 0, 0, 255);

//Aseta toinen väri - vain varmistaaksesi, että kun kuva näytetään, taustaväri on ensin asetettu väri ()
//Huomaa, että neliö on sininen, ei punainen.
$punainen = kuvan väriallokaatio($kuva, 255, 0, 0);

//Tallenna tiedosto png-muodossa ja tulosta se
imagepng($kuva);

//Tyhjennä käytetty muisti
imagedestroy($kuva);
?>

Katsotaanpa nyt kaikkia käytettyjä toimintoja ja yllä olevan koodin jokaista vaihetta ymmärtääksemme paremmin, mitä tarkalleen ottaen teemme siinä:

Kuten jo selitin, lisäämme mahdollisuuden ilmoittaa virheistä, jotta ne voidaan tarvittaessa korjata nopeasti
. Sitten käytämme header()-funktiota asettamaan sisältötyypiksi png
. Tallenna kuva ja aseta tarvittava leveys ja korkeus - katso lisätietoja kohdasta imagecreate()
. Sitten käytämme imagecolorallocate-toimintoa valitaksemme sinisen värin kuvan taustalle. Huomaa, että lopullinen väri näyttää ensin määrittämäsi värin, joten neliöstämme tulee sininen punaisen sijaan.
. Tallentaaksesi kuvan lopuksi käytämme imagepng(). Jos haluat tallentaa piirustuksen johonkin hakemistoon, sinun on syötettävä lisäparametreja.
. Ja lopuksi tyhjennämme muistin käyttämällä imagedestroy()-funktiota

Voimme katsoa piirtämäämme neliötä avaamalla blue_square.php-tiedoston, ja olisi vielä parempi, jos laittaisimme linkin siihen etusivulle:

Jos kaikki tehtiin oikein, näet seuraavan sinisen neliön:

Hei maailma

Nyt kun olemme oppineet luomaan kuvia, yritetään tehdä kuva, jossa teksti on kirjoitettu valitsemallamme fontilla. Voimme käyttää mitä tahansa kirjasinta TrueType Font (.tff) -hakemistosta. Seuraavissa esimerkeissä käytän Advent-fonttia. Kirjoitetaan "Hello World" tummanharmaaseen neliöön. Huomio, katsomme koodia ja analysoimme sitten jokaisen vaiheen yksityiskohtaisesti.

ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);


header("sisältötyyppi: kuva/png");

//Määritä kuvan koko - 300x300 pikseliä

//Aseta taustaväriksi tummanharmaa

//Määritä kirjasimen polku
$font_path = "advent_light";

//Kirjoita tekstiä
$string = "Hei maailma!";

//Yhdistä teksti ja kuva
imagettftext($kuva, 50, 0, 10, 160, $valkoinen, $fontin_polku, $merkkijono);

//Tallenna kuva
imagepng($kuva);

//Tyhjennä muisti
imagedestroy($kuva);
?>

Tallennetaan koodi tiedostoon 'hello_world.php' ja avataan se yllä kuvatulla tavalla. Joten mitä uutta tässä on?

Valitsimme kuvan kooksi 300*300 pikseliä ja käytimme tummanharmaata taustaa
. Huomaa, kuinka määritimme kirjasimen polun käyttämällä kirjasimen nimeä: tosiasia on, että myöhemmin koodissa meidän on asetettava tekstiä kuvan päälle. Älä myöskään unohda, että fontin nimi kirjoitetaan ilman päätettä. Tämä riippuu kuitenkin siitä, mitä GD-kirjaston versiota PHP käyttää: jos kirjasimen nimi ei ala kirjaimella '/', tarvitaan ttf-tunniste - eli jos tiedostonimen edessä ei ole / fontti, ttf lisätään automaattisesti loppuun.
. Sitten kirjoitamme "Hei maailma!" ja tallenna teksti myöhempää käyttöä varten
. Tärkein tässä koodissa käytetty funktio on imagettftext(), joka vaatii 8 parametria: kuvan polku, kuvan koko, kulma, x-akseli, y-akseli, väri, fontti, teksti (tässä järjestyksessä)

Tallenna koodi, avaa se millä tahansa tavalla, niin näet tämän kuvan:

Käännä se ympäri!

Oletko huomannut, että imagettftext-funktiolla, joka yhdistää tekstin ja kuvan, on parametri "asento kulmassa" Tämä tarkoittaa, että voimme kääntää tekstiä missä tahansa kulmassa.

//Aseta virheilmoitukset
ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);

//Aseta sisältötyyppi
header("sisältötyyppi: kuva/png");

//Määritä kuvan koko: 300x300 pikseliä
$kuva = kuvanluo(300, 300);

//Määritä taustaväri - tummanharmaa
$tumma_harmaa = kuvan väriallokaatio($kuva, 102, 102, 102);
$valkoinen = imagecolorallocate($kuva, 255, 255, 255);

//Määritä kirjasimen polku
$font_path = "advent_light";

//Kirjoita tekstiä
$string = "Hei maailma!";

//Yhdistä teksti ja kuva
imagettftext($kuva, 50, -45, 30, 70, $valkoinen, $fontin_polku, $merkkijono);

//Tallenna kuva
imagepng($kuva);

//Tyhjennä muisti
imagedestroy($kuva);
?>

Huomaa, että olemme asettaneet arvoksi -45 astetta 0 asteen sijasta (kuten edellisessä esimerkissä) - siinä on kaikki tekstin kiertäminen. Katso kuvaa.

Niin miten? Mielenkiintoista? Ei? Sitten yritetään tehdä jotain käytännöllisempää.

Mikä on tämän päivän päivämäärä?

Emme voi vain piirtää itse kuvia, vaan myös käyttää valmiita! Hieman koodausta, ja meillä on kalenteri, joka näyttää nykyisen päivämäärän (kuukausi, päivä ja vuosi). Haemme Googlesta kalenterimallia ja löydämme kuvan .svg-muodossa - muutin sen kokoa ja muunsin sen png-muotoon. Katso työkappaletta:

Nyt meillä on perusta, voimme käsitellä sitä GD- ja PHP-funktioilla. Varoitan, etten väitä olevani maailman suurin suunnittelija - ehkä eri malli ja eri fontti näyttäisivät paremmilta sivustolla. Suunnittelu on siis sinun päätettävissäsi, mutta katsotaanpa nyt koodia:

//Aseta virheilmoitukset
ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);

//Aseta sisältötyyppi

//Tallenna päivämäärä
lista($kuukausi, $päivä, $vuosi) = explode("/", date("F/jS/Y"));

//Lataa taustakuva
$image = imagecreatefrompng("calendar_blank.png");
$kuvan_leveys = kuvatx($kuva);

//Taustavärin ja fontin määrittäminen
$valkoinen = imagecolorallocate($kuva, 255, 255, 255);
$musta = kuvan väriallokaatio($kuva, 0, 0, 0);
$font_path = "advent_light";

//Määritä tekstin paikat
$pos_kuukausi = imagettfbbox(13, 0, $fontin_polku, $kuukausi);
$pos_day = imagettfbbox(25, 0, $font_path, $day);
$pos_year = imagettfbbbox(8, 0, $font_path, $year);

//Kirjoita kuukausi
imagettftext($image, 13, 0, ($image_width - $pos_month) / 2, 40, $valkoinen, $fontin_polku, $kuukausi);

//Kirjoita päivä
imagettftext($kuva, 25, 0, ($kuvan_leveys - $pos_day) / 2, 80, $musta, $fontin_polku, $päivä);

//Kirjoita vuosi
imagettftext($kuva, 8, 0, ($kuvan_leveys - $pos_year) / 2, 100, $musta, $fontin_polku, $vuosi);

//Tallenna kuva
imagejpeg($kuva, "", 100);

//Tyhjennä muisti
imagedestroy($kuva);
?>

Joten mitä me täällä teemme? Mikä on lista()-funktio? Selvitetään se:

Kuten aina, asetimme sisältötyypin niin, että kuva näkyy oikein.
. Rivillä 10 näet luettelotoiminnon. Määritämme päivämäärän muodon käyttämällä explode()-funktiota ja tallennamme sen. Tällä tavalla voit järjestää kaiken tiedon. Nyt meillä on pääsy tiedot kuluvasta kuukaudesta, päivästä ja vuodesta.
. Riveillä 22-24 käytämme imagettfbbox()-funktiota päivämäärämuodon järjestämiseen. Toiminto varmistaa, että päivämäärä näytetään annetussa järjestyksessä, ja päästäksesi oikeaan alakulmaan kirjoitamme $pos_month. Kaikki tämä on tarpeen sen varmistamiseksi, että teksti sijoittuu automaattisesti oikein sen koosta riippumatta.
. Luomme sitten jokaisen rivin vuorotellen ja asetamme tekstin koon X-akselia pitkin.

Jos mitään katastrofeja ei ole tapahtunut, sinun pitäisi saada alla oleva kuva, sillä ainoa ero on, että päivämäärä on tietokoneellesi asetettu päivämäärä - kuvani, kuten voit arvata, on staattinen. Kiitos catpin-sivustolle avusta käsikirjoituksen kanssa.

Kissat ja kuvasuodattimet

Viimeinen asia, jonka opetan sinulle tänään, ovat kuvasuodattimet - erittäin mielenkiintoinen asia, usko minua. Imagefilter()-toiminto ottaa valmiin kuvan ja muuttaa sitä tietyllä tavalla - esimerkiksi vaihtaa sen mustavalkotilaan. Katsotaanpa kuvaa, jonka parissa työskentelemme alkuperäisessä muodossaan.

Tehdään nyt kissasta mustavalkoinen kuvansuodatustoiminnolla.

//Aseta virheilmoitukset
ini_set("näyttö_virheet", "1");
virhe_raportointi(E_ALL);

//tarkista, onko lähdevedos asennettu
if(isset($_GET["lähde"]))(
//suorittaa peruskuvankäsittelyn
$kuva = filter_var($_GET["lähde"], FILTER_SANITIZE_STRING);

//Lataa kuva
$kuva = kuvanluojpeg($image);

//Vaihda se mustavalkotilaan
kuvasuodatin($kuva, IMG_FILTER_GRAYSCALE);

//Aseta sisältötyyppi
header("sisältötyyppi: kuva/jpeg");

//Tallenna kuva 90%
imagejpeg($kuva, "", 90);

//tyhjennä muisti
imagedestroy($kuva);
}
?>

Yllä oleva skripti on tarpeeksi joustava, jotta voit helposti tehdä mistä tahansa piirroksesta mustavalkoisen - näin:

Laitamme minkä tahansa kuvan "lähteeseen", ja pian siitä tulee mustavalkoinen. Ne, jotka aikovat käyttää tätä ominaisuutta julkisilla palvelimilla, edellyttävät lisäturvatoimenpiteitä. Vaikka yllä oleva komentosarja määrittää .jpeg-kuvan, voit käyttää toimintoa minkä tahansa kuvatiedoston käsittelyyn. Nyt kissamme näyttää tältä:

Muut suodattimet:

Oppitunnin lopussa esittelen sinulle joitain muita graafisia suodattimia ja niiden soveltamisen tuloksia.

Kirkkauden suodatin

Kolmas parametri vastaa kuvan kirkkaudesta:


//kolmas parametri asettaa kuvan kirkkaustason.
kuvasuodatin($kuva, IMG_FILTER_BRIGHTNESS, 40);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Gaussin sumeus

Gaussin sumeus, ei lisäparametreja

header("content-type:image/jpeg");

$kuva = imagecreatefromjpeg("kissa.jpg");
kuvasuodatin($kuva, IMG_FILTER_GAUSSIAN_BLUR);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Kontrasti

Kolmas parametri määrittää kontrastin

header("sisältötyyppi: kuva/jpeg");
$kuva = imagecreatefromjpeg("kissa.jpg");
kuvasuodatin($kuva, IMG_FILTER_CONTRAST, -15);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Keskiarvon poistaminen (kuvion vaikutus)

Ei lisäparametreja.

header("sisältötyyppi: kuva/jpeg");
$kuva = imagecreatefromjpeg("kissa.jpg");
kuvasuodatin($kuva, IMG_FILTER_MEAN_REMOVAL);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Väritasapaino

Asettaa punaisen, vihreän, sinisen ja alfan (valinnainen) kylläisyyden tässä järjestyksessä.

header("content-type:image/jpeg");
$kuva = imagecreatefromjpeg("kissa.jpg");
//alpha-kanavan parametri on jätetty pois alla, koska se on valinnainen.
kuvasuodatin($kuva, IMG_SUODATIN_VÄRITÄ, 50, 0, 0);
imagejpeg($kuva, "", 90);
imagedestroy($kuva);
?>

Ensi kertaan...

Toivon, että olet enemmän tai vähemmän ymmärtänyt GD-kirjaston käytön PHP:ssä. Toisessa osassa tarkastellaan joitain edistyneitä tekniikoita ja tietysti opimme vielä mielenkiintoisempia asioita. Käytä GD-kirjastoa ja luovuuttasi ja muista kertoa minulle, mitä keksit!

Esittely:

PHP:n ominaisuudet eivät rajoitu HTML:n luomiseen. PHP:llä voidaan luoda ja muokata kuvia eri muodoissa, mukaan lukien gif, png, jpg, wbmp ja xpm. Lisäksi PHP pystyy tulostamaan kuvavirran suoraan selaimeen. Toimiaksesi tarvitset PHP:n, joka on käännetty GD-grafiikkakirjastolla, ja PHP voivat myös riippua muista kirjastoista riippuen siitä, mitä kuvamuotoja käytät.

EXIF-laajennuksella voit käsitellä JPEG- ja TIFF-kuvien otsikoihin tallennettuja tietoja. Sen avulla voit käyttää digitaalikameroiden luomia sisällönkuvauskenttiä. GD-kirjastoa ei tarvita, jotta EXIF-laajennus toimisi.

Voit lukea kirjaston asentamisesta ja määrittämisestä virallisesta dokumentaatiosta. Todennäköisesti et tarvitse tätä, koska olet jo asentanut kaiken pitkään.

Mitä olemme tekemisissä?

Jaan PHP:n kuvankäsittelytoiminnot kahteen luokkaan. Ne, jotka toimivat tiedostojen kanssa ja ne, jotka toimivat muistissa olevien kuvien kanssa (resurssi).

Näitä toimintoja on monia, ja ne kaikki ovat tärkeitä. En kuvaile jokaista, varsinkin kun en voi tehdä sitä virallisilla asiakirjoilla. Mutta voimme tarkastella niitä esimerkkien avulla, ja teemme tämän nyt.

Käsitelty kuva tallennetaan käyttämällä
Kuvaus kuuluu imagegif - Tulosta kuva selaimeen tai tiedostoon. Ymmärtääksemme karkeasti, kuinka tämä toimii, tarvitsemme editorin ja kuvan. Avaamme kuvan editorilla ja näemme joukon käsittämättömiä symboleja.
Hienoa, tämä on kuvamme. Tämä toiminto muuttaa muistissamme olevat pikselit tällaiseksi tietueeksi. Tämän kaiken kirjoittamiseksi tiedostoon määritämme imagegifissä 2 parametria. Osoitin kuvaamme muistissa ja tiedoston nimi.
imagegif($im,"image.gif");

Kun selain näyttää meille jonkinlaisen kuvan, se käytännössä pyytää palvelimelta samoja kirjoituksia ja muuttaa ne kuvaksi näytöllä.
Tämä tarkoittaa, että emme voi vain tallentaa näitä kirjoituksia tiedostoon, vaan myös lähettää ne välittömästi selaimeen. Tämän tekee sama imagegif, mutta tällä kertaa ilman toista parametria.
imagegif ($im)

Mutta on yksi asia. Sinun on kerrottava selaimelle, että se on käsiteltävä kuvana, ei tavallisena tekstinä. Haluan muistuttaa sinua tässä luvussa "Missä PHP toimii" käsitellyistä otsikoista.
Otsikon lähettämiseen käytämme otsikkotoimintoa
otsikon sisältö on (asiakirjan tyyppi: GIF-kuva)
se näyttää tältä: header("Sisältötyyppi: kuva/gif");

Ja lopuksi viimeinen asia, jonka näit täällä
Se ei poista $img-osoitinmuuttujaa, mutta tyhjentää muistin, johon muuttuja osoittaa. Se on hyödyllinen, jos haluat työskennellä suuren resoluution kuvien kanssa, esimerkiksi useiden kuvien kanssa rinnakkain, etkä samaan aikaan ylitä sallittua vapaata muistia.

Haluan muistuttaa, että kaikki skriptille suorituksen aikana varattu muisti vapautetaan automaattisesti, kun sen työ on valmis.

No, siinä kaikki, olemme hallinneet teoreettisen perustan...


Tyypillisiä virheitä:

Vakava virhe: Kutsu määrittelemättömään toimintoon...
Tämä tarkoittaa, että sinulla ei ole GD-kirjastoa asennettuna tai kaikki on paljon yksinkertaisempaa - kirjoitit funktion nimen väärin. GD:n asennus on kuvattu dokumentaatiossa. Denverissä se on oletuksena, Ubuntussa saatat tarvita komennon sudo apt-get install php5-gd ja käynnistä palvelin uudelleen.

Varoitus: imagecreatefrom..(a.png) streamin avaaminen epäonnistui: Lupa estetty
Täälläkin kaikki on yksinkertaista. Napsauta kuvaamme hiiren kakkospainikkeella ja aseta lukuoikeudet kaikille.

Resurssin tunnus # näkyy näytöllä kuvan sijaan.
=(Sanoin jo, että tulostus selaimeen suoritetaan erikoisfunktioilla, kuten imagegif() ilman toista parametria. Ja jossain sinulla on echo $img; eikä näytöllä näy muistin sisältö, vaan vain viesti, että tämä on osoitin.

Varoitus: ...(): annettu argumentti ei ole kelvollinen kuvaresurssi
Odotettiin osoitinta, mutta se, mitä annat sille, oli merkkijono tai jotain muuta. Lisäksi, jos olet varma, että ohitat osoittimen, mutta saat silti tämän virheen, lopeta vaatiminen. Olet väärässä ja on parempi tarkistaa kaikki uudelleen. Säästää paljon hermoja =)

�PNG ��� IHDR�����������h6��PIDAT(����JA��Mv�M4��
Joo, jostain syystä näkyy kuvan binäärikoodi, mutta selain ei ajatellut muuttaa sitä kuvaksi, vaan käsitteli sen tavallisena tekstinä. Selaa koko oppitunti uudelleen ja etsi osa, jossa lähetimme kuvan selaimeen.


Pari ongelmaa, jotka auttavat sinua oppimaan materiaalia

Haluan muistuttaa sinua vielä kerran ohjelmoinnin vaiheista
1. Ongelman kuvaus
2. Vaadittujen toimintojen määrittäminen
3. Sopivien toimintojen valinta kullekin toiminnolle ()
4. Ketjun rakentaminen
5. Virheenkorjaus ja paluu ensimmäiseen kohtaan

Muista - et hanki kokemusta nyt, vaan opit hankkimaan sitä. Ajattele tätä, kun suoritat tehtäviä.
Jos suoritit ne, mutta et oppinut mitään uutta itsellesi, joko suoritit ne huonosti tai et suorittanut niitä ollenkaan. On epätodennäköistä, että eri tilanteessa olisit lukenut tähän asti.

Ongelmia

1. Tulostus
Olen varma, että sinun ei ole vaikea lisätä kuvaan muutama sana. Siksi yritetään piirtää graafinen allekirjoitus. Avaa maali ja anna nimikirjoitus. Tapahtui? Loistava.
Nyt tallennamme Googlesta kaksi valokuvaa Pamella Andersonista ja lisäämme niihin allekirjoituksemme.
(Vihje: on varmaan hyödyllistä tietää, että kuvassa on läpinäkyvyyttä osoittava parametri Alpha. Olen varma, että Ctrl+F funktioluettelossa osuu silmään, vaikka se ei ole ollenkaan välttämätöntä.)

2. Captcha
Emme tee siitä monimutkaista, teemme siitä yksinkertaista. Satunnainen 4 numeroa näytetään joka kerta.
Mikä on juju? Tätä varten käytämme erityistä fonttia - . Ja kun kuvamme on valkoinen ja musta teksti, käytämme siihen negatiivista suodatinta ja saamme sen näkyviin näytölle käänteisenä, mustalla taustalla ja valkoisella, ja molemmat kuvat näkyvät näytöllä (ja kaikki yksi käsikirjoitus)

3.php logo
Tämä tehtävä on yksinkertaisempi ja autenttisempi - piirrä php-logo.

Löydät vastaukset näihin kysymyksiin täältä:

<<< Назад Sisältö Eteenpäin >>>
Jos sinulla on muita kysymyksiä tai jokin on epäselvää - tervetuloa palveluumme

Internet olisi aika tylsää ilman kuvia. Satojen tai tuhansien kuvien ylläpito ja hallinta verkkosivustollesi voi kuitenkin olla päänsärkyä. Kun sivustosi ulkoasu muuttuu, saatat joutua muuttamaan kaikkia kuviasi – esimerkiksi muuttamaan kaikki kuvat harmaasävyiksi tai muuttamaan niiden kokoa 50 prosenttiin niiden alkuperäisestä koosta. Voit myös pakata tai rajata erilaisia ​​kuvia. Tämän tekeminen manuaalisesti on aikaa vievää ja virhealtista, mutta pienellä ohjelmointitiedolla se voidaan automatisoida.

Tässä opetusohjelmassa opimme PHP:n GD (Graphic Draw) -kirjastosta. Näet, kuinka tätä kirjastoa voidaan käyttää kuvien muokkaamiseen kokoa muuttamalla, rajaamalla, kiertämällä tai suodattamalla.

Mikä on GD?

PHP voi tehdä paljon enemmän kuin vain lähettää HTML-viestejä vierailijoille. Sillä on esimerkiksi kyky manipuloida kuvia. Ei vain sitä, vaan voit myös luoda omia kuviasi tyhjästä ja sitten joko tallentaa ne tai tarjota niitä käyttäjille.

PHP pystyy käsittelemään lähes kaikki peruskuvanhallintatarpeesi käyttämällä GD-kirjastoa - lyhenne sanoista Graphic Draw.

Asennus

Jos käytät Windowsia, voit sisällyttää tiedoston php_gd2.dll jatkona php.ini. Jos käytät jotain XAMPP:n kaltaista, löydät tiedoston php_gd2.dll luettelossa xampp\php\ext. Voit myös tarkistaa, onko GD asennettu järjestelmääsi käyttämällä phpinfo()-funktiota; . Jos tarkastelet tulostetta, löydät jotain seuraavanlaista.

Voit myös käydä vaatimukset ja asennussivulla saadaksesi lisätietoja asennuksesta.

Kuvien luominen PHP GD:llä

Ensimmäinen askel kuvien käsittelyyn PHP:llä on ladata ne muistiin kuvaresurssiksi. Tämä voidaan saavuttaa käyttämällä erilaisia ​​toimintoja eri formaateille. Kaikilla näillä toiminnoilla on hyvin samanlaiset nimet, joten ne on helppo muistaa.

Uuden kuvan luominen

Imagecreatetruecolor()-funktio on hyödyllinen, jos sinulla ei ole muokattavan kuvan alkuperäistä lähdettä. Se vaatii kaksi kokonaislukuparametria: leveys ja korkeus. Se palauttaa kuvaresurssin, jos kaikki menee suunnitelmien mukaan. Palautettu kuvaresurssi on periaatteessa musta kuva, jolla on tietty leveys ja korkeus.

Ladataan kuvatiedostoa

Jos aiot työskennellä kuvien kanssa, jotka on jo tallennettu jonnekin, sinun on hyödyllistä käyttää toimintoja, kuten imagecreatefromjpeg() , imagecreatefrompng() ja imagecreatefromgif() . He luovat kuvaresurssin, joka sisältää kaikki tiedot ladatusta kuvatiedostosta. Nämä toiminnot ottavat yhden parametrin, joka määrittää ladattavan kuvan sijainnin, kuten URL-osoitteen tai tiedostopolun.

Kuvan luominen merkkijonosta

GD-kirjasto mahdollistaa myös kuvien luomisen merkkijonosta PHP:n imagecreatefromstring()-funktiolla. Muista, että sinun on käytettävä base64_decode()-komentoa annetussa merkkijonossa ennen imagecreatefromstring() . Toiminto voi tunnistaa automaattisesti, onko kuvatyyppi JPG, PNG, GIF vai muu tuettu muoto.

Kierrä, skaalaa, rajaa ja käännä kuvaa

Joitakin yleisiä toimintoja, joita voit suorittaa kuvaresurssille, ovat kierto, skaalaus, rajaus ja kääntäminen.

Kierto

Voit kiertää kuvaa, jonka olet jo ladannut skriptiin, käyttämällä imagerotate()-funktiota. Se kiertää kuvaa tietyssä kulmassa käyttämällä kuvan keskustaa kiertokeskuksena. Kulma esitetään liukulukuna, ja PHP olettaa, että tämä on kiertokulman arvo. Joskus käännetyllä kuvalla on erilaiset mitat kuin alkuperäisessä versiossa. Tämä tarkoittaa, että kääntymisen jälkeen sinulla on avointa aluetta. Imagerotate()-funktion kolmatta parametria voidaan käyttää tyhjän alueen taustavärin asettamiseen kiertämisen jälkeen.

Skaalaus

Kuvan skaalaaminen GD-kirjaston avulla on erittäin helppoa. Sinun tarvitsee vain siirtää kuvaresurssi sekä leveys ja korkeus imagescale()-funktiolle. Jos jätät pois korkeuden, GD skaalaa kuvan määritettyyn leveyteen säilyttäen samalla kuvasuhteen. Voit myös määrittää kuvan skaalaustilan. Se voidaan asettaa arvoon IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC jne. Tärkeä asia, joka sinun on muistettava, on, että tämä toiminto palauttaa uuden skaalatun kuvalähteen alkuperäisen muuttamisen sijaan.

Trimmaus

Voit rajata mitä tahansa kuvaresurssia käyttämällä imagecrop()-funktiota GD:ssä. Ensimmäinen parametri on alkuperäinen kuvaresurssi ja toinen parametri on assosiatiivinen matriisi, jonka avaimet x , y , leveys ja korkeus määrittävät rajauslaatikon sijainnin mitat.

Yllä oleva perhoskuva on rajattu seuraavalla koodilla:

$im_php = imagecreatefromjpeg("polku/kuvaan"); $koko = min(kuvatx($im_php), kuvaty($im_php)); $im_php = imagecrop($im_php, ["x" => $koko*0,4, "y" => 0, "leveys" => $koko, "korkeus" => $koko]); $im_php = kuvaskaala($im_php, 300);

Periaatteessa tallennamme pienimmän sivun pituuden $size-muuttujaan. Tätä muuttujaa käytetään sitten määrittämään rajaussuorakulmiomme raja. Lopuksi kuva pienennetään niin, että se on vain 300 pikseliä leveä ja pitkä. Tämä antaa meille neliömäisen kuvan.

Kuvien kääntäminen

Kuvia voidaan kääntää vaaka-, pysty- tai molempiin suuntiin käyttämällä imageflip()-toimintoa. Se ottaa kuvaresurssin, jonka haluat kääntää, ensimmäiseksi parametriksi ja kääntötilan toiseksi parametriksi. Kääntötila voidaan asettaa arvoon IMG_FLIP_HORIZONTAL, IMG_FLIP_VERTICAL tai IMG_FLIP_BOTH.

Yllä olevan kuvan vasen yläkuva on alkuperäinen. Oikean yläreunan kuva luotiin komennolla IMG_FLIP_HORIZONTAL, vasen alhainen kuva luotiin käyttämällä IMG_FLIP_VERTICAL-kuvaa ja alempi oikea kuva luotiin käyttämällä IMG_FLIP_BOTH-ohjelmaa. (Variksen kuva Pixabaystä.)

Suodattimien käyttäminen kuvaan

GD:ssä on myös erittäin hyödyllinen imagefilter()-toiminto, joka voi käyttää suodattimia erilaisiin kuvaresursseihin, jotka on ladattu aiempien kuvien funktioilla. Tämä toiminto voi hyväksyä erilaisia ​​parametreja käytetystä suodattimesta riippuen.

Aloita määrittämällä kuvaresurssi ja käytettävän suodattimen nimi. Voit asettaa sen johonkin asiakirjoissa mainituista 12 ennalta määritetystä suodatintyypistä.

  • IMG_FILTER_NEGATE: kääntää kuvan värit päinvastaiseksi (muuttaa negatiivisena).
  • IMG_FILTER_GRAYSCALE: Poistaa värin kuvasta
  • IMG_FILTER_BRIGHTNESS: tekee kuvasta kirkkaamman tai tummemman
  • IMG_FILTER_CONTRAST: Lisää kuvan kontrastia
  • IMG_FILTER_COLORIZE: Varjostaa kuvan valitun värin mukaan
  • IMG_FILTER_EDGEDETECT: korostaa kuvan reunat
  • IMG_FILTER_EMBOSS: Samanlainen kuin reunan tunnistus, mutta antaa jokaiselle reunalle korotetun ulkonäön
  • IMG_FILTER_GAUSSIAN_BLUR: Sumentaa kuvan Gaussin menetelmällä
  • IMG_FILTER_SELECTIVE_BLUR: Sumentaa kuvan käyttämällä valikoivaa menetelmää
  • IMG_FILTER_MEAN_REMOVAL: tehoste tyylitellyn kuvan luomiseen
  • IMG_FILTER_SMOOTH: tasoittaa kuvan rosoiset reunat
  • IMG_FILTER_PIXELATE: Tekee kuvasta pikseloidun

Jotkut suodattimet, kuten NEGATE, GRAYSCALE, EDGE_DETECT ja EMBOSS, eivät vaadi lisätietoja. Muut suodattimet, kuten BRIGHTNESS, CONTRAST ja SMOOTH, voivat ottaa lisäparametrin, joka määrittää lopullisen kuvan kirkkauden, kontrastin tai sileyden. PIXELATE-parametrilla voit määrittää kaksi lisäparametria: lohkon koon ja pikselöintitilan. Lopuksi COLORIZE-suodatin ottaa neljä parametria, jotka määrittävät arvot punaiselle, vihreälle ja siniselle komponentille sekä alfakanavalle.

Vasemmassa yläkulmassa oleva kuva on alkuperäinen. Oikean yläkulman kuva luotiin COLORIZE-suotimella, vasen alaosa HARMAASÄVY-suodattimella ja oikea alempi kuva luotiin BRIGHTNESS-suodattimella. (Tämä perhoskuva löytyi Pixabaysta.)

Muita hyödyllisiä ominaisuuksia kuvien käsittelyyn

Sinun tulisi myös olla tietoinen joistakin muista yleisistä GD-ominaisuuksista, jotka voivat olla hyödyllisiä ajoittain.

Kuvan mittojen saaminen

Voit määrittää kuvaresurssin leveyden ja korkeuden käyttämällä imagesx()- ja imagesy()-funktioita.

Toista funktiota nimeltä getimagesize() voidaan käyttää myös kuvan leveyden ja korkeuden määrittämiseen sen tyypin kanssa. Tämä funktio palauttaa taulukon, jonka elementit määrittävät kuvan leveyden, korkeuden ja muodon. Matriisin kaksi ensimmäistä elementtiä kuvaavat leveyttä ja korkeutta, ja kolmas elementti sisältää vakion, joka määrittää tiedostomuodon: yksi seuraavista: IMAGETYPE_PNG, IMAGETYPE_GIF jne.

Kuvan tallentaminen

Kun olet tehnyt kaikki tarvittavat muutokset kuvaan, haluat todennäköisesti joko tulostaa sen selaimeen tai tallentaa sen tiedostona. Kummassakin tapauksessa sinun on käytettävä jotakin GD-tulostusfunktioista, kuten imagejepg() , imagepng() tai imagegif() . Välität kuvaresurssi johonkin näistä tulostustoiminnoista, ja jos haluat tallentaa kuvan tiedostoon, anna myös tiedostonimi. Voit myös säätää tulostetun kuvan laatua käyttämällä kolmatta valinnaista parametria kuvatyypistä riippuen.

Muuta luettelon kaikkien kuvien kokoa

Laitetaan oppimamme käytäntöön jotain. Tässä osiossa muutamme tietyn hakemiston kaikkien JPEG-kuvien koon 640 pikseliä leveyteen. Korkeus lasketaan automaattisesti alkuperäisen kuvan mitoista riippuen.

Tallennamme muokatut kuvat uuteen kansioon nimeltä Kokoa muutettu. Tässä tapauksessa kaikilla lähdekuvilla on samat mitat, mutta koodi toimii oikein kuvien kanssa, joiden koko ja mittasuhteet ovat erilaiset.

$hakemisto = "Luonto/"; $kuvat = glob($hakemisto."*.jpg"); foreach($images as $image) ( $im_php = imagecreatefromjpeg($image); $im_php = imagescale($im_php, 640); $new_height = imagesy($im_php); $uusi_nimi = str_replace("-1920x1080", "- 640x".$uusi_korkeus, perusnimi($kuva)); imagejpeg($im_php, $hakemisto."Kokoa muutettu/".$uusi_nimi); )

Yllä olevassa koodissa aloitamme käyttämällä glob()-funktiota löytääksemme kaikki kuvat, joissa on laajennus .jpg hakemistossa nimeltä Luonto. Kuvatiedostot tallennetaan taulukkoon ja iteroimme niitä yksitellen.

Koska kaikki muutettavat kuvat ovat JPEG-tiedostoja, käytämme imagecreatefromjpeg()-funktiota niiden lataamiseen skriptiin. Imagescale()-funktiota käytetään sitten kuvan koon muuttamiseen tiettyyn leveyteen - meidän tapauksessamme 640 pikseliä. Emme määrittäneet kiinteää korkeutta, jotta korkeus laskettaisiin automaattisesti.

Jokaiseen alkuperäiseen kuvatiedostoon lisättiin -1920x1080 tiedoston nimeen sen koon osoittamiseksi. Käytämme str_replace() alkuperäisessä tiedostonimessä ja korvaa -1920x1080 uuteen kuvan kokoon.

Lopuksi tallennamme muokatut kuvat kansioon nimeltä Muuta kokoa uusilla tiedostonimillä. Voit myös siirtää kolmannen parametrin imagejpeg()-funktiolle tallennetun kuvatiedoston laadun määrittämiseksi. Jos kolmas parametri jätetään pois, kuvat tallennetaan oletuslaadulla 75.

Käytä harmaasävy- ja kontrastisuodattimia jokaiseen luettelon kuvaan

Tällä kertaa käytämme kahta erilaista suodatinta jokaiseen hakemistomme kuvaan ja tallennamme lopputuloksen eri hakemistoon tekemättä muutoksia tiedoston nimeen. Sukellaan koodiin ja selitän, mitä kukin toiminto tekee myöhemmin.

$hakemisto = "Luonto/"; $kuvat = glob($hakemisto."*.jpg"); foreach($kuvat $kuvana) ( $im_php = imagecreatefromjpeg($image); kuvasuodatin($im_php, IMG_FILTER_GRAYSCALE); kuvasuodatin($im_php, IMG_SUODATIN_KONTRASTI, -25); $uusi_nimi = perusnimi($kuva); im_phpeg( , $hakemisto."Harmaasävy/".$uusi_nimi )

Kuten näet, lataamme kuvia luettelosta Luonto sama kuin edellisessä esimerkissä. Tällä kertaa käytämme kuitenkin imagefilter()-funktiota suodattimien käyttämiseen ladatussa kuvaresurssissa.

Huomaa, että imagefilter() muokkaa alkuperäistä kuvaa ja palauttaa TRUE tai FALSE riippuen toiminnon onnistumisesta tai epäonnistumisesta. Tämä eroaa edellisessä osiossa käyttämästämme imagescale()-funktiosta, joka palautti skaalatun kuvaresurssin.

Toinen tärkeä asia, joka on pidettävä mielessä, on, että kontrastisuodatin ottaa arvot välillä -100 - 100. Negatiiviset arvot tarkoittavat enemmän kontrastia ja positiiviset arvot vähentävät kontrastia. Tämä on päinvastoin kuin jotkut saattavat odottaa! Arvo 0 jättää kuvan ennalleen.

Toisaalta luminanssisuodattimen minimi- ja maksimirajat ovat -255 ja 255. Negatiivinen arvo tarkoittaa tässä tapauksessa minimikirkkautta, kun taas positiivinen arvo tarkoittaa maksimikirkkautta.

Saamme tiedostonimen tiedostopolusta basename()-funktiolla ja tallennamme kuvan käyttämällä imagejpeg()-funktiota.

Lopulliset ajatukset

Tämän opetusohjelman tarkoituksena oli esitellä sinulle PHP:n GD-kirjasto ja oppia käyttämään sen kaikkia ominaisuuksia elämäsi helpottamiseksi. Voit käyttää opetusohjelman lopussa olevia esimerkkejä apuna omien kuvankäsittelyohjelmien kirjoittamisessa. Voit esimerkiksi muuttaa kuvan kokoa vain, jos se on suurempi kuin annettu raja, määrittämällä sen leveys imagesx()-funktiolla.

Kaikki nämä ominaisuudet tarjoavat monia mahdollisuuksia helpottaa kuvien käsittelyä ja säästävät paljon aikaa pitkällä aikavälillä. Jos sinulla on kysyttävää tähän opetusohjelmaan liittyen, kerro minulle kommenteissa.