internet Okná Android
Rozbaľovať

PHP funkcie pracujú s obrázkami. Sprievodca načítaním obrázkov do PHP

Článok popisuje, ako pracovať s rozšírením PHP - GDLIB, ktorý vám umožní dynamicky tvoriť obrázky na webových stránkach.
Autor - Nykoh (Niko)
Preklad z francúzštiny - Anton Fedorchenko
Pôvodná adresa - http://www.phpdebutant.org/article111.php

Na pochopenie tohto článku je potrebné mať predstavu o základných základoch PHP, ako aj prácu s obrázkami.

Prekladateľ poznámka

v príkladoch sú všetky názvy identifikátorov uvedené vo francúzštine. Aby sme uľahčili porozumenie kódu čitateľa, ponúkame ich preklad:
blanc - biela
bLEU - BLUE
couleur - farba
couleur_fond - farba pozadia
fichier - súbor
gris - sivá
hauteur - výška
hauteurImage - Výška obrazu
Štruktúra
vyškolenie - šírka obrazu
mois - mesiac
noir - čierny
polícia - Font Headset
rouge - červená
tabreau - pole
vert - zelená

Prekladateľ poznámka

V predvolenom nastavení v PHP 5 sú všetky rozšírenia zakázané, vrátane rozšírenia na tvar dynamických obrázkov - GD. Pokyny na nastavenie tejto expanzie by ste mali kontaktovať článok.

Cieľ: Ak chcete vyučovať používanie rôznych funkcií knižnice GD, navrhnuté pre dynamickú tvorbu obrazu.

Knižnica GD je súbor funkcií na prácu s obrázkami. Vďaka nej je možné nielen dynamicky vytvoriť svoje vlastné obrázky, ale aj na prijímanie rôznych informácií o nich, zmeniť veľkosť, atď.

Pozornosť: Skôr ako začnete pracovať, musíte niečo vedieť. Faktom je, že existuje niekoľko rôznych verzií tohto rozšírenia PHP, a poskytovatelia hostiteľských služieb môžu zakázať určité funkcie, a dokonca aj celú knižnicu GD. Za akým účelom? Je známe, že spracovanie obrazu je veľké zaťaženie na serveri.

Takže, musíte poznať verziu knižnice GD nainštalovanej na hosting, ktorý používate, ako aj získať informácie o povolených funkciách. Prvá vec, ktorú treba urobiť, je použitie funkcie phpinfo. Vykonajte nasledujúci skript:

phpinfo.php.

phpinfo ();
?>

Ak máte podobný stôl - všetko je v poriadku (najmä ak je verzia knižnice novšia ako 2,0)

Gd.

Podpora GD

Verzia GD.

Podpora freethype

FREETYPE LINKAGE.

Podpora JPG

Podpora png

Podpora WBMP

Ako už bolo uvedené, niektoré možnosti môžu byť zakázané. V tomto prípade by ste sa mali jednoducho pokúsiť použiť jednu funkciu. Ak to vedie k chybe: Fatálna chyba: Zavolajte na nedefinovanú funkciu, - nemali by ste mať žiadne pochybnosti o tom, že táto funkcia je zakázaná.

I) Tvorba plátnov

Najprv musíte vytvoriť prázdne plátno. Ihneď vysvetlite, že v tomto článku povieme výlučne na obrázky vo formáte PNG alebo JPG, formát GIF zostane bez našej pozornosti. Faktom je, že tento formát prestal byť podporovaný GD knižnicou, počnúc verziou 1.3, hoci limitovaná podpora pre GIF sa opäť objavila vo verzii 2. Záver: PNG Formát je zisková alternatíva k GIF

Dôležitá poznámka

Vo všetkých tréningových kurzoch stránky www.phpdebutant.org, skripty zacieľovali na dynamické vytváranie stránok HTML. Tentoraz, pomocou knižnice GD, vytvárame obrázky, takže v tomto prípade musíte zabudnúť počas dizajnu echo a tlač. Štandardne, PHP skript generuje stránku HTML, ktorá nevyžaduje objasnenie vo forme odoslania špeciálneho HTTP-CORE. Ale ak vytvoríme obrázok, na samom začiatku skriptu, musíte zadať svoj typ, odosielanie príslušnej hlavičky, napríklad pre PNG: hlavičku ("Typ obsahu: Image / PNG");

Ďalšie akcie sa pripomínajú s grafickým editorom. Vytvoríte nový obrázok, zadanie rozmerov, vyberte farbu pozadia a uložte ho do požadovaného formátu. Táto postupnosť akcií ilustruje nasledujúci skript:

imageVide.php.

Header ("Typ obsahu: Image / PNG");
$ im \u003d imagecreate (200, 100)
alebo zomri ();
$ couleur_fond \u003d imagecolorolaLOCLOCT ($ IM, 255, 0, 0);
Imagepng ($ im);
?>

Tento malý skript generuje červený obdĺžnik (veľmi skromný, ale dobrý štart). Opis mechanizmu:

  • Funkcia ImageCreate vráti deskriptor $ IM. Deskriptor $ IM sa musí zasielať na všetky funkcie kreslenia obrazu. Parametre funkcie ImageCreate zodpovedajú dĺžke a šírke vytvorenej obrázka (200x100).
  • Úloha prevádzkovateľa alebo zomrie - zachytávanie možných chýb.
  • Vytvorte farbu môže byť vytvorená pomocou funkcie imagecoloroROCLOCLOCLOCLOCT. Používa sa na
    • vytvorenie farby a jeho uchovávanie v premennej, aby sa následné použitie
    • pridať farbu do $ Im Image Palette

Jeho parametre zodpovedajú červeným, zeleným a modrej zložkám farby a predstavujú celé čísla od 0 do 255. V tomto príklade sme vytvorili červenú farbu.

Dôležitá poznámka

táto farba zodpovedá farbe pozadia, pretože sa prvýkrát pridá do palety obrazu.

Calling imageVide.php skript (prázdny_ .php) vytvorí obrázok vo formáte PNG. Aby ste ho mohli používať na webovej stránke, musíte konať, rovnako ako v prípade "klasických" obrázkov.

Celkom ľahké! Môžete dokonca prenášať parametre skriptu, ktorý vytvorí obrázok (napríklad farbu pozadia).

Takže už máte nejaké základné vedomosti, aby ste mohli začať kresliť. Ak ich chcete prehlbovať - \u200b\u200btu sú niektoré zaujímavé funkcie

  • Môžete nahradiť imagecreate na imagecreatetusolor, aby ste vytvorili 32-bitový obrázok (ideálny pre fotografie)
  • Môžete vymeniť funkciu ImagePNG ImageJPEG vytvoriť obrázok vo formáte JPEG (nezabudnite zmeniť parameter funkcie hlavičky na hlavičke ("Typ obsahu: Image / JPEG").
  • Nižšie uvidíme, že generovaný obrázok môže byť uložený

Ii) Funkcie kreslenia obrázkov

Najprv musíte vedieť, že každá kresba je spojená s koncepciou súradníc, takže v tomto malskom odseku článku budeme dať nejaké nápady o tejto otázke.
V ľavom hornom rohu obrazu má súradnice (x \u003d 0, y \u003d 0) a vpravo vpravo (x \u003d šírka obrazu, y \u003d výška obrazu).

Napríklad pre obraz s rozlíšením 100 na 200 pixelov budú súradnice:

Rôzne znaky kresby obrazu sa užívajú ako parametre jeho súradnice. Odovzdať ich v požadovanom poradí. Napríklad, aby sa nakreslil obdĺžnik, je potrebné preniesť súradnice dvoch bodov zodpovedajúcej funkcie (imagekľangle). Súradnice prvého bodu zodpovedajú ľavého horného rohu obrazu, súradnice druhého bodu zodpovedajú vpravo dolného rohu. Nezamieňajte argumenty, pretože niektoré funkcie môžu vydávať chybné výsledky.


Tu je zoznam funkcií, ktoré sú potrebné na kreslenie rôznych tvarov, ako aj na umiestnenie textu na vytvorený obrázok.
Pre každú funkciu nájdete stručný opis syntaxe a určenia.
Snažíme sa priniesť príklad použitia pre každú funkciu, tu nájdete len stručný popis. Tabuľka tiež špecifikuje verziu knižnice, ktorá sa začne, s ktorou je podpora jedna alebo iná funkcia. Príklady používania niektorých funkcií nájdete v časti úradnej príručky určenej na

Príklad syntaxe

Popis

Vytvorí prázdne plátno (256 farieb) $ im $ veľké výška a $ hauteur šírka. (Formát PNG je preferovaný)

Táto funkcia je podobná imagecreate, ale hĺbka farby obrazu nie je obmedzená na 256 farieb. (Formát JPEG je preferovaný)

Miestami v premennej $ COL COLOR COLHLOSTI, KTORÉ SA JE $ ROUGE, $ VOT, $ BLEU (rozsah 0 .. 255). Podrobnosti nájdete v prvej časti.

Vytvorí elipsu na obrázku $ IM s centrom v bode ($ x, $ y), $ l široká, $ h vysoká a $ col farba.

Identická imagellipse, ale elipsa je naplnená $ COL

Vytvorí sa $ COL farebný obdĺžnik na obrázku, ktorý sa nachádza medzi bodom so súradnicami ($ x, $ y) a dolný pravý uhol farby $ COL

Nakreslí čiaru farby $ COL, ktorá prechádza medzi dvoma bodmi so súradnicami ($ x1, $ y1) a ($ x2, $ y2)

Obrázok $ IM maľovať polygón, ktorého súradnice sú uvedené v $ body array ($ body \u003d $ x0, $ body \u003d $ y0, $ body \u003d $ x1, $ body \u003d $ y1, atď), $ num_1Points - Množstvo Body v poľa, $ COL - COLOR.

Identické imagepolygo, ale elipsa je naplnená $ COL

Image $ IM kreslí obdĺžnik, z toho ľavý horný roh má súradnice ($ x0, $ y0) a nižšie dolné ($ x1, $ y1). $ col - obdĺžnik farba

Identický imagetektáž, ale elipsa je naplnená $ COL

Tieto funkcie vám umožňujú zmeniť štýl statických liniek. Viac informácií nájdete v oficiálnej dokumentácii, najmä venujte pozornosť používaniu funkcie ImagesTyle, ktorá je tiež indikatívna pre funkciu ImageStenetBrush.

V obraze $ IM maľuje bod so súradnicami ($ x, $ y) a $ COL

Zmení hrúbku riadkov vytvorených rôznymi funkciami.

V obraze, $ IM vytvára linku $ recept s súradnicami (ľavý horný roh) ($ x, $ y) $ col col col col col col col col col policajné farby - veľkosť (headset) font (od 0 do 5)

Identický obraz, ale reťazec sa zobrazí vertikálne

Iii) Príklad je prvý: Štatistiky návštev stránok vo forme grafu

Ak chcete použiť poznatky získané v praxi - vytvorte jednoduchý príklad skriptu. Často je potrebné prezentovať štatistiku návštev stránok vo forme histogramu

Predpokladáme, že ste už vyvinuli časť skriptu, ktorý je zodpovedný za účtovníctvo pre návštevníkov (prípadne pomocou tabuľky MySQL). Nebudeme hovoriť o jej implementácii, toto nie je účel tohto článku. Predpokladajme, že návšteva štatistiky pre každý mesiac je umiestnený v rade návštev $. V tomto článku vyplníme pole "Manuálne", ale môžete to urobiť sám pomocou údajov vášho MySQL tabuľky.

a) Štatistika návštevy: Vytvorenie obrazu a farby

Začnime s vytvorením radu, ktorý obsahuje štatistiku návštev stránok po dobu 12 mesiacov (12 prvkov). Potom vygenerujeme obrázok s rozlíšením 400x300 a vytvoríme tri farby, z ktorých jedna (biela) bude farbou pozadia.

návšteva.php.

$ Návštevy \u003d Array (138, 254, 381, 652, 896, 720, 140, 556, 663, 331, 407, 768);

Header ("Typ obsahu: Image / PNG");
$ veľkého štúdia \u003d 400;
$ hauteurimage \u003d 300;
$ im \u003d imagecreate ($ veľké, $ hauteurimage)
ALEBO ZOMRI ( "Chyba pri vytváraní obrázka");

$ noir \u003d imagecolorolalcalocation ($ im, 0, 0, 0);
$ bleu \u003d imagecolorolalcalocation ($ im, 0, 0, 255);
?>

b) Nakreslite os grafu

Umiestnite horizontálnu os času (jednoduchú čiernu čiaru) do spodnej časti obrazu, pričom pole v priebehu 10 pixelov.

V spodnej časti podpíšeme číslo každej z 12 mesiacov pomocou cyklu a obrazu. Čísla sa nachádzajú každých 30 pixelov, počnúc na ľavej strane obrazu.

Nakoniec trávime vertikálnu čiaru, os Štatistiky nájdenia.

// Držte horizontálnu čiaru, os Abscissu (čas)
Imageline ($ im, 10, $ hauteurimage-10, $ veľkéhoímage-10, $ hauteurimage-10, $ noir);
// stiahnuť poradové číslo každého z 12 mesiacov
pre ($ mois \u003d 1; $ mois imagestring ($ im, 0, $ mois * 30, $ hauteurimage-10, $ mois, $ noir);
}

// Vykonávame vertikálnu čiaru k osi ordinácie (počet návštev)
Imageline ($ im, 10, 10, 10, $ hauteuriage-10, $ noir);
?>

c) nakresliť tyčinky

Teraz choďte na zložitejšiu úlohu - kreslenie palice.

Po prvé, musíme zistiť maximálny počet návštevníkov, ktoré budeme prítomní v harmonograme. Tu sme si vybrali náhodnú hodnotu - 1000, ale v skutočnosti budete musieť vypočítať, vykonať žiadosť o maximálnu hodnotu stĺpca vášho tabuľky MySQL. Urobíme to jednoduchšie ...

Za každý mesiac je potrebné vypočítať výšku vytvoreného obdĺžnika. Na to je potrebné vyriešiť rovnicu, s vedomím, že výška obdĺžnika (tyčiniek) pre maximálny počet návštev bude rovný výške celého obrazu. Na základe počtu návštev za určitý mesiac dostaneme požadovanú výšku

Zostáva len nakresliť každý obdĺžnik, počnúc súradnicami ľavého ľavého rohu a končiace vpravo dole.

Pridajte počet návštev na mesiac cez každý obdĺžnik, aby ste zlepšili histogram.

// maximálne návštevy
$ ritesMax \u003d 1000;

// Nakreslite palicu
pre ($ mois \u003d 1; $ mois<= 12 ; $mois ++) {
$ Hauteurimagefectanglekt \u003d kolo (($ návštevy [$ mois - 1] * $ hauteurimage) / $ návštevnosťMax);
IMPACLEDREKTLEKTRUGING ($ IM, $ MOIS * 30 - 7, $ Hauteurimage - $ HauteurImagetectanglek, $ Mois * 30 + 7, $ HauteurImage - 10, $ BLEU);
Imagestring ($ im, 0, $ mois * 30 - 7, $ Hauteurimage - $ HauteurImageectekTiang - 10, $ návštevy [$ Mois - 1], $ noir);
}

// to je všetko
Imagepng ($ im);
?>

d) A tu je výsledok!

Výsledkom, samozrejme, nevolajte vynikajúce, ale treba mať na pamäti, že sa nám podarilo urobiť niečo viac či menej reprezentatívne písaním len 20 riadkov jednoduchého kódu, ktorý nie je zlý.

Histogram dochádzky po dobu 12 mesiacov.


IV) iné užitočné funkcie

Tu je ďalší súbor užitočných funkcií určených na správu palety farieb, ako aj na získanie rôznych informácií o obrázku.

Popis

"Táto funkcia používa názov súboru $ fichier ako parameter a vráti pole obsahujúce 4 prvky: (1) $ tabloau obrazu šírka (px), (2) $ tabloauea výška obrazu (px), (3) $ Typ obrázka Tabauau (cm. Dokumentácia), (4) $ tabloau vráti reťazec, ktorý je možné vložiť do značky IMG (šírka \u003d "" 1024 "" výška \u003d "" 768 ")"

Obrazová oblasť $ IM, farba $ COL sa stane transparentným. Ak chcete uložiť transparentnosť, použite formát PNG

Skopírujte obdĺžnikový obrazový priestor $ src_im na obrázku $ dst_im. Kopírovanie je obmedzená na súradnice bodu horného ľavého uhla ($ SRC_X, $ SRC_Y), $ SRC_L šírka a $ SRC_H \u200b\u200bvýšky. Kopírovaná oblasť sa objaví v obraze v bode so súradnicami. ($ Dst_x, $ dst_y)

Identická imagecopy, okrem toho funkcia vykonáva postupný prechod tónov intenzity $ intensity, ktorý berie hodnoty od 1 do 100.

Vykonáva rovnaký účinok ako imagecopy a tiež zmení veľkosť obrazu. Pozrite si nasledujúci príklad

Identické imagecopyResaMpled, ale výsledok škálovania je menší, ale funkcia funguje rýchlejšie.

Vracia identifikátor zdrojov, $ IM, označujúci obrázok, ktorý je v súbore formátu JPEG $ FIMIER.

Vracia identifikátor zdroja, $ IM, indikujúci obrázok, ktorý sa nachádza v PNG $ Fichier PNG formát.

Vráti šírku IMAGE $ IM

Vráti výšku $ IM

V) Príklad druhého: miniatúrna generácia (znížené obrázky kopírovania)

Tento príklad je určený na vytvorenie zníženej kópie existujúceho obrazu. Túto funkciu môžete vykonať pri písaní fotogalérie na PNP, v ktorej sú fotografie prezentované vo forme miniatúrne a návštevník môže kliknúť na ne s myšou na zväčšenie. V tomto príklade vygenerujeme miniatúru vybavenú snímkou \u200b\u200ba niektorými vysvetleniami (veľkosť a názov obrázka)

a) Začiatok

Na rozdiel od prvého príkladu, tento skript zaznamená záber do súboru a nevytvorte ho za lietať. Preto potreba odoslať špeciálnu hlavičku HTTP pomocou funkcie hlavičky () zmizne. Tak, skript sa stáva "klasickým" a môže generovať HTML.

Začnime s vytvorením prázdnych plátnov s veľkosťou 200x150, potom zvážte existujúci obraz (zo súboru) pomocou funkcie ImageCREAFROMJPEG. Potom môžeme tiež potrebovať veľkosť zdrojového obrazu, na to budeme používať obrázkyx a obrázky.

miniature.php.

$ fichierce \u003d "photo3.jpg";

$ Vyučovači \u003d 200;
$ hauteurdestination \u003d 150;
$ IM \u003d IMAGECREACEECOLOR ($ vyškvrnenie, $ hauteurdestination)
ALEBO ZOMRI ( "Chyba pri vytváraní obrázka");

$ Zdroj \u003d imagecreateefromjpeg ($ fichierce);

$ lackerource \u003d Imagexx ($ zdroj);
$ hauterource \u003d snímka ($ zdroj);
?>

b) rám

Po vytvorení niekoľkých farieb nakreslite rám. Aby sme zjednodušili úlohu, použijeme rôzne odtiene sivej.

Existuje jednoduchý spôsob, ako vytvoriť podobný rám, ktorý leží v kresbe niekoľkých viacfarebných obdĺžnikov vložených v inom. Začneme z najväčšieho obdĺžnika temnej farby (jeho veľkosť sa zhoduje s veľkosťou obrazu). Potom uložíme ďalší menší obdĺžnik veľkosť, ktorej farba bude ľahšia atď.

Hrúbka rámu vytvoreného nami je 8 pixelov.

$ BLANCE \u003d IMAGECOLOOROLOCLOCT ($ IM, 255, 255, 255);
$ Gris [0] \u003d imagecolorolaLOCLOCT ($ IM, 90, 90, 90);
$ Gris [1] \u003d imagecoloroROOLOCLOCT ($ IM, 110, 110, 110);
$ Gris [2] \u003d imagecolorolalcalocation ($ IM, 130, 130, 130);
$ Gris [3] \u003d imagecolorolaLOCLOCTACT ($ IM, 150, 150, 150);
$ Gris [4] \u003d imagecolorolalcalocation ($ IM, 170, 170, 170);
$ Gris [5] \u003d imagecolorolalcalocation ($ IM, 190, 190, 190);
$ Gris [6] \u003d imagecolorolalcalOCT ($ IM, 210, 210, 210);
$ Gris [7] \u003d imagecolorolalcalOCT ($ IM, 230, 230, 230);

Pre ($ i \u003d 0; $ i<= 7 ; $i ++) {
IMPACLEDREKTREKTY ($ IM, $ I, $ I, $ LARGEURDENCION - $ I, $ Hauteurdestination - $ I, $ GRIS [$ I]);
}
?>

c) vytváranie miniatúr

Na vytvorenie miniatúr sa používa funkcia imagecopyResampleded. Skopíruje jeden obrázok do druhého, môže zmeniť veľkosť kopírovanej oblasti. Táto funkcia má niekoľko parametrov, ktorých hodnota je zrejmá. Uvádzame im v poriadku:

  • ($ im) príjemca obrazu
  • ($ Zdroj) obrázok-zdroj
  • Súradnica obrazu prijímajúceho obrazu, ku ktorému je obraz prekrytý.
  • Koordinovať y.
  • Súradnica X Kopírovať zdroj obrazu (0, ak chceme skopírovať celý obrázok)
  • Súradnice (y)
  • Šírka kopírovania, ktorá je vložená do zdrojového obrazu ($ vyškromuce- (2 * 8) šírku prijímajúceho obrazu mínus šírka rámca vpravo a doľava).
  • Výška kopírovania (robíme rovnaké operácie ako so šírkou)
  • Šírka oblasti kópií
  • , $ hauterource);
    Imagestring ($ im, 0, 12, $ Hauteurdestination - 18, "$ Fichierce - ($ LargeRursource X $ Hautesource)", $ Blanc);
    ?>

    d) Úspora výsledku.

    Výsledok môžeme ušetriť len v súbore, ktorého meno začína s Mini_. Toto budeme robiť s funkciou ImageJPEG.
    Keď má táto funkcia len jeden parameter, obraz sa zobrazí v prehliadači používateľa. Ak sa však názov súboru odovzdá ako druhý parameter, nestane sa s prehliadačom a obraz sa uloží do zadaného súboru. Rovnaké pravidlo je platné pre funkciu ImagePNG

    Môj obrázok sa nezobrazí, prehliadač sa správa, akoby neexistuje.
    S najväčšou pravdepodobnosťou, chyba by mala byť podpísaná vo vašom skripte. Urobte komentár od reťazca hlavičky ("Typ obsahu: Image / PNG") (alebo hlavičku ("Typ obsahu: Image / JPEG"), ako aj z reťazca ImagePNG ($ IM) (ORIMAGEJPEG ($ IM) )) Ak chcete získať chybové hlásenie

    Skript je dlhý na mojom hostingu, je to normálne?
    Ak používate "ťažké" funkcie ako imagecopyResampled, nie je prekvapujúce. Tlmočník PHP, inštalovaný na hosting, a bez tejto práce je dosť ...

    Farby môjho obrazu sú skreslené (alebo sa zobrazujú ako čiernobielo), prečo?
    Najpravdepodobnejšie ste použili funkciu imagecreate, ktorá obmedzuje farebnú paletu 256 farieb. Na prekonanie tohto obmedzenia namiesto predstaviteľa použite funkciu ImageCreateSolor.

    Dokončenie tohto článku uvádzame výsledok, ktorý možno získať kombináciou dvoch príkladov tohto článku. Tu sme pridali poltón do histogramu s použitím rovnakej metódy ako v príklade 2.

    Výsledok


V tomto článku budeme podrobne popíšeme mechanizmus na načítanie obrázkov na server pomocou PHP bez uchýlenia sa s komponentmi a rámcami tretích strán. Naučíme sa bezpečne vložiť obrázky nielen z lokálneho používateľského stroja, ale aj vzdialených súborov podľa odkazu. Všetky príklady kódu píšem v procedurálnom štýle, aby ste si prečítali kód rýchlejšie a nepresklikoval z jednej metódy na druhú. Manuálne plne autorské práva a netvrdí žiadnu akademickosť prezentácie.

§Ne. Všeobecné zásady

Celá sekvencia načítania obrazu na server môže byť zobrazená nasledovne: nastavenie php.inidostať sabezpečnostná kontrolaoverovanie dátuloženie na disku. Proces načítania obrazu z počítačového počítača alebo adries URL nie je iný, okrem spôsobu získania obrazu a jeho úsporu. Všeobecná schéma načítania obrazu na serveri je nasledovná:

Ak chcete potvrdiť obrázok na adrese URL, použijeme funkciu GetimageSizeFromstring (), pretože Curl ho stiahne do premennej pre ďalšie manipulácie.

Ako načítame obrázky na server, bolo by dobré skontrolovať ich špecifické parametre: šírka, výška, typ Obrázky, veľkosť Súbor v bajtoch. Záleží na logike vašej aplikácie, ale pre jasnosť v tomto návode, skontrolujeme všetky parametre opísané vyššie.

§2. Bezpečnostné predpisy

Bezpečnosť zaťaženia obrazu sa znižuje, aby sa zabránilo cudzejmu kódu na server a jeho vykonanie. V praxi, načítanie obrázkov najzraniteľnejšie miesto v aplikáciách PHP: shell skript, bude škodlivý kód v binárnych súboroch, podpísanie údajov EXIF. Aby ste sa vyhli väčšine metód hacku, musíte dodržiavať nasledujúce pravidlá:

ale nie Dôverové údaje z $ _files;
b. nie Skontrolujte typ obrázkov MIME z funkcie GetimagesIze ();
v súborovom súbore vytvorte nový názov a expanziu;
g Zakázať vykonanie PHP skriptov v priečinku Picture;
d. nie Vložte údaje o užívateľoch prostredníctvom vyžadujúcu a zahrňte;
e Pre $ _Files Použite IS_UPLOADED_FILE () a MOUND_UPLOADED_FILE ().

Ak existuje niečo, čo pridá "bezpečnostné pravidlá", potom nechajte svoje pripomienky alebo odkazy na bezpečnostné články v pripomienkach k tejto príručke a uverejňujem ich v tomto odseku.

§3. Konfigurácia php.ini

PHP vám umožňuje vytvoriť špecifické konfiguračné hodnoty v procese sťahovania súborov. Aby ste to urobili, je potrebné v súbore php.ini nájsť bloky " Limity zdrojov.», « Manipulácia s údajmi"A" Upload súborov."A potom upravte, ak je to potrebné, nasledujúce hodnoty:

; \\ T Maximálny čas realizácie skriptu v sekundách Max_Execution_Time \u003d 60. ; \\ T Maximálna spotreba pamäte s jedným skriptom MEMORY_LIMIT \u003d 64m. ; \\ T Maximálna prípustná veľkosť údajov odoslaných postskou metódou Post_max_size \u003d 5m. ; \\ T Povolenie na prevzatie súborov FILE_UPLOADS \u003d ON. ; \\ T Priečinok pre ukladanie súborov počas stiahnutia UPLOAD_TMP_DIR \u003d Domov / User / Temp ; \\ T Maximálna veľkosť prevzatého súboru Upload_max_filesize \u003d 5m. ; \\ T Maximálny povolený počet súčasne stiahnuteľných súborov Max_file_uploads \u003d 10.

Na základe uvedených hodnôt nebude užívateľ schopný nahrať viac ako desať súborov naraz, a každý súbor by nemal prekročiť 5 MB. Parametre z bloku " Limity zdrojov.»Sme potrební na stiahnutie vzdialeného súboru, pretože s Curl, stiahneme obsah premennej a skontrolujeme ho na kritériách, ktoré potrebujeme, a pre to potrebujete navyše čas a pamäť.

Konfiguračný súbor PHP.INI je vždy potrebný na konfiguráciu podľa obchodnej logiky webovej aplikácie. Napríklad plánujeme nahrať najviac desať súborov až 5 MB, čo znamená, že musíme byť potrební ~ 50 MB pamäte. Okrem toho musíme poznať maximálny čas načítania jedného súboru z lokálneho počítača a na odkaz, aby ste nastavili dostatočný čas vykonania skriptu v Max_Execution_Time a nie sú vystrašené chyby používateľov.

§Four. Načítavanie obrázkov z formulára

Teraz nebudeme zvážiť sťahovanie viacerých súborov na server, a budeme analyzovať iba samotnú mechaniku sťahovania na príklad jedného súboru. Takže na vloženie obrázka z počítača počítača, musíte použiť formulár HTML na odosielanie súboru script PHP pomocou metódy príspevku a zadajte metódu kódovania údajov eNCTYPE \u003d "MultiPart / Form-Data" (V tomto prípade sa údaje nekódujú a táto hodnota sa aplikuje len na odosielanie binárnych súborov). S nižšie uvedeným formulárom budeme pracovať ďalej:

Pre pole výberu súborov používame názov. názov \u003d "Upload" V našej forme HTML, hoci to môže byť akékoľvek. Po odoslaní súboru PHP skriptovacieho súboru-handler.php je možné zachytiť pomocou superglobálnej premennej $ _FILES ["UPLOAD"] S rovnakým názvom, ktorý v poli obsahuje informácie o súbore:

Pole ( \u003d\u003e Picture.jpg. // Pôvodný názov súboru \u003d\u003e Image / JPEG // MIME typ súboru \u003d\u003e HOME PRIPOJENIE PRIPOJENIA PHPD07E.TMP // BINOVÝ SÚBOR \u003d\u003e 0 // kód chyby => 17170 // veľkosť súboru v bajtoch)

Nie všetky údaje $ _FILES. Môžete dôverovať: MIME-Type a veľkosť súboru je možné falšovať, pretože sú vytvorené z HTTP odozvy a rozšírenie v názve súboru by nemalo byť dôveryhodné kvôli tomu, že úplne iný súbor môže byť skrytý. Ďalej je však potrebné skontrolovať, či je náš súbor načítaný správne a či už topánka. Ak to chcete urobiť, skontrolujte chyby $ _FILES ["UPLOAD"] ["ERROR"] A uistite sa, že súbor je načítaný poštou pomocou funkcie iS_UPLOADED_FILE (). Ak niečo nie je na pláne, to znamená, že sa chystá na obrazovke.

// Rebaptizovať premenné pre pohodlie $ filepath \u003d $ _FILES ["UPLOAD"] ["TMP_NAME"]; $ ERRORCODE \u003d $ _FILES ["UPLOAD"] ["ERROR"]; // Skontrolujte chyby IF ($ ERRORCODE! \u003d\u003d UPLOAD_ERR_OK ||! IS_UPLOADED_FILE ($ FOLEPATH)) // pole s menami chýb $ ERORMESSAGES \u003d [UPLOAD_ERR_INI_SIZE \u003d\u003e "Veľkosť súboru prekročila hodnotu Update_max_FILESIZE v konfigurácii PHP.", Upload_err_form_size \u003d\u003e "Veľkosť stiahnutého súboru prekročila hodnotu Max_file_size v html-forme.", UPLOAD_ERR_PARTIÁLNE \u003d\u003e "Súbor sťahovania bol získaný len čiastočne.", UPLOAD_ERR_NO_FILE \u003d\u003e "Súbor nebol naložený.", UPLOAD_ERR_NO_TMP_DIR \u003d\u003e "Neexistuje žiadny dočasný priečinok.", Upload_err_cant_write \u003d\u003e "Nepodarilo sa nahrať súbor na disk.", Upload_err_extension \u003d\u003e "Predĺženie PHP prestalo sťahovanie súboru.", ]; // Nastavte neznáme chybu $ UnkinkingMessage \u003d. "Pri sťahovaní súboru sa vyskytla neznáma chyba."; // Ak nie je žiadny kód chyby v poli, povedzme, že chyba nie je známa $ OutTopMessage \u003d ISSET ($ ErrorMessages [$ ERRORKODE])? $ ERORMESSAGES [$ ERRORCODE]: $ UnkinkingMessage; // Vyberte názov chyby Zomrieť ($ výstup); )

Aby bol útočník načítaný škodlivý kód zabudovaný do obrazu, nemôžete dôverovať funkciám getimagesize ()ktorý tiež vráti typ MIME. Funkcia očakáva, že prvý argument odkaz na správny obrazový súbor. Reálny typ MIME môžete definovať cez rozšírenie FileInfo. Nižšie uvedený kód skontroluje prítomnosť kľúčového slova obraz. V type nášho stiahnuteľného súboru a ak sa nezobrazí, bude to chybu:

// Vytvorte zdroj FileInfo $ FI \u003d FINFO_OPEN (FileInFO_MIME_TYPE); // Získame MIME typ $ MIME \u003d (String) Finfo_file ($ Fi, $ Filepath); );

V tomto štádiu môžeme už na našom serveri nahrať absolútne nejaké obrázky, ktoré kontroluje typ MIME, ale na načítanie obrázkov na určité vlastnosti, musíme ich overiť pomocou funkcie getimagesize ()ktorý by mohol byť binárny súbor $ _FILES ["UPLOAD"] ["TMP_NAME"]. V dôsledku toho získame pole 7 prvkov:

Array (\u003d\u003e 1280 // Šírka \u003d\u003e 768 // Výška \u003d\u003e 2 // TYPY \u003d\u003e Šírka \u003d "1280" Výška \u003d "768" // Atribúty pre HTML \u003d\u003e 8// farebná hĺbka => 3 // farebný model \u003d\u003e Image / JPEG // typ MIME)

Na ďalšie overenie obrazu a práce na ňom potrebujeme vedieť iba 3 hodnoty: šírka, výška a veľkosť Súbor (na výpočet funkcie aplikovať veľkosť veľkosť súboru () Pre binárny súbor z dočasného priečinka).

// Funkcia výsledkov Write v premennej $ image \u003d getimagesize ($ filepath); $ Lastbytes \u003d 1024 * 1024 * 5; $ outwidth \u003d 1280; $ limitheight \u003d 768; // Skontrolujte požadované parametre IF (FileSize ($ FilePath)\u003e $ LIMINTBLYTES) Die ( "Veľkosť obrazu by nemala prekročiť 5 MB."); Ak ($ obrázok\u003e $ limithight) zomrie (); Ak ($ image\u003e $ limitwidth) zomrie ();

Po všetkých kontrole môžeme s dôverou presunúť naše miesto na stiahnutie do niektorých obrázkov priečinka. Lepšie prostredníctvom funkcie move_Uploaded_file ()ktorý pracuje v núdzovom režime. Pred presunutím súboru nemôžete zabudnúť generovať náhodné meno a expanziu z typu obrázku Pre našu súboru. Vyzerá to:

// Generovať nový názov súboru založený na MD5-HASH $ NAME \u003d MD5_FILE ($ FOLEPATH); // socil .jpeg pred .jpg// Presuňte obrázok novým menom a rozšírením do priečinka / fotky Ak (! Move_Uploaded_file ($ Filepath, __DIR__. "/ Pics /". $ Formát)) (Die ( "Pri písaní obrázka sa vyskytla chyba."); }

Toto je dokončené. Pre pohodlnejšie prevzatie súborov môžete použiť triedu UPLOADEdFile z balíka Symfony httpfountation, ktorý je obal $ _FILES. a tiež uloží súbor move_Uploaded_file ().

§päť. Načítanie obrazu podľa odkazu

Pre stiahnutie obrazu podľa odkazu, potrebujeme kučernú knižnicu, ktorá pracuje so vzdialenými zdrojmi. S ním si stiahneme obsah v premennej. Na jednej strane sa môže zdať, že na tieto účely to bude file_Get_Contes ()Ale v skutočnosti nebudeme schopní ovládať objem stiahnuteľných dát a normálne spracovávať všetky chyby. Aby bolo možné zvrátiť správne stiahnuť údaje, ktoré potrebujeme: nechajte nasledovať presmerovaniePovoliť kontroly osvedčenieBod maximálny čas Curl funguje (vytvorené z dôvodu objemu stiahnuteľných dát a priemernej rýchlosti so zdrojom). Ako prevziať súbor na premennú uvedenú nižšie s potrebnými parametrami:

// nejako dostaneme odkaz $ URL \u003d "https://site.ru/picture.jpg"; // skontrolujte http v adrese odkazu Ak (! preg_match ("/ ^ https ?: / I", $ URL) && filter_var ($ URL, filter_Validate_url)) (Die ( "Zadajte správny odkaz na vzdialený súbor."); } // Spustite Curl s naším odkazom $ CH \u003d CURL_INIT ($ URL); // Zadajte nastavenia pre CURLL Curl_setopt_array ($ CH, [ // Uveďte maximálne pracovné hodiny curl Curlopt_timeout \u003d\u003e 60, // umožniť nasledovať presmerovanie Curlopt_followLocation \u003d\u003e 1, // Umožnite výsledok písať v premennej Curlopt_returnTransfer \u003d\u003e 1, // Zapnite indikátor dátového zaťaženia Curlopt_noprogress \u003d\u003e 0, // maľovať veľkosť vyrovnávacej pamäte 1 kb Curlopt_buffersize \u003d\u003e 1024, // Napíšte funkciu pre počítanie prevzatých údajov // Prečítajte si viac: http://stackoverflow.com/a/17642638 CURLOPT_PROGRESSHUNDÁCIA \u003d\u003e FUNKCIA ($ CH, $ DWNLDSIZE, $ Dwnld, $ UpredSIZE, $ updd) ( // Keď sa stiahne viac ako 5 MB, Curl preruší prácu ak ($ \u200b\u200bDwnld\u003e 1024 * 1024 * 5) (Return - 1;)), // Zapnite kontrolu certifikátu (štandardne) Curlopt_ssl_verifepeer \u003d\u003e 1, // skontrolujte názov certifikátu a jeho zhodu s zadaným hostiteľom (štandardne) Curlopt_ssl_verifyhost \u003d\u003e 2, // Uveďte certifikát overovania // na stiahnutie: https://curl.haxx.se/docs/caextract.html CURLOPT_CAINFO \u003d\u003e __DIR__. "/Cacert.pem",]); $ Surové \u003d curl_exec ($ CH); // Stiahnite si údaje na premennú $ info \u003d curl_getinfo ($ C); // Dostávame informácie o operácii $ ERROR \u003d CURL_ERRNO ($ CH); // Napíšte kód poslednej chyby // Kompletné curl session Curl_close ($ CH);

Ak všetko úspešne prešlo úspešne a Curl sa stretol za 60 sekúnd, potom sa obsah na prepojení stiahne na premennú $ Surové.. Okrem toho funkcia curl_getinfo () Späť na požiadanie o požadovanom požiadavke, odkiaľ môžeme získať viac informácií na analýzu práce so vzdialenými zdrojmi:

Pole ( \u003d\u003e Image / JPEG // typ MIME z typu obsahu => 200 // Posledný kód HTTP => 0 // Počet presmerovaní => 0.656 // Celkový čas Curl => 0.188 // Čas na pripojenie s hostiteľom => 4504 // Skutočná veľkosť údajov => 4504 // veľkosť údajov z dĺžky obsahu /* ... */ )

Ďalej musíme skontrolovať, či nie sú žiadne chyby curl_errno () A uistite sa, že zdroj poskytuje HTTP kód rovný 200, inak povieme, že nebolo nájdené pre takúto adresu URL. Po všetkých kontrolách $ Surové. Prenos B. getImagestring () A pracujeme už na výfukovom systéme ako v prípade načítania obrázkov z formulára.

Upozorňujeme, že vyhráme veľkosť súboru v čase prijímania údajov, pretože nemôžeme dôverovať Curl_GetInfo (), pretože Content_Type, HTTP_CODE HODNOTKY, ROTTVY_CONTENT_LENGENGHT sú tvorené na základe získaných titulkov HTTP. Stiahnite si súbor úplne a potom skontrolujte počet bajtov bude vyžadovať veľa času a pamäte. Preto sme kontrolovali veľkosť získaných údajov pomocou možnosti CURLOPT_PROGRESSHUNDÁCIE: Akonáhle Curl dostane viac údajov ako náš limit, prestane fungovať a dávať Curle_ABORTED_BY_CALLACK chybu.

// Skontrolujte chyby CURL a dostupnosť súboru IF ($ ERROR \u003d\u003d\u003d CURLE_OPERE_TIMEDOUT) DIE "Prekročený obmedzený očakávania."); Ak ($ ERROR \u003d\u003d\u003d Curle_ABORTED_BY_CALLOCK) "Veľkosť by nemala prekročiť 5 MB."); Ak ($ info ["http_code"]! \u003d\u003d 200) Die ( "Súbor nie je k dispozícii."); // Vytvorte zdroj FileInfo $ FI \u003d FINFO_OPEN (FileInFO_MIME_TYPE); // Dostať typ MIME pomocou obsahu $ surový $ MIME \u003d (String) Finfo_Buffer ($ FI, $ RAO); // Zatvorte zdroj FileInfo FINFO_CLOSE ($ FI); // Skontrolujte obrázok kľúčového slova (obrázok / JPEG, Image / PNG atď.) Ak (Stross ($ MIME, "obrázok") \u003d\u003d\u003d False) Die ( "Môžete si stiahnuť iba obrázky."); // Vezmite si obrazové údaje z jeho obsahu. $ image \u003d getimagesizefromstring ($ surové); // Nastavte obmedzenia obrázkov $ outwidth \u003d 1280; $ limitheight \u003d 768; // Skontrolujte požadované parametre Ak ($ obrázok\u003e $ limithight) zomrie ( "Výška obrazu by nemala prekročiť 768 bodov."); Ak ($ image\u003e $ limitwidth) zomrieť ( "Šírka obrazu by nemala prekročiť 1280 bodov."); // Generovať nový názov z MD5-Hash Image $ NAME \u003d MD5 ($ RAW); // Generovať rozšírenie súborov na základe typu obrázka $ Extension \u003d image_type_to_extension ($ image); // socil .jpeg pred .jpg $ Formát \u003d str_replace ("jpeg", "jpg", $ rozšírenie); // Uložte obrázok novým menom a rozšírením do priečinka / fotiek Ak (! File_put_contes (__DIR__. "/ Pics /". $ Formát, $ RAW) (Die ( "Pri ukladaní obrázka sa vyskytla chyba."); }

Môžete použiť obrázok, ktorý chcete uložiť file_put_contes ()ktorý zaznamená obsah do súboru. Nový názov súboru Vytvoríme prostredníctvom funkcie mD5 ()a rozšírenie image_type_to_extension (). Teraz môžeme nahrať všetky obrázky na odkaz.

§6. Nastavenie výberu viacerých súborov

V tejto časti budeme analyzovať metódy preberania viacerých obrázkov naraz od lokálneho používateľského počítača a na vzdialených odkazoch. Používame odkazy na odosielanie odkazov $ _POST. a dajte nám to všetky údaje pomocou značky textarea.. Ak chcete prevziať súbory z formulára, budeme pokračovať v práci $ _FILES.. Naša nová html forma bude trochu odlišná od starej.

Na konci názvu výberu súborov názov \u003d "Upload" Pridané zátvorky a atribút násobnýktorý umožňuje prehliadač vybrať viacero súborov. Všetky súbory sú stiahnuté znova v dočasnom priečinku, ak nie sú žiadne chyby v php.ini. Môžete ich zachytiť $ _FILES.Ale tentoraz bude mať variabilná variabilná konštrukcia nepohodlnou štruktúrou pre spracovanie dát v poli. Táto úloha rieši malé manipulácie s pole:

// Zmeňte štruktúru $ _FILES FOREACH ($ _FILES ["UPLOAD"] AS $ KEY \u003d\u003e $ VALUE) (FOREACH (hodnota $ AS $ K \u003d\u003e $ V) ($ _FILES ["UPLOAD"] [$ K] [$ KEY] \u003d $ V; ) // odstrániť staré kľúče Unset ($ _files ["Upload"] [$ tlačidlo]); ) // načítajte všetky obrázky v poradí FORECH ($ _FILES ["UPLOAD"] AS $ K \u003d\u003e $ V) // Vložte jeden súbor $ _FILES ["UPLOAD"] [$ K] ["TMP_NAME"]; $ _FILES ["UPLOAD"] [$ K] ["ERROR"]; )

Ak chcete prevziať niekoľko obrázkov na adrese URL, dajte naše odkazy textarea. S menom názov \u003d "Upload"kde môžu byť špecifikované prostredníctvom priestoru alebo z nového riadku. Funkcia preg_split. Katastrofy všetky údaje z $ _POST ["UPLOAD"] A bude tvoriť pole, v ktorom potrebujete chodiť cyklus a každú platnú adresu URL odoslať na obslužný program.

$ data \u003d preg_split ("/ s + /", $ _POST ["UPLOAD"], - 1, PREG_SPLIT_NO_NAGNY); FORECH ($ Údaje ako $ URL) // overiť a načítať obrázok na adrese URL }

Vytvorenie prázdneho obrazu.

Syntax:

Imagecreate (int x, int y)

Vytvorí prázdnu veľkosť obrazu x. na y. A vráti svoj identifikátor. Po vytvorení obrazu sa vykoná všetka práca s ním prostredníctvom tohto identifikátora, analogicky s tým, ako pracujeme so súborom prostredníctvom svojho deskriptora.

Príklad:

Vytvorenie nového obrazu Gd. a stiahnutie na obrazovku prehliadača:

imagecreateefrompng.

Vytvorenie obrazu z súboru PNG.

Syntax:

Int ImageCREAFROMPNG (String FimeName)

Táto funkcia Vložte obrázky z súboru PNG do pamäte a vráti ho na identifikátor. Ako po volaní imagecreate ()

Príklad:

Príkladom nájdenia chyby pri otváraní grafického súboru.

Funkcia Loadpng ($ IMGNAME) ($ IM \u003d @IMAGECREATEEFROMPNG ($ IMGNAME); / * Pokus o otvorenie * / IF (! $ IM) (/ * Pozri, či zlyhal * / $ IM \u003d IMAGECREATE (150, 30); / * Vytvorte prázdny obrázok * / $ BGC \u003d imagecolOrOralOLOCLOCT ($ IM, 255, 255, 255); $ TC \u003d imagecolOralOROCLOCT ($ IM, 0, 0, 0); IMPAFLEDREKTREKTY ($ IM, 0, 0, 150, 30, $ BGC); / * Výstup Errmsg * / Imagestring ($ im, 1, 5, 5, "Chyba načítanie $ Imgname", $ TC);) Return $ IM;)

imagecreateSefromjpeg.

Vytvorenie obrazu z súboru JPEG.

Syntax:

Int ImageCREAFROMJPEG (String FimeName)

imagecreate (), Ďalšia práca s obrazom je možná len prostredníctvom tohto identifikátora. Pri spustení z disku je obrázok vybavený a uložený v pamäti, ktorý je už v rozbalenom formáte, takže môžete s ním robiť rôzne operácie, ako napríklad škálovanie, kreslenie, atď.

imagecReateFROMGIF

Vytvorenie výkresu z súboru GIF.

Syntax:

Int ImageCREAFROMGIF (String FimeName)

Táto funkcia zaťaženie obrázkov zo súboru do pamäte a vráti svoj identifikátor. Ako po volaní imagecreate (), Ďalšia práca s obrazom je možná len prostredníctvom tohto identifikátora. Pri spustení z disku je obrázok vybavený a uložený v pamäti, ktorý je už v rozbalenom formáte, takže môžete s ním robiť rôzne operácie, ako napríklad škálovanie, kreslenie, atď.

Stojí to za zmienku Gd. Od verzie 1.6 nepodporuje formát GIF. V tomto ohľade sa táto funkcia prakticky nepoužíva.

imagepng.

Funkcia zobrazí obraz vo formáte PNG do ľubovoľného prehliadača alebo do súboru.

Syntax:

IMGEPNG (INT IM [, String FimeName])

Táto funkcia uloží obrázok uvedený svojím identifikátorom av pamäti, na disk, alebo ho priviesť do prehliadača.

imagecreate () im..

Ak argument názov súboru. Druh obsahu. HEADER ().

Hlavička ("Typ obsahu: Image / PNG") Pre png.

Príklad: Príklad použitia funkcie imagepng ():

Ak chcete uložiť zdroj zdroja alfa-kanála, použite funkciu imagesAvealpha ():

imagejpeg.

Vytlačte prehliadač obrázkov JPEG alebo uloženie v súbore.

Syntax:

Int imagejpeg (int im [, reťazec filename [, Int kvalita]]

Táto funkcia uloží obrázok uvedený jeho identifikátorom av pamäti na disk, alebo ho zobrazí do prehliadača.

Samozrejme, najprv musí byť obraz načítaný alebo vytvorený pomocou funkcie. imagecreate (). Musíme poznať jeho identifikátor im..

Ak argument názov súboru. Vynechané, potom komprimované dáta vo vhodnom formáte sa zobrazia priamo do štandardného výstupného toku, t.j. V prehliadači. Požadovaný titul Druh obsahu. Nezobrazuje sa, podľa ktorého potrebujete ho vybrať ručne HEADER ().

V skutočnosti musíte volať jeden z troch príkazov v závislosti od typu obrázka:

Hlavička ("Typ obsahu: Image / JPEG") Pre jpeg

Tretí voliteľný parameter kvalita. Nastavuje kvalitu obrazu (od 0 do 100).

image2WBMP

Zobrazenie obrazu do prehliadača alebo súboru.

Syntax:

INT Image2WBMP (Obrázok zdroja [, String FimeName [, Int Prahhold]])

Funkcia zobrazuje obrázok určený deskriptorom obraz., V prehliadači alebo do súboru, ktorého názov je nastavený voliteľným parametrom názov súboru..

Ak sa obraz zobrazí v prehliadači, musíte zadať typ WBMP ako funkciu Image / VND.wap.wbMP HEADER ():

Funkcia image2WBMP () K dispozícii Php. iba v prípade, že verzia knižnice Gd. 1.8 alebo nižšie.

imagegif.

Odoslanie obrázka prehliadača GIF alebo jeho uloženie do súboru.

Syntax:

Int imagegif (int im [, string filename])

Funkcia Uložte obrázok zadaný svojím identifikátorom av pamäti na disk alebo ho vydáte do prehliadača.

Samozrejme, najprv musí byť obraz načítaný alebo vytvorený pomocou funkcie. imagecreate (). Musíme poznať jeho identifikátor im..

Ak argument názov súboru. Vynechané, potom komprimované dáta vo vhodnom formáte sa zobrazia priamo do štandardného výstupného toku, t.j. V prehliadači. Požadovaný titul Druh obsahu. Nezobrazuje sa, podľa ktorého potrebujete ho vybrať ručne HEADER ().

V skutočnosti musíte volať jeden z troch príkazov v závislosti od typu obrázka:

Header ("Typ obsahu: Image / GIF")

Pretože knižnica Gd.Počnúc verziou 1.6 nepodporuje formát GIF, táto funkcia sa používa zriedka.

imagecopy.

Kopírovanie časti vzoru.

Syntax:

Int image (INT DST_IM, INT SRC_IM, INT DST_X, INT DST_Y, INT SRC_X, INT SRC_Y, INT SRC_W, INT SRC_H)

Funkcia skopíruje obdĺžnikovú oblasť z hľadiska ( src_x., src_y.) Šírka src_w. a výška src_h. Z výkresu src_im nakreslenie dst_im., čím sa vytvorí kopírovaná oblasť posunu ( dst_x., dst_y.).

Nasledujúci príklad bude obrázok súbor1.png. úplne kopírované B. file2.png.

imagecopyrizovaný

Kopírovanie kusov vzoru so škálovaním.

Syntax:

Int imagecopyResized (int dst_im, int src_im, int dstx, int dty, int srcx, int srcy, int dstw, int dsth, int srcw, int svr)

Táto funkcia je jednou z najsilnejších a univerzálnych. Použitie ho môžete kopírovať obrázky (alebo ich časti), presunúť alebo ich zmenšiť.

dst_im. Určuje identifikátor obrazu, v ktorom bude výsledok funkcie umiestnený. Tento obraz by už mal byť vytvorený alebo načítaný a mať správne rozmery.

src_im - Identifikátor obrazu, ktorý sa vykonáva práca. Avšak, SRC_IM a DST_IMMOGUT a zhodujú sa.

Parametre srcx., srcy., srcw., srčať Zadajte oblasť vo vnútri zdrojového obrazu, nad ktorým sa bude prevádzka vykonať - resp. Súradnice jeho ľavého horného rohu, šírky a výšky.

Nakoniec, štyria dstx., dTY., dSTW., dsth Určuje miesto v obraze dst_im.ktorý bude "stláčaný" obdĺžnik uvedený v predchádzajúcich štyroch. Všimnite si, že ak sa šírka alebo výška dvoch obdĺžnikov nezhodujú, obraz bude automaticky navrhnutý na natiahnutie alebo stlačenie.

V nasledujúcom príklade súbor1.jpg. Dvakrát sa znižuje a zapíše do súboru file2.jp.g:

imagestroy

Deštrukčný vzor.

Syntax:

Int imagestroy (int im)

Funkcia ničí deskriptor im. Predtým vytvorený vzor (ako zatvorenie súboru fclose () Po otvorení fOPEN ()).

Ak ste AVID PHP developer, pravdepodobne nie je len počuť o GD knižničnej grafike. Pre tých, ktorí nie sú oboznámení s tým, ja vysvetliť GD knižnica umožňuje vytvárať obrazy, upravovať a spravovať ich bez väčšej námahy. Dnes sa oboznámeme s použitím AZA v knižnici GD GRP GRP.

Predovšetkým

Uistite sa, že knižnica GD je nainštalovaná a aktivovaná na vašom serveri. Neviem, ako to urobiť? Nebojte sa, všetko je jednoduché! Stačí vytvoriť súbor PHP na serveri, potom zadajte nasledovné:

Teraz otvorte stránku prehliadača a uvidíte obrovský zoznam funkcií vašej verzie PHP. ROZHNUTIE DO DOWN DOWN DOWNUSTRUJE, Nájdite sekciu "GD" a uistite sa, že je knižnica pripojená. Ak nie, obráťte sa na spoločnosť hosting hosting služby. Našťastie, na väčšine serverov, na ktorých som sa už podarilo pracovať a pracovať, knižnica GD je nainštalovaná a pripojená.

Zdôrazňuje

Poďme cez niektoré hlavné chvíle. Po prvé, urobíme to tak, že prehliadač vydávame všetky chybové správy. To možno dosiahnuť zadaním nasledujúceho na samom začiatku svojho kódu PHP:

ERROR_REPORTING (E_ALL);
?>

Nakresliť námestie

Začnime s najjednoduchším a nakresliť pomocou PHP Blue Square - nič nadprirodzené, samozrejme, ale je potrebné sa zaoberať základmi. Ak chcete získať požadované námestie, musíte vykonať nasledujúce akcie:

Nastavte typ obsahu ako "obrázok" tak, aby prehliadač mohol obraz správne interpretovať;
. Vytvorte nový prázdny obrázok nastavením požadovanej šírky a výšky;
. Make farebné pozadie modré;
. Uložte konečnú možnosť obrázka a preneste ho do prehliadača;
. Vymazať pamäť, ktorá bola použitá na vytvorenie a ukladanie obrazu;
. Usporiadajte zobrazenie obrázku z súboru index.php

Teraz, keď sme sa rozhodli pre postup činnosti, môžete začať kódovanie. Snažil som sa vyjadriť ku každému riadku kódu a o funkciách používaných v procese kódovania, potom budem hovoriť neskôr. Tu je kód vytvoriť naše modré námestie. Po písaní ho ušetríme pod názvom "basic_square.php".

// Nainštalujte zobrazenie chybových hlásení
ini_set ("Display_Errors", "1");
ERROR_REPORTING (E_ALL);


// určiť rozmery obrázkov
// 125px šírka, 125px výška
$ image \u003d imagecreate (125, 125);

// Vyberte farbu pozadia
$ modrá \u003d imagecolorolalcalocation ($ image, 0, 0, 255);

// Nastavte inú farbu - stačí sa uistiť, že keď sa zobrazí vzor, \u200b\u200bpozadie bude najprv farbu ()
// Poznámka - Námestie bude modré, nie červené.
$ red \u003d imagecoloroROOLOCT ($ image, 255, 0, 0);

// Uložte súbor vo formáte PNG a zobrazte ho.
imagepng ($ obrázok);

// Vyčistite použitú pamäť
imagestroy ($ obraz);
?>

Pozrime teraz všetky použité funkcie a každý krok vyššie uvedeného kódu, aby ste lepšie pochopili, čo v ňom robíme:

Ako som už vysvetlil, pridáme možnosť chybového hlásenia, aby ste ich mohli rýchlo opraviť
. Potom použijeme funkciu hlavičky () na nastavenie typu obsahu - png
. Obrázok uložíme a nainštalujte požadovanú šírku a výšku - podrobnejšie nájdete ImageCreate ().
. Potom použite funkciu imagecoloroROCLOCTACT na výber modrej farby pre pozadie nášho výkresu. Upozorňujeme, že vo finálnej verzii bude nainštalovaná farba, takže naše námestie sa ukáže, že je modrá, nie červená.
. Pre konečné ukladanie obrazu používame ImagePNG (). Ak si želáte uložiť obrázok v ľubovoľnom adresári, musíte zadať ďalšie parametre.
. A nakoniec, vyčistite pamäť pomocou funkcie imagestroy ()

Sme sa môžeme pozrieť na námestie otvorením súboru blue_square.php, a to bude ešte lepšie, ak na hlavnej stránke nastavíme odkaz na hlavnú stránku:

Ak sa všetko urobilo správne, uvidíte toto modré námestie:

Ahoj svet

Teraz, keď sme sa naučili, ako vytvoriť obrázky, skúste si urobiť obrázok s textom napísaným nášho zvoleného písma. Môžeme použiť akékoľvek písmo z adresára TrueType Font (.tff). V nasledujúcich príkladoch, budem používať, Advent 'písmo. Píšte napíšte "Ahoj svet" na tmavom sivý námestie. Pozor, pozrite sa na kód a potom podrobne rozoberte každý krok.

ini_set ("Display_Errors", "1");
ERROR_REPORTING (E_ALL);


Header ("Typ obsahu: Image / PNG");

// určiť veľkosť obrázka - 300x300 pixelov

// nainštalujte pozadie tmavo šedú

// Uveďte cestu k písme
$ Font_path \u003d "advent_light";

// Píšeme text
$ string \u003d "Ahoj svet!";

// Connect textu a obrázkov
ImageTTFTEXT ($ image, 50, 0, 10, 160, $ biela, $ font_path, $ string);

// Uložte obrázok
imagepng ($ obraz);

// Clean pamäť
imagestroy ($ obraz);
?>

Kód uložiť do súboru, hello_world.php ', otvoríme ju rovnakým spôsobom, ako to bolo vyššie uvedené. Čo je tu nové?

Nastavili sme veľkosť obrázka 300 pixelov a použil tmavé sivé pozadie
. Upozorňujeme, ako sme poukázali na cestu k písmeom pomocou názvu písma: Faktom je, že ďalej v kóde budeme musieť aplikovať text na obrázok. Nezabudnite tiež, že názov písma je napísaný bez rozšírenia. Avšak, to záleží na tom, aký verzií knižnice GD používa PHP: Ak názov písma nezačína, / ', bude potrebné rozšíriť TTF - to je, ak nechcete stáť pred menom nášho font, bude automaticky pridaná do TTF koncom.
. Potom sme sa napísať "Hello world!" a uložte text na ďalšie použitie
. Najdôležitejšou funkciou používanou v tomto kóde je obraz imagettftext (), vyžadujúca pokyny 8 parametrov: cesta k obrázku, veľkosť obrázka, uhol sklonu, osi X, os y, farba, písmo, text (v tomto poradí)

Uložte kód, otvorte ho akýmkoľvek spôsobom a zobrazí sa tento obrázok:

Otočte ho!

Všimli ste si, že funkcia Imagettftext pripojenie textu a obraz je parameter na polohu v uhle "? Takže môžeme otočiť náš text v ľubovoľnom uhle. Poďme prepísať kód a otočte riadok na námestí.

// Nainštalujte chybové hlásenia
ini_set ("Display_Errors", "1");
ERROR_REPORTING (E_ALL);

// Nainštalujte typ obsahu
Header ("Typ obsahu: Image / PNG");

// určiť veľkosť obrázka: 300x300 pixelov
$ image \u003d imagecreate (300, 300);

// určiť farbu pozadia - tmavo šedá
$ Dark_grey \u003d imagecolorolalcalocation ($ image, 102, 102, 102);
$ white \u003d imagecoloroROCT ($ image, 255, 255, 255);

// Uveďte cestu k písme
$ Font_path \u003d "advent_light";

// Píšeme text
$ string \u003d "Ahoj svet!";

// Pripojte text a obrázky
Imagettftext ($ image, 50, -45, 30, 70, $ biely, $ font_path, $ string);

// Uložte obrázok
imagepng ($ obrázok);

// Vyčistite pamäť
imagestroy ($ obraz);
?>

Upozorňujeme, že nastavujeme hodnotu -45 stupňov namiesto 0 stupňov (ako v predchádzajúcom príklade) - je to všetko, čo je potrebné, aby sa text mohol zmeniť. Pozri sa na obrázok.

Ako? Zaujímavé? Nie? Potom sa snažte urobiť niečo praktickejšie.

Aké je dnes číslo?

Nemôžeme nielen kresliť obrázky sami, ale aj pripravený! Malé kódovanie a my budeme mať kalendár, ktorý zobrazuje aktuálny dátum (mesiac, deň a rok). Hľadáme obrobok kalendára v Google, nájdeme obrázok vo formáte.svg - zmenil som svoju veľkosť a preložil som do formátu PNG. Pozrite sa na obrobok:

Teraz máme základ a môžeme ho spracovať pomocou funkcií GD a PHP. Upozorním, že nepredstieram, že som názov najväčšieho dizajnéra na svete - možno druhý obrobok a ďalšie písmo by vyzeralo lepšie na stránke. Takže dizajn je váš, ale teraz sa pozrime na kód:

// Nainštalujte chybové hlásenia
ini_set ("Display_Errors", "1");
ERROR_REPORTING (E_ALL);

// Nainštalujte typ obsahu

// Udržujte dátum
Zoznam ($ mesiac, $ deň, $ rok) \u003d explózovať ("/", dátum ("f / js / y");

// Stiahnite obrázok na pozadí
$ image \u003d imagecreateefrompng ("kalendár_blank.png");
$ image_width \u003d Imagex ($ obraz);

// určiť farbu pozadia a písmo
$ white \u003d imagecoloroROCT ($ image, 255, 255, 255);
$ black \u003d imagecolorolalracky ($ image, 0, 0, 0);
$ Font_path \u003d "advent_light";

// Uveďte polohu textu
$ Pos_month \u003d imagettfbbox (13, 0, $ font_path, $ mesiac);
$ Pos_day \u003d imagettfbbox (25, 0, $ font_path, $ deň);
$ Pos_year \u003d imagettfbbox (8, 0, $ font_path, $ rok);

// píšem mesiac
Imagettftext ($ image, 13, 0, ($ image_width - $ pos_month) / 2, 40, $ biele, $ font_path, $ mesiac);

// deň písať
Imagettftext ($ image, 25, 0, ($ image_width - $ pos_day) / 2, 80, $ black, $ font_path, $ deň);

// píšeme rok
Imagettftext ($ image, 8, 0, ($ image_width - $ pos_year) / 2, 100, $ black, $ font_path, $ rok);

// Uložte obrázok
imagejpeg ($ obraz, "", 100);

// Vyčistite pamäť
imagestroy ($ obraz);
?>

Čo tu robíme? Aký je funkcia zoznamu ()? Poďme na to:

Ako vždy sme nastavili typ obsahu, takže obraz sa zobrazí správne.
. V 10. riadku zobrazíte funkciu funkcie zoznamu. Obmedzíme formát dátumu pomocou funkcie Explode () a uložíme ho. Môžete teda zariadiť akékoľvek informácie. Teraz máme prístup k informáciám o aktuálnom mesiaci, deň a roku.
. V reťazcoch 22-24 používame funkciu imagettfbbox () na usporiadanie formátu dátumu. Funkcia zaisťuje zobrazenie dátumu v určenom poradí a pre prístup k pravýmu dolnému rohu píšeme $ pos_month. Toto je potrebné, aby text bol automaticky umiestnený správne, bez ohľadu na jeho veľkosť.
. Potom vytvoríme každý riadok zase a nastavíme veľkosť textu pozdĺž osi x.

Ak nastala žiadna katastrofa, mali by ste mať obrázok uvedený nižšie, s jediným rozdielom, že dátum bude ten, ktorý je nainštalovaný na vašom počítači - moja kresba, ako môžete uhádnuť, statické. Pre pomoc s skriptom vďaka stránke Catpin.

Mačky a obrazové filtre

Posledná vec, ktorú vás dnes naučí, tieto sú filtre obrázkov - veľmi zaujímavá vec, verte mi. Funkcia ImageFilter () má hotový obraz a zmení ho určitým spôsobom - napríklad sa premieta do režimu čiernobielu a biely. Pozrime sa na obrázok, s ktorým budeme pracovať vo svojom pôvodnom formulári.

Teraz, aby sa mačka čierna a biela pomocou funkcie filtrovania obrázkov.

// Nainštalujte chybové hlásenia
ini_set ("Display_Errors", "1");
ERROR_REPORTING (E_ALL);

// Skontrolujte, či je pôvodný obrázok nastavený
Ak (Isset ($ _ get ["zdroj"])) (
// Vykonajte základné spracovanie výkresu
$ image \u003d filter_var ($ _ dostať ["zdroj"], filter_sanitize_string);

// Nahrajte obrázok
$ image \u003d imagecreateefromjpeg ($ image);

// Preložiť ho do čiernobielu
Imagefilter ($ obrázok, IMG_FILTER_GRAYSCALE);

// Nainštalujte typ obsahu
Header ("Typ obsahu: Image / JPEG");

// Udržujte obrázok ako 90%
imagejpeg ($ obraz, "", 90);

// Vyčistite pamäť
imagestroy ($ obraz);
}
?>

Vyššie uvedený skript je dostatočne flexibilný, takže môžete ľahko urobiť ľubovoľný kreslenie čiernej a bielej - takto:

Dali sme do "zdrojového" akéhokoľvek obrázku a čoskoro sa stane čiernou a bielym. Tí, ktorí plánujú používať túto funkciu na verejne dostupných serveroch, budú vyžadovať dodatočné bezpečnostné opatrenia. Hoci vo vyššie uvedenom skripte je to typ typu. JPEG, môžete použiť funkciu na spracovanie všetkých grafických súborov. Teraz naša mačka vyzerá takto:

Ostatné filtre:

Na konci lekcie vám predstavím niektoré ďalšie grafické filtre a výsledky ich používania.

Filter jasu

Pre jas obrazu zodpovedá treťom parametri:


// Tretí parameter nastaví úroveň jasu obrázka.
Imagefilter ($ obraz, IMG_FILTER_BRIGHTNESS, 40);
imagejpeg ($ obraz, "", 90);
imagestroy ($ obraz);
?>

Gaussovské rozostrenie

Blur cez Gauss, žiadne ďalšie parametre

Header ("Typ obsahu: Image / JPEG");

$ image \u003d imagecreateefromjpeg ("cat.jpg");
Imagefilter ($ image, IMG_FILTER_GAUSSION_BLUR);
imagejpeg ($ obraz, "", 90);
imagestroy ($ obraz);
?>

Kontrast

Tretí parameter určuje kontrast

Header ("Typ obsahu: Image / JPEG");
$ image \u003d imagecreateefromjpeg ("cat.jpg");
Imagefilter ($ obrázok, IMG_FILTER_CONTRAST, -15);
imagejpeg ($ obraz, "", 90);
imagestroy ($ obraz);
?>

Odstránenie priemernej hodnoty (efekt vzorov)

Žiadne ďalšie parametre.

Header ("Typ obsahu: Image / JPEG");
$ image \u003d imagecreateefromjpeg ("cat.jpg");
Imagefilter ($ obrázok, IMG_FILTER_MEAN_REMOVAL);
imagejpeg ($ obraz, "", 90);
imagestroy ($ obraz);
?>

Vyváženie farieb

Nastaví saturáciu červenej, zelenej, modrej, ako aj alfa kanálu (voliteľné) v nasledujúcom poradí

Header ("Typ obsahu: Image / JPEG");
$ image \u003d imagecreateefromjpeg ("cat.jpg");
// alfa kanál parameter vynechaný nižšie, ako je voliteľný.
Imagefilter ($ obrázok, IMG_FILTER_COLORIZE, 50, 0, 0);
imagejpeg ($ obraz, "", 90);
imagestroy ($ obraz);
?>

Na nové stretnutia ...

Dúfam, že máte viac alebo menej riešené knižnicou GD v PHP. V druhej časti sa pozrieme na niektoré pokročilé techniky a, samozrejme, zistiť ešte zaujímavejšie. Použite knižnicu GD a vaše kreatívne schopnosti a uistite sa, že mi povedzte, čo máte!

Vážení účastníci projektu pohybujúce sa! Dnes čakáte na ďalšiu zaujímavú tému. Všetci sme zvyknutí, povedzme, nahrajte nové avatary o sociálnych sieťach. Ale ako sa zmenšujú na požadovanú veľkosť? Čo sa stane na serveri? Tieto a mnoho ďalších otázok na vás čakajú pod mačkou.

Áno, ak niekto nie je vedomý, potom v Internet Terminology "Cat" (z anglického rezania), toto je miesto, ktoré zdieľa správy na krátku (v celkovom zozname) a úplnú prezentáciu.

Mnohí viem, že som vývoj vlastného systému riadenia webových stránok s názvom Kogir (COGEAR, http://cogear.ru). Príbeh je zložitý a dlhý, ale tvrdohlavo choďte na cieľ.

Pozrime sa na základné aspekty práce s obrázkami.

PHP má vstavanú knižnicu GD. Tu je jeho dokumentácia:

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

Na tejto stránke nájdete obrovské množstvo rôznych funkcií. Ale nebojte sa. Máme záujem o dosť betónu.

Ako vidíte, pracuje s obrázkami doteraz sa deje vo forme postupov (funkcií), takže objektovo orientovaný shell musí písať.

Najjednoduchší príklad práce s obrázkom:

Snažíme sa na miestnom stroji.

Vytvorte súbor. image.php.(Mám lokálnu doménu pre experimenty test.Local).

Vložíme do koreňového priečinka Test.Local: 1.jpg Obrázok:

Zavolajte v prehliadači http: //test.local/image.php (vo vašom prípade, ďalšia adresa).

Nájdeme v priečinku 2JPG:

Proporcie nie sú zachované, ako vidíte. Pretože sme ich neprevrátili.

Opravíme náš skript tak, aby sa prepočítanie uskutočnilo:

$ RATIO_ORIG) ($ šírka \u003d $ Height * $ RATIO_ORIG;) inak ($ \u200b\u200bHeight \u003d $ šírka / $ Radio_orig;) // Presunúť obrázok zo súboru na webe so zmenou rozsahu obrazu imagecopyresampled ($ image_p, $ Obrázok, 0, 0, 0, 0, $ Šírka, $ Výška, $ Width_orig, $ Height_orig); // zobraziť imagejpeg ($ image_p, "2.jpg", 100);

Pozrime sa na výsledok:

Keďže sme boli prepočítané na výšku, časť konečného obrazu sa ukázala byť čierna (pôvodná farba vytvorených plátnov).

Čo ešte môžete urobiť s obrázkom? Strih to, otočte, položte jednu vec na druhú, kresliť na ňom.

Som si istý, že sa zaujímate o moju triedu pre prácu s obrázkami. Nepracuje mimo systému, pretože je to vodič pre zariadenie (modul) "obrázky".

Ale nájdete veľa zaujímavých vecí pre seba:

* @ Copyrght Copyright (c) 2012, Belyaev Dmitrij * @License http://cogear.ru/license.html * @link http://cogear.ru * / trieda image_driver_gd Extensions image_driver_Abstract (/ ** * Vytvorí obrázok * / Verejná funkcia Vytvoriť () (Case ImageTEPE_JPEG: Case ImageTEPE_JPEG2000: CASE ImageTYPE_JPEG2000: $ This-\u003e Source \u003d ImageCreateSefromjpeg ($ This-\u003e Info-\u003e File); Break; \u003e Info-\u003e Súbor); ImagecolorTransparent ($ This-\u003e Source, ImagecolOralOCLOCT ($ This-\u003e Zdroj, 0, 0, 0)); ImagealphBalding ($ This-\u003e Source, False); ImageSAVEALPHA ($ This-\u003e Source, TRUE); Break; Case ImagePe_GIF: $ This-\u003e Source \u003d ImageCREATEFROMGIF ($ This-\u003e Info-\u003e File); ImagecolorTransparent ($ This-\u003e Source, ImagecolOralOLOCT ($ This-\u003e Source, 0, 0, 0)); ImagealPhobunding ($ This-\u003e Source, False), ImagesasAvealpha ($ This-\u003e Source, TRUE); Break; Case ImageType_ico: $ This-\u003e Source \u003d ImagecReefromwbMP ($ This-\u003e Info-\u003e File); Break;)) ** * Zničí obrázok * / Verejná funkcia zničiť () (imagestroy ($ this-\u003e zdroj); Is_resource ($ this-\u003e cieľ) && imagestroy ($ This-\u003e Cieľ); ) / ** * vytvára cieľový obrázok * * @param zmiešaný $ šírka * @param zmiešané $ výšky * / verejná funkcia CreateTarget ($ Šírka, $ výšky) ($ This-\u003e Cieľ \u003d ImageCreaTusolor ($ Šírka, $ výška); Ak ($ this-\u003e info-\u003e typ \u003d\u003d imagepep_png alebo imagepe_gif \u003d\u003d $ This-\u003e info-\u003e typ) (imagecolortransparent ($ This-\u003e Cieľ, ImagecolOrOROOLOCT ($ Tento-\u003e Cieľ, 0, 0, 0)) ); ($ This-\u003e info-\u003e typ) ImagealphBalding ($ This-\u003e Cieľ, False); ImagesAveLPHA ($ THISTION TARGET, TRUE);) Return $ This-\u003e Cieľ;) / ** * Zmení stupnicu Obrázok * * @param Int | String $ Šírka šírka * @ Param Int | String $ výšky Výška * @param String $ FIT CHOTNIKA Šírka Štiepkovania Typ, Výška, Fit * @Param Int | String $ Scuring Aké obrázky škálovanie akúkoľvek, hore, Down * @return Object Image * / Verejná funkcia Zmena veľkosti ($ Šírka, $ Výška, $ FIT \u003d "Šírka", $ SCALE \u003d "Any") ($ Source_Width \u003d $ This-\u003e Smartsize (Šírka $, "Šírka"); $ Source_Height \u003d $ This-\u003e Smartsize ($ výška, "výška"); // Skontrolujte typ škálovania ($ fit) (// ak si vyberiete) Klinec na šírku, potom dávame výšku na požadované proporcie prípadu "šírka": $ šírka \u003d $ Source_width; $ Height \u003d Round (($ Source_Width * $ This-\u003e Info-\u003e Výška) / $ This-\u003e Info-\u003e Šírka); Prestávka; // Ak je horná horná držiaka, potom dať šírku na požadované proporcie prípadu "výška": $ šírka \u003d kolo (((((((($ This-\u003e info-\u003e šírka * $ Source_Height) / $ This-\u003e Info-\u003e Výška ); $ Výška \u003d $ source_height; Prestávka; Prípad "plodina": ak ($ \u200b\u200bthis-\u003e info-\u003e šírka\u003e $ this-\u003e info-\u003e výška) ($ šírka \u003d kolo (((($ this-\u003e info-\u003e šírka * $ Source_Height) / $ This-\u003e info -\u003e výška); $ výška \u003d $ source_height;) inak ($ \u200b\u200bšírka \u003d $ source_width; $ výška \u003d kolo ((((($ -\u003e info-\u003e výška * $ Source_width) / $ Táto-\u003e info-\u003e šírka); ) Prestávka; // predvolené Predvolené jednoducho roztiahneme predvolené: CASE "FIT" :) // Skontrolujte, či bude spínač vyrobený ($ SCALE) (// Ak je obrázok väčší ako zadané veľkosti, nič sa nestane "hore": ak ( $ šírka< $this->info-\u003e Šírka && $ výšky< $this-> Info-\u003e výška) (návrat $ tohto;) prestávka; // Ak je obrázok menší ako zadané veľkosti, nič sa nestane "nadol" s ním: ak ($ \u200b\u200bšírka\u003e $ this-\u003e info-\u003e šírka && $ výšky\u003e $ this-\u003e info-\u003e výška) (návrat $ toto;) prestávka; Prípad "Any": Predvolené: // Nerobte nič. Filonym) $ This-\u003e Cieľ \u003d $ This-\u003e CreateTarget ($ šírka, $ výška); Ak (obrázok\u003e Cieľ, $ This-\u003e Zdroj, 0, 0, 0, 0, $ Šírka, $ Výška, $ This-\u003e Info-\u003e Šírka, $ This-\u003e Info-\u003e Výška)) ($ This-\u003e Zdroj \u003d $ This-\u003e Cieľ; $ This-\u003e Info-\u003e Šírka \u003d $ Šírka, $ This-\u003e Info-\u003e Výška \u003d $ Výška; ak ("CROP" \u003d\u003d $ FIT) (Return $ This -\u003e Cop "Centrum", "Center", $ Source_width, $ Source_Height);) ) / ** * vyrába orezávanie obrazu * * @param zmiešaný $ x súradnicové rezanie x * @param zmiešaný $ y koordinácia orezanie y * @param zmiešané $ šírka šírka * @PARAM MIEŠANÉ $ ZMENUJÚCEJ výšky výška * @return Object Image * / Verejná funkcia plodina ($ x, $ y, $ šírka, $ výška) ($ x \u003d $ this-\u003e smartsize ($ x, "šírka") - $ šírka / 2; $ y \u003d $ this-\u003e Smartsize ($ Y, "Výška") - $ výšky / 2; $ šírka \u003d $ This-\u003e Smartsize ($ Šírka, "Šírka"); $ Height \u003d $ This-\u003e Smartsize ($ Height, "Výška"); $ This-\u003e TARGET \u003d $ This-\u003e CreateTarget ($ Šírka, $ Výška); If-\u003e Target, $ This-\u003e Zdroj, 0, $ X, $ Y, $ Šírka, $ Výška, $ Šírka, $ Výška)) ($ Toto -\u003e Source \u003d $ This-\u003e Cieľ; $ This-\u003e Info-\u003e Šírka \u003d $ Šírka, $ This-\u003e Info-\u003e Výška \u003d $ Height;) Return $ Thiss;) / ** * Maging Images * / Verejná funkcia Zlúčiť (image $ image, $ x, $ y, $ percent \u003d 100) ($ x \u003d $ this-\u003e smartsize ($ x, "šírka"); $ y \u003d $ this-\u003e Smartsize ($ y, "výška" ); If- (imagecopymerge ($ this-\u003e zdroj, $ image-\u003e getource (), $ x, $ y, 0, 0 , $ Image-\u003e objekt () -\u003e image-\u003e šírka, $ image-\u003e objekt () -\u003e image-\u003e výška, $ percent) () návrat $ tohto; ) / ** * Uloží obrázok * / Verejný funkciu Uložiť ($ File \u003d NULL, $ Možnosti \u003d Array ()) ($ Tento-\u003e Cieľ alebo $ This-\u003e TARGET \u003d $ Tento-\u003e Source; ak (STRPOS ($ ($) Súbor, ".") Alebo $ File \u003d $ This-\u003e Info-\u003e File) ($ EXT \u003d PATHFO ($ FILE, PATHFO_EXTENCE); $ EXT \u003d STRTOLOWER ($ EXT) ELSE ($ EXT \u003d STRTOLOWER ($ FILE ); $ File \u003d null;) prepínač ($ EXT) (CASE "JPG": CASE "JPEG": $ Možnosti alebo $ Možnosti \u003d 90, ImageJPEG ($ This-\u003e Cieľ, $ File, $ Možnosti); Break; "GIF": imagecolortrransparent ($ This-\u003e Cieľ, ImagecolOralOcaTealpha ($ This-\u003e Cieľ, 0, 0, 127); ImagealphaBLANDY ($ THISTION-\u003e Cieľ, False); ImageVealpha ($ This-\u003e Cieľ, TRUE); ImageGIF ($ This-\u003e Cieľ, $ File); Break; Case "PNG": ImagealphaBLINKA ($ Tento-\u003e Cieľ, False); ImagesasAvealpha ($ This-\u003e Cieľ, TRUE); IF (IS_NUMERIC ($ MOŽNOSTI)); $ Quality \u003d $ Možnosti; $ Filtre \u003d PNG_NO_FILTER;) inak ($ \u200b\u200bQuality \u003d Isset ($ Možnosti ["Quality])? $ Možnosti ["Kvalita"]: 9; $ Filtre \u003d Isset ($ Možnosti ["Filtre"])? $ Možnosti ["Filtre"]: PNG_NO_FILTER; ) imagepng ($ this-\u003e cieľ, $ súbor, kvalita $, $ filtre); Prestávka; ) $ this-\u003e zničiť (); ) / ** * Zobrazí obraz * / Verejnosti Function ($ formát, $ Možnosti) ($ This-\u003e Uložiť ($ Format, $ Možnosti);)

Ako to funguje v systéme? Pre čo je toľký kód?

Pozri:

$ image \u003d nový obrázok ("1.jpg"); $ Image-\u003e zmeniť veľkosť (200 200, "šírka") -\u003e plodiny (200 200) -\u003e Uložiť ("2, JPG);

Rozumieš? Funguje so všetkými potrebnými formátmi. Funkčné, ak je to potrebné, možno rozšíriť.

Domáca úloha pre vás urobíte, čo je uvedené vyššie (do mojej triedy) na miestnom stroji. Ak si želáte a čas na experimentáciu s parametrami.