internetul Windows. Android

Funcțiile PHP care lucrează cu imagini. Ghid complet de încărcare a imaginii la PHP

Articolul descrie modul de lucru cu extensia PHP-GDLIB, care vă permite să formați dinamic imagini pe paginile web.
Autor - Nykoh (niko)
Traducere din Franceză - Anton Fedorchenko.
Adresa originală - http://www.phpdebutant.org/article111.php

Pentru a înțelege acest articol, este necesar să aveți o idee despre elementele elementare ale PHP, precum și să lucrați cu imagini.

Translator Notă

În exemple, toate numele de identificare sunt date în limba franceză. Pentru a facilita înțelegerea cititorului despre cod, oferim traducerea lor:
blanc - alb.
bleu - albastru
couleur - Culoare
coaleur_fond - culoarea fundalului
fichier - Fișier.
gris - Gri
hauteur - Înălțime
hauteurimage - Înălțimea imaginii
mare - lățime
grosurimage - Lățimea imaginii
mois - luna
noir - negru
poliția - setul cu cască font
rouge - Red.
tableau - Array.
vert - Green.

Translator Notă

În mod implicit, în PHP 5, toate extensiile sunt dezactivate, inclusiv o extensie pentru a forma imagini dinamice - GD. Pentru instrucțiuni pentru stabilirea acestei expansiuni, trebuie să contactați un articol.

Poartă: Pentru a preda utilizarea diferitelor funcții ale bibliotecii GD, concepute pentru crearea dinamică a imaginilor.

Biblioteca GD este un set de caracteristici pentru a lucra cu imagini. Datorită ei, este posibil ca nu numai să creați dinamic propriile imagini, ci și să primiți diferite informații despre ele, să schimbați dimensiunea etc.

Atenţie: Înainte de a începe să lucrați, trebuie să știți ceva. Faptul este că există mai multe versiuni diferite ale acestei extensii PHP, iar furnizorii de servicii de găzduire pot dezactiva anumite funcții și chiar întreaga bibliotecă GD. Cu ce \u200b\u200bscop? Se știe că procesarea imaginii este o sarcină mare pe server.

Deci, trebuie să cunoașteți versiunea Bibliotecii GD instalată pe găzduirea pe care o utilizați, precum și să obțineți informații despre funcțiile permise. Primul lucru pe care trebuie făcut este să utilizați funcția phpinfo. Efectuați următorul script:

phpinfo.php.

phpinfo ();
?>

Dacă aveți un tabel similar cu acest lucru - totul este bine (mai ales dacă versiunea bibliotecii este mai nouă decât 2.0)

Gd.

Suport GD

Versiunea GD.

Suport Freetype

FreeType Linkage.

JPG suport

PNG suport

WBMP Support

După cum sa menționat mai sus, unele posibilități pot fi dezactivate. În acest caz, ar trebui să încercați pur și simplu să utilizați o singură funcție. Dacă acest lucru duce la o eroare: Eroare fatala: Apelați la funcția nedefinită, nu ar trebui să aveți nicio îndoială că această funcție este dezactivată.

I) crearea de panza

Mai întâi trebuie să creați panza goală. Explicați imediat că în acest articol vom spune exclusiv imagini în format PNG sau JPG, formatul GIF va rămâne fără atenția noastră. Faptul este că acest format a încetat să mai fie susținut de Biblioteca GD, începând cu versiunea 1.3, deși suportul limitat pentru GIF a apărut din nou în versiunea 2. Concluzie: format PNG este o alternativă profitabilă la GIF

Notă importantă

În toate cursurile de formare ale site-ului www.phpdebutant.org, scripturile vizează crearea dinamică a paginilor HTML. De data aceasta, folosind biblioteca GD, creăm imagini, deci în acest caz trebuie să uitați în timpul proiectării ecoului și tipăririi. În mod implicit, scriptul PHP generează o pagină HTML care nu necesită clarificări sub formă de trimitere a unui Miez special de HTTP. Dar dacă creăm o imagine, la începutul scenariului, trebuie să specificați tipul său, trimiterea antetului corespunzător, de exemplu pentru PNG: antet ("Tip de conținut: imagine / PNG");

Acțiunile viitoare sunt reamintiți ceva cu un editor grafic. Creați o imagine nouă, specificând dimensiunile, selectați culoarea de fundal și salvați-o în formatul dorit. Această secvență de acțiuni ilustrează următorul script:

imagevide.php.

Antet ("tip de conținut: imagine / png");
$ im \u003d Imagecreate (200, 100)
sau mori ();
$ coaleur_fond \u003d imagecoloraloc ($ im, 255, 0, 0);
Imagepng ($ im);
?>

Acest mic script generează un dreptunghi roșu (foarte modest, dar bun început). Descrierea mecanismului:

  • Funcția imagineCreate returnează descriptorul $ IM. Descriptorul $ IM trebuie transmis tuturor funcțiilor de desenare a imaginii. Parametrii funcției de imagini corespund lungimii și lățimii imaginii create (200x100).
  • Sarcina operatorului sau matrița - interceptarea unor erori posibile.
  • Crearea culorii poate fi creată utilizând funcția de imagineColoraloclococație. Este folosit pentru
    • crearea de culoare și conservarea acestuia într-o variabilă pentru utilizare ulterioară
    • adăugați culoarea la paleta de imagine $ IM

Parametrii săi corespund componentelor roșii, verzi și albastre ale culorii și reprezintă numere întregi de la 0 la 255. În acest exemplu, am creat o culoare roșie.

Notă importantă

această culoare corespunde culorii de fundal, deoarece este adăugată pentru prima dată la paleta de imagini.

Apelarea unui script imagineVIDE.php (gol_PHP) va crea o imagine în format PNG. Pentru ao folosi pe site-ul web, trebuie să acționați, precum și în cazul imaginilor "clasice".

Destul de usor! Puteți chiar să transmiteți parametrii scriptului care vor genera o imagine (de exemplu, culoarea de fundal).

Deci, aveți deja cunoștințe de bază pentru a începe desenul. Dacă doriți să le aprofundați - aici sunt câteva caracteristici interesante

  • Puteți înlocui imagineaCcreate pe ImageCreatetusolor pentru a crea o imagine pe 32 de biți (perfectă pentru fotografii)
  • Puteți înlocui funcția Imagepng ImageJPEG pentru a crea o imagine în format JPEG (nu uitați să modificați parametrul funcției antetului de pe antet ("Tip de conținut: imagine / JPEG").
  • Mai jos vom vedea că imaginea generată poate fi salvată

Ii) funcții de desen al imaginii

Mai întâi trebuie să știți că orice desen este asociat cu conceptul de coordonate, deci în acest mic paragraf al articolului vom oferi câteva idei despre această problemă.
Colțul din stânga sus al imaginii are coordonate (x \u003d 0, y \u003d 0) și dreapta jos (x \u003d lățimea imaginii, y \u003d înălțimea imaginii).

De exemplu, pentru o imagine cu o rezoluție de 100 la 200 de pixeli, coordonatele vor fi:

Diferitele caracteristici ale desenului de imagine sunt luate ca parametrii coordonatei sale. Să le transmită în ordinea dorită. De exemplu, pentru a desena un dreptunghi, este necesar să se transfere coordonatele a două puncte ale funcției corespunzătoare (ImagereCtangle). Coordonatele primului punct corespund colțului din stânga sus al imaginii, coordonatele celui de-al doilea punct corespund colțului din dreapta jos. Nu confunda argumentele deoarece unele funcții pot emite rezultate eronate.


Iată o listă de funcții necesare pentru a desena diferite forme, precum și pentru plasarea textului pe imaginea creată.
Pentru fiecare funcție veți găsi o scurtă descriere a sintaxei și a destinației.
Nu intenționăm să aducem un exemplu de utilizare pentru fiecare funcție, aici veți găsi doar o scurtă descriere. Tabelul specifică, de asemenea, versiunea bibliotecii, începând cu care este susținută una sau altă funcție. Exemple de utilizare a unor funcții pot fi găsite în secțiunea manualului oficial dedicat

Exemplu de sintaxă

Descriere

Creează o panza goală (256 de culori) $ im $ înălțime și lățimea $ Hauteur. (Formatul PNG este preferat)

Această caracteristică este similară cu imagineaCreata, dar adâncimea culorii imaginii nu este limitată la 256 de culori. (Formatul JPEG este preferat)

Se plasează în variabila Componentele de culoare $ COL ale căruia sunt $ Rouge, $ vert, $ bleu (intervalul 0 .. 255). Pentru detalii, consultați în prima parte.

Creează o elipsă pe o imagine de $ IM cu un centru la un punct ($ x, $ y), $ l lățime, $ h înălțime și $ color color.

Imagilipse identice, dar elipsa este plină de $ col

Creează un dreptunghi color $ Col pe o imagine, situat între un punct cu coordonate ($ x, $ y) și unghiul drept inferior al culorii $ colol

Trage o culoare de linie $ COL, care trece între două puncte cu coordonate ($ x1, $ y1) și ($ x2, $ y2)

Imaginea de $ im vopsește un poligon al cărui coordonate sunt listate în matricea de $ Puncte ($ x x0, $ puncte \u003d $ y0, $ puncte \u003d $ x1, $ puncte \u003d $ y1, etc.), $ num_points - Cantitate Puncte într-o matrice, $ color.

Imagine identică, dar elipsa este plină de $ col

Imaginea $ IM atrage un dreptunghi, colțul din stânga sus al cărui coordonate ($ x0, $ y0), iar partea inferioară inferioară ($ x1, $ y1). $ col- culoare dreptunghi

Identic imagineRECtangle, dar elipsa este plină de $ col

Aceste funcții vă permit să schimbați stilul liniilor statice. Pentru mai multe informații, consultați documentația oficială, acordați mai ales atenție utilizării funcției ImageSetStyle, care este, de asemenea, indicativă pentru funcția ImageSetBrush.

În imagine $ im vopsește un punct cu coordonatele ($ x, $ y) și $ colol

Modifică grosimea liniilor create de diverse funcții.

Într-o imagine, $ I creează o linie de $ Haine cu coordonate (colțul de sus) ($ x, $ y) $ colul $ Culori poliție - dimensiune (set cu cască) font (de la 0 la 5)

Imagini identice, dar șirul este afișat vertical

III) Exemplu este primul: statistici vizite la fața locului sub forma unui grafic

Pentru a aplica cunoștințele dobândite în practică - creați un exemplu simplu de script. Adesea este necesar să se prezinte statisticile vizitelor la fața locului sub forma unei histograme

Presupunem că ați dezvoltat deja partea din script care este responsabilă pentru contabilizarea vizitatorilor (posibil folosind tabelul MySQL). Nu vom vorbi despre implementarea ei aici, acesta nu este scopul acestui articol. Să presupunem că statisticile de vizitare pentru fiecare lună sunt plasate într-o serie de vizite de $. În acest articol, umplem matricea "manual", dar puteți să o faceți singur folosind datele tabelului MySQL.

a) Statistici privind vizitarea: Crearea unei imagini și a unei culori

Să începem cu crearea unei matrice care conține statisticile vizitelor site-ului timp de 12 luni (12 elemente). Apoi vom genera o imagine cu o rezoluție de 400x300 și vom crea trei culori, dintre care unul (alb) va fi culoarea fundalului.

vizite.php.

$ Vizite \u003d matrice (138, 254, 381, 652, 896, 720, 140, 556, 663, 331, 407, 768);

Antet ("tip de conținut: imagine / png");
$ mareurimage \u003d 400;
$ hauteurimage \u003d 300;
$ im \u003d imagecreate ($ mareurimage, $ hauteurimage)
SAU MORI ( "Eroare la crearea unei imagini");

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

b) Desenați axa graficului

Poziționați axa orizontală a timpului (linia neagră simplă) în partea inferioară a imaginii, lăsând câmpul în 10 pixeli.

În partea de jos, semnăm numărul fiecăruia dintre cele 12 luni folosind ciclul de ciclu și funcția de imagistică. Numerele sunt situate la fiecare 30 de pixeli, începând din partea stângă a imaginii.

În cele din urmă, petrecem linia verticală, axa statisticilor ordonate ale vizitelor.

// țineți o linie orizontală, axa abscisa (timpul)
Imageline ($ im, 10, $ hauteurimage-10, $ mareurimage-10, $ hauteurimage-10, $ noir);
// retrage numărul de secvență din fiecare din 12 luni
pentru ($ mois \u003d 1; $ mois imagistica ($ im, 0, $ mois * 30, $ hauteurimage-10, $ mois, $ noir);
}

// realizăm o linie verticală la axa ordonată (numărul de vizite)
Imageline ($ IM, 10, 10, 10, $ Hauteuriage-10, $ noir);
?>

c) trage bastoane

Acum mergeți la o sarcină mai complexă - bastoane de desenare.

În primul rând, trebuie să aflăm numărul maxim de vizitatori pe care îl vom prezenta în program. Aici am ales o valoare aleatorie - 1000, dar de fapt, probabil că va trebui să o calculați, efectuând o cerere de valoare maximă a coloanei tabelului MySQL. Vom face mai ușor ...

Pentru fiecare lună, este necesar să se calculeze înălțimea dreptunghiului creat. Pentru a face acest lucru, este necesar să rezolvați ecuația, știind că înălțimea dreptunghiului (bastoane) pentru numărul maxim de vizite va fi egală cu înălțimea întregii imagini. Pe baza numărului de vizite pentru o anumită lună, obținem înălțimea dorită

Rămâne doar pentru a desena fiecare dreptunghi, începând cu coordonatele colțului din stânga sus și terminând cu partea dreaptă jos.

Adăugați numărul de vizite timp de o lună peste fiecare dreptunghi pentru a îmbunătăți histograma.

// vizite maxime
$ vizitemax \u003d 1000;

// trageți un baston
pentru ($ mois \u003d 1; $ mois<= 12 ; $mois ++) {
$ Hauteurimagereftand \u003d rotund (($ vizitat [$ mois - 1] * $ hauteurimage) / $ viziteSmax);
ImageFILEDRECTANDAN ($ IM, $ mois * 30 - 7, $ Hauteurimage - $ HauteurimageRectand, $ mois * 30 + 7, $ Hauteurimage - 10, $ bleu);
Imagini ($ im, 0, $ mois * 30 - 7, $ hauteurimage - $ HauteurimageRectand - 10, $ Vizite [$ mois - 1], $ noir);
}

// asta e tot
Imagepng ($ im);
?>

d) și aici este rezultatul!

Rezultatul, bineînțeles, nu sună excelent, dar ar trebui să se țină cont de faptul că am reușit să facem ceva mai mult sau mai puțin prezentabil prin scrierea doar 20 de linii de un cod simplu, care în sine nu este rău.

Histogramă de participare timp de 12 luni.


Iv) alte caracteristici utile

Aici este un alt set de funcții utile concepute pentru a gestiona paleta de culori, precum și pentru obținerea unor informații de imagine diferite.

Descriere

"Această caracteristică utilizează numele fișierului $ Fichier ca parametru și returnează o matrice care conține 4 elemente: (1) $ Tableau Lățimea imaginii (Px), (2) $ Tableau Înălțimea imaginii (Px), (3) $ Tableau Tip imagine (cm. Documentație), (4) $ Tableau Returnează un șir care poate fi introdus în eticheta IMG (Width \u003d "1024" "Înălțime \u003d" 768 ")"

O zonă de imagine de $ IM, culoarea $ COL devine transparentă. Pentru a economisi transparența, utilizați format PNG

Copiați zona de imagine dreptunghiulară $ src_im pe imagine $ dst_im. Zona de copiere este limitată la coordonatele punctului unghiului stâng sus ($ src_x, $ src_y), $ src_l lățime și înălțime de $ src_h. Zona copiată apare în imaginea destinatarului la punctul cu coordonatele. ($ Dst_x, $ dst_y)

Imagine identică, în plus, funcția îndeplinește o tranziție treptată a tonurilor intensității intensității $, care necesită valori de la 1 la 100.

Efectuează același efect ca și Imagini, și face, de asemenea, o modificare a dimensiunii imaginii. Consultați următorul exemplu

Imagini identice, dar rezultatul scalării este mai puțin hotărârea, dar funcția funcționează mai repede.

Returnează identificatorul resurselor, $ IM, indicând imaginea care se află în fișierul format JPEG $ Fichier.

Returnează identificatorul de resurse, $ IM, indicând o imagine care se află în format PNG $ Fichier PNG.

Returnează lățimea imaginii $ im

Returnează înălțimea $M-ului

V) Exemplu al doilea: generația miniaturală (redusă imagini de copiere)

Acest exemplu este destinat să creeze o copie redusă a unei imagini existente. Este posibil să trebuiască să implementați această caracteristică atunci când scrieți o galerie foto pe PNP, în care fotografiile sunt prezentate sub formă de miniatură, iar vizitatorul poate face clic pe ele cu mouse-ul pentru a mări. În acest exemplu, vom genera o miniatură echipată cu un cadru și câteva explicații (mărimea și numele imaginii)

a) Început

Spre deosebire de primul exemplu, acest script va înregistra o imagine într-un fișier și nu va genera pe zbor. Prin urmare, necesitatea trimiterii unui antet HTTP special utilizând funcția Header () dispare. Astfel, scriptul devine "clasic" și poate genera HTML.

Să începem cu crearea unei panza goale cu o dimensiune de 200x150, apoi luați în considerare imaginea existentă (din fișier) utilizând funcția ImageCreateFromJpeg. Apoi, putem avea nevoie și de dimensiunea imaginii sursei, pentru că vom folosi imaginile și imaginile.

miniatura.php.

$ Fichierce \u003d "photo3.jpg";

$ MareResting \u003d 200;
$ hautestestină \u003d 150;
$ im \u003d imagecreaceecolor ($ mareestestinare, $ hautestestination)
SAU MORI ( "Eroare la crearea unei imagini");

$ Sursa \u003d imageCreatefromjpeg ($ fichierce);

$ mareursurce \u003d imaginix ($ sursă);
$ hauteursource \u003d imagini (Sursa $);
?>

b) Cadru.

După crearea mai multor culori, trageți cadrul. Pentru a simplifica sarcina, vom folosi diferite nuanțe de gri.

Există o modalitate simplă de a crea un cadru similar care se află în desenul mai multor dreptunghiuri multi-colorate încorporate unul în altul. Începem de la cel mai mare dreptunghi al culorii întunecate (dimensiunea sa coincide cu dimensiunea imaginii). Apoi impunem un alt dreptunghi mai mic în dimensiune, culoarea căreia va fi mai ușoară etc.

Grosimea cadrului creat de noi este de 8 pixeli.

$ blanc \u003d imagecoloraloc ($ im, 255, 255, 255);
$ Gris [0] \u003d Imagecoloraloc ($ im, 90, 90, 90);
$ Gris [1] \u003d imagecoloraloc ($ im, 110, 110, 110);
$ Gris [2] \u003d Imagecoloraloc ($ im, 130, 130, 130);
$ Gris [3] \u003d Imagecoloraloc ($ im, 150, 150, 150);
$ Gris [4] \u003d Imagecoloraloc ($ im, 170, 170, 170);
$ Gris [5] \u003d imagecoloraloc ($ im, 190, 190, 190);
$ Gris [6] \u003d Imagecoloraloc ($ im, 210, 210, 210);
$ Gris [7] \u003d imagecoloraloc ($ im, 230, 230, 230);

Pentru ($ i \u003d 0; $ i<= 7 ; $i ++) {
ImaginiFILEDRECTENDAND ($ IM, $ I, $ I, $ LIGRUSTINESS - $ I, $ Hautestestination - $ I, $ gris [$ i]);
}
?>

c) crearea de miniaturi

Pentru crearea de miniaturi, este utilizată caracteristica ImaginiCopySeampled. Copiază o imagine la alta, poate schimba dimensiunea zonei copiate. Această funcție ia mai mulți parametri a căror valoare este evidentă. Le lizăm în ordine:

  • ($ im) destinatarul imaginii
  • ($ Sursă) sursă de imagine
  • Coordonarea imaginii imaginii destinatarului la care este suprapusă imaginea.
  • Coordonează Y.
  • Coordonate X (0 dacă vrem să copiem întreaga imagine)
  • Coordonate (y)
  • Lățimea copiei, care este introdusă în imaginea sursă ($ mare curs - (2 * 8) lățimea imaginii destinatarului minus lățimea cadrului din dreapta și stânga).
  • Înălțimea copierii (facem aceleași operații ca și cu o lățime)
  • Lățimea zonei de imagine a sursei de copie
  • , $ hauteursource);
    Imaginirea ($ im, 0, 12, $ Hauteurdestination - 18, "$ Fichierce - ($ mareurursource x $ hauteursource)", $ blanc);
    ?>

    d) Salvarea rezultatului.

    Putem doar salvarea rezultatului în fișier, al cărui nume începe cu Mini_. Aceasta vom face cu funcția ImageJpeg.
    Când această caracteristică are un singur parametru, imaginea este afișată în browserul utilizatorului. Cu toate acestea, dacă numele fișierului este trecut ca al doilea parametru, acesta nu se va întâmpla cu browserul, iar imaginea va fi salvată în fișierul specificat. Aceeași regulă este valabilă pentru funcția Imagepng

    Imaginea mea nu este afișată, browserul se comportă ca și cum nu există.
    Cel mai probabil, eroarea ar trebui să fie semnată în scriptul dvs. Faceți un comentariu de la șirul antetului ("Tipul de conținut: imagine / png") (sau antetul (tipul de conținut: imagine / JPEG "))), precum și de la String-ul Imagepng ($ im) (orimagejpeg ($ im )) pentru a obține un mesaj de eroare

    Scriptul este de mult timp făcut pe găzduirea mea, este normal?
    Dacă utilizați funcții "grele" ca imaginiCopyresaSampled, nu este surprinzător. Interpretul PHP, instalat pe găzduire și fără această lucrare este suficient ...

    Culorile imaginii mele sunt distorsionate (sau sunt afișate ca alb-negru), de ce?
    Cel mai probabil ați folosit funcția de imagineCreate, care limitează paleta de culori de 256 de culori. Pentru a depăși această restricție, utilizați funcția ImaginiCreateTusolor în loc de imagine imagine.

    Finalizarea acestui articol, arătăm rezultatul care poate fi obținut prin combinarea a două exemple ale acestui articol. Aici, am adăugat jumătate la histogramă folosind aceeași metodă ca în exemplul 2.

    Rezultat


În acest articol, vom descrie în detaliu mecanismul de încărcare a imaginilor pe server folosind PHP fără a recurge la componente și cadre terță parte. Vom învăța să încărcați în siguranță imagini nu numai de la aparatul de utilizator local, ci și la fișiere la distanță prin referință. Toate exemplele codului pe care le voi scrie într-un stil procedural, pentru a citi codul mai rapid și nu sari de la o metodă la alta. Dreptul de autor manual și nu solicită o academică de prezentare.

§unu. Principii generale

Întreaga secvență de încărcare a imaginii la server poate fi afișată după cum urmează: configurarea php.ini.fișiere Noțiuni de bazăverificare de securitatedata validariisalvarea pe disc.. Procesul de încărcare a unei imagini de pe un computer computer sau adrese URL nu este diferit, cu excepția metodei de obținere a unei imagini și a economii sale. Schema generală de încărcare a imaginii de pe server este după cum urmează:

Pentru a valida imaginea de pe adresa URL, vom folosi funcția Getimagesizefromstring (), deoarece curl descarcă-o într-o variabilă pentru mai multe manipulări.

Pe măsură ce încărcăm imagini pe server, ar fi bine să verificăm parametrii lor specifici: lăţime, Înălţime, un fel Imagini, marimea fișier în octeți. Depinde de logica aplicației dvs., dar pentru claritate în acest manual, vom verifica toți parametrii descriși mai sus.

§2. Norme de siguranță

Siguranța încărcării imaginii este redusă la prevenirea codului străin la server și execuția acestuia. În practică, încărcarea imaginilor cel mai vulnerabil loc în aplicațiile PHP: shell script, va un cod rău intenționat în fișiere binare, semnarea datelor exif.. Pentru a evita majoritatea metodelor de hacking, trebuie să urmați următoarele reguli:

dar nu Trust date de la $ _files;
b. nu Verificați tipul de imagini MIME din funcția Geimagesize ();
În fișierul descărcabil, generați un nou nume și o expansiune;
g Interzicerea executării scripturilor PHP în dosarul Imagine;
d. nu Introducerea datelor de utilizator prin necesitate și includeți;
e pentru $ _files utilizare is_uploadd_file () și muta_uploadd_file ().

Dacă există ceva de adăugat "reguli de securitate", lăsați comentariile sau referințele la articole de siguranță din comentariile la acest ghid și le publicați în acest paragraf.

§3. Configurația php.ini.

PHP vă permite să efectuați valori de configurare specifice în procesul de descărcare a fișierelor. Pentru a face acest lucru, este necesar în fișierul php.ini pentru a găsi blocuri " Limitele resurselor.», « Manipularea datelor"Și" Încărcări fișiere.", Apoi editați, dacă este necesar, următoarele valori:

; Timp maxim de execuție al scriptului în câteva secunde max_executy_time \u003d 60. ; Consumul maxim de memorie cu un singur script Memory_limit \u003d 64m. ; Dimensiunea maximă admisibilă a datelor trimise prin metoda postală post_max_size \u003d 5m. ; Permisiunea de a descărca fișiere File_uploads \u003d pornit. ; Folder pentru stocarea fișierelor în timpul descărcării Upload_tmp_dir \u003d Home / Utilizator / Temp ; Dimensiunea maximă a fișierului descărcat Upload_max_filesize \u003d 5m. ; Numărul maxim permis de fișiere simultan descărcabile Max_file_uploads \u003d 10.

Pe baza valorilor specificate, utilizatorul nu va putea încărca mai mult de zece fișiere simultan și fiecare fișier nu trebuie să depășească 5 MB. Parametrii din bloc " Limitele resurselor.»Suntem mai necesari pentru a descărca un fișier la distanță, deoarece cu Curl, vom descărca conținutul la variabil și vom verifica criteriile de care avem nevoie și pentru că aveți nevoie de timp suplimentar și de memorie.

Fișierul de configurare PHP.ini este întotdeauna necesar pentru configurarea în funcție de logica de afaceri a aplicației web dezvoltată. De exemplu, intenționăm să încărcați nu mai mult de zece fișiere de până la 5 MB, ceea ce înseamnă că trebuie să fie necesare ~ 50 MB de memorie. În plus, trebuie să cunoaștem timpul maxim de încărcare al unui fișier de la mașina locală și pe link-ul pentru a seta un timp suficient de execuție al scriptului în max_executy_time și să nu sperie erorile utilizatorilor.

§Four. Încărcarea imaginilor din formular

Acum, nu vom lua în considerare descărcarea mai multor fișiere pe server și vom analiza numai mecanica de descărcare în exemplul unui fișier. Deci, pentru a încărca o imagine de pe un computer computer, trebuie să utilizați formularul HTML pentru a trimite fișierul script PHP utilizând metoda Post și specificați metoda de codare a datelor enctype \u003d "multipart / formular-date" (În acest caz, datele nu sunt codificate și această valoare este aplicată numai pentru a trimite fișiere binare). Cu formularul de mai jos vom lucra în continuare:

Pentru câmpul de selecție a fișierelor, folosim numele. nume \u003d "Încărcare" În forma noastră HTML, deși poate fi orice. După trimiterea fișierului de fișier de fișier PHP-Handler.Php, acesta poate fi interceptat utilizând o variabilă superglobală $ _Files ["Încărcare"] Cu același nume că în matrice conține informații despre fișier:

( \u003d\u003e Imagine.jpg. // Numele original al fișierului \u003d\u003e Tipul de fișier imagine / JPEG // MIME \u003d\u003e Acasă \\ user \\ temp \\ phpd07e.tmp // fișier binar \u003d\u003e 0 // cod de eroare => 17170 // Dimensiunea fișierului în octeți)

Nu toate datele de la $ _Files. Puteți avea încredere: dimensiunea de tip MIME și fișierul poate fi falsificată, deoarece acestea sunt formate dintr-un răspuns HTTP, iar extensia în numele fișierului nu ar trebui să fie de încredere datorită faptului că un fișier complet diferit poate fi ascuns. Cu toate acestea, mai mult, trebuie să verificăm dacă fișierul nostru este încărcat corect și dacă este deloc boot-ul. Pentru a face acest lucru, verificați erorile din $ _Files ["Încărcare"] ["Eroare"] Și asigurați-vă că fișierul este încărcat de postare utilizând funcția is_uploadd_file (). Dacă ceva nu este pe plan, înseamnă că luăm eroarea pe ecran.

// rebotează variabilele pentru comoditate $ filepath \u003d $ _files ["Încărcare"] ["tmp_name"]; $ errorCode \u003d $ _files ["Încărcare"] ["eroare"]; // Verificați erorile dacă ($ errorCode! \u003d\u003d upload_err_ok || _ is_uploadd_file ($ filepath)) ( // matrice cu nume de eroare $ errs.Messages \u003d [upload_err_ini_size \u003d\u003e "Dimensiunea fișierului a depășit valoarea Update_Max_Filesize în configurația PHP"., Upload_err_form_size \u003d\u003e "Dimensiunea fișierului descărcat a depășit valoarea Max_File_Size în formă HTML.", Upload_err_parțial \u003d\u003e "Fișierul de descărcare a fost obținut doar parțial"., Upload_err_no_file \u003d\u003e "Fișierul nu a fost încărcat.", Upload_err_no_tmp_dir \u003d\u003e "Nu există nici un dosar temporar"., Upload_err_cant_write \u003d\u003e "Nu sa înregistrat un fișier pe disc.", Upload_err_extension \u003d\u003e "Extensia PHP a încetat să descărcați un fișier.", ]; // setați eroarea necunoscută $ neplăcutMessage \u003d. "A apărut o eroare necunoscută la descărcarea fișierului."; // Dacă nu există cod de eroare în matrice, să spunem că o eroare este necunoscută $ OUTOUTMESSAGE \u003d ISET ($ errs.Messages [$ cod de eroare])? $ Errs.Messages [$ errorCode]: $ unknowMessage; // retrageți numele erorii (£ outiemessage); )

Pentru ca atacatorul să nu încărcați codul rău intenționat construit în imagine, nu puteți avea încredere în funcții getimagesize ()care returnează, de asemenea, tipul MIME. Funcția se așteaptă ca primul argument să se refere la fișierul de imagine corect. Puteți defini un tip real de imagine de imagine prin extensia FileInfo. Codul de mai jos va verifica prezența unui cuvânt cheie imagine. În tipul fișierului nostru descărcabil și dacă nu se dovedește, va da o eroare:

// Creați o resursă FileInfo $ fi \u003d finfo_open (fileInfo_mime_type); // obținem mime tip $ MIME \u003d (șir) finfo_file ($ fi, $ filepath); );

În acest stadiu, putem încărca deja absolut orice poze pe serverul nostru care a verificat tipul MIME, dar pentru a încărca imagini pe anumite caracteristici, trebuie să le validim folosind funcția getimagesize ()care ar putea fi un fișier binar $ _Files ["Încărcare"] ["tmp_name"]. Ca rezultat, obținem o serie de 7 elemente:

Array (\u003d\u003e 1280 // lățime \u003d\u003e 768 // Înălțime \u003d\u003e 2 // Tip \u003d\u003e Width \u003d "1280" Înălțime \u003d "768" // atribute pentru HTML \u003d\u003e 8// adâncime de culoare => 3 // model de culoare \u003d\u003e image / jpeg // mime-tip)

Pentru validarea ulterioară a imaginii și lucrați la acesta, trebuie să cunoaștem doar 3 valori: lăţime, Înălţime și marimea Fișier (pentru a calcula funcția de aplicare a dimensiunii mărime fișier () Pentru un fișier binar dintr-un dosar temporar).

// funcția Rezultat scrie într-o variabilă $ image \u003d getimagesize ($ filepath); $ Limitbytes \u003d 1024 * 1024 * 5; $ limitwidth \u003d 1280; $ LimitHeight \u003d 768; // verificați parametrii doritori Dacă (Filesize ($ FilePath)\u003e $ limitbytes) Die ( "Dimensiunea imaginii nu trebuie să depășească 5 MB."); dacă ($ image\u003e $ limitheight) mor (); dacă ($ image\u003e $ limitwidth) mor ();

După toate verificările, putem cu încredere să ne mișcăm fișierul descărcat în unele dosare de fotografii. Face mai bine prin funcție muta_uploadd_file ()care funcționează în modul sigur. Înainte de a muta fișierul, nu puteți uita generați un nume și o expansiune aleatorie din tipul de imagine Pentru fișierul nostru. Arată cum arată:

// Generați un nou nume de fișier bazat pe MD5-Hash $ Nume \u003d md5_file ($ filepath); // socil .jpeg înainte de .jpg// mutați imaginea cu un nou nume și extensie la dosar / poze dacă (! muy_uploadd_file ($ FilePath, __dir__ "/ poze /" $ nume. $ format)) (Die ( "A apărut o eroare la scrierea unei imagini."); }

Acest lucru este finalizat în acest sens. Pentru descărcări mai convenabile de fișiere, puteți utiliza clasa încărcată de la pachetul Symfony HttpFoundation, care este un înveliș pentru $ _Files. și, de asemenea, salvează dosarul prin muta_uploadd_file ().

§cinci. Încărcarea imaginii prin referință

Pentru a descărca imaginea prin referință, avem nevoie de o bibliotecă curl care funcționează cu resurse la distanță. Cu aceasta, vom descărca conținut în variabilă. Pe de o parte, poate părea că în aceste scopuri va fi file_get_contents ()Dar, de fapt, nu vom putea controla volumul de date descărcabile și procesează în mod normal toate erorile. Pentru ca Curl să descărcați corect datele de care avem nevoie: Permiteți urmărirea redirecționeazăActivați cecurile certificatPunct timp maxim Lucrări curl (formate din cauza volumului de date descărcabile și viteza medie cu o resursă). Cum se descărcă fișierul la variabila prezentată mai jos cu parametrii necesari:

// cumva obținem un link $ url \u003d "https://site.ru/pictură.jpg"; // verificați http în adresa de legătură Dacă (! preg_match ("/ ^ https?: / I", $ url) && filter_var ($ url, filtru_validate_url)) (Die ( "Specificați linkul corect cu fișierul la distanță."); } // Începeți curl cu referința noastră $ ch \u003d curl_init (adresa URL); // Specificați setările pentru Curl Curl_setopt_array ($ ch, [ // Specificați orele maxime de lucru ale curlului Curlopt_timeout \u003d\u003e 60, // Permiteți urmărirea redirecționărilor Curlopt_followLocation \u003d\u003e 1, // Permiteți rezultatul să scrie într-o variabilă Curlopt_returtransfer \u003d\u003e 1, // Porniți indicatorul de încărcare a datelor Curlopt_noprogress \u003d\u003e 0, // vopsea dimensiunea tamponului de 1 kB Curlopt_buffersize \u003d\u003e 1024, // Scrieți o caracteristică pentru numărarea datelor descărcate // Citește mai mult: http://stackoverflow.com/a/17642638 Curlopt_progressfunction \u003d\u003e function ($ ch, $ dwnldsize, $ dwnld, $ usddsize, $ upld) ( // Când este descărcat mai mult de 5 MB, curl va întrerupe munca dacă ($ dwnld\u003e 1024 * 1024 * 5) (retur - 1;)), // Porniți verificarea certificatului (în mod implicit) Curlopt_ssl_verifyPeer \u003d\u003e 1, // Verificați numele certificatului și coincidența sa cu gazda specificată (în mod implicit) Curlopt_ssl_veriflehost \u003d\u003e 2, // Specificați certificatul de verificare // descărcare: https://curl.haxx.se/docs/caextract.html Curlopt_cainfo \u003d\u003e __dir__. "/Cacert.pem",]); $ Brut \u003d curl_exec ($ ch); // descărcați datele la variabila $ info \u003d curl_getinfo ($ ch); // primim informații despre operațiune $ error \u003d curl_errno ($ ch); // Scrieți codul ultimei erori // sesiune completă curl Curl_close ($ ch);

Dacă totul a trecut cu succes și curl sa întâlnit în 60 de secunde, atunci conținutul de pe link va fi descărcat la variabila $ Brut.. În plus, funcția curl_getinfo () Returnați informațiile despre solicitarea solicitată, de unde putem obține mai multe informații pentru analizarea lucrărilor cu resurse la distanță:

( \u003d\u003e imagine / jpeg // tip mime de la tipul de conținut => 200 // ultimul cod HTTP => 0 // Numărul de redirecționare => 0.656 // Timpul total de curl => 0.188 // timp pentru a vă conecta cu gazda => 4504 // Dimensiunea reală a datelor => 4504 // Dimensiunea datelor de la lungimea conținutului /* ... */ )

Apoi, trebuie să verificăm dacă nu există greșeli în curl_errno () Și asigurați-vă că resursa oferă codul HTTP egal cu 200, altfel vom spune că nu a fost găsit pentru o astfel de adresă URL. După toate verificările variabile $ Brut. Transfer B. getIMAGESTRING () Și lucrăm deja pe schema de evacuare ca în cazul încărcării imaginilor din formular.

Rețineți că câștigăm dimensiunea fișierului în momentul primirii datelor, deoarece nu putem avea încredere în Curl_getinfo (), deoarece valorile Content_type, HTTP_CODE, descărcare_content_length se formează pe baza titlurilor HTTP primite. Descărcați complet fișierul și apoi verificați numărul de octeți care necesită mult timp și memorie. Prin urmare, am controlat dimensiunea datelor obținute utilizând opțiunea Curlopt_ProgressFunction: De îndată ce Curl primește mai multe date decât limita noastră, va înceta să lucreze și să dai eroarea Curle_Aborted_by_Callback.

// verificați erorile curl și disponibilitatea fișierului Dacă ($ error \u003d\u003d\u003d curle_operation_timedout) Die ( "Limita de speranță depășită".); Dacă ($ error \u003d\u003d\u003d curle_aborted_by_callback) Die ( "Dimensiunea nu trebuie să depășească 5 MB."); Dacă ($ info [http_code "]! \u003d\u003d 200) Die ( "Fișierul nu este disponibil."); // Creați o resursă FileInfo $ fi \u003d finfo_open (fileInfo_mime_type); // primiți tipul de MIME folosind conținutul de $ RAW $ Mime \u003d (string) finfo_buffer ($ fi, $ brut); // Închideți resursele FileInfo Finfo_close ($ fi); // verificați imaginea cuvintelor cheie (imagine / jpeg, imagine / png etc.) Dacă (stropi ($ mime, "imagine") \u003d\u003d\u003d fals) mor ( "Puteți descărca numai imagini."); // Luați datele imaginii din conținutul său. $ image \u003d getimensizefromstring ($ brut); // setați restricțiile pentru imagini $ limitwidth \u003d 1280; $ LimitHeight \u003d 768; // verificați parametrii doritori Dacă ($ Image\u003e $ Limithight) Die ( "Înălțimea imaginii nu trebuie să depășească 768 de puncte".); Dacă ($ image\u003e $ limitwidth) mor ( "Lățimea imaginii nu trebuie să depășească 1280 de puncte".); // Generați un nume nou din imaginea MD5-Hash $ Nume \u003d md5 ($ brut); // generați extensia fișierului pe baza tipului de imagine $ extensie \u003d image_type_to_extension ($ image); // socil .jpeg înainte de .jpg $ Format \u003d str_replace ("JPEG", "JPG", $ extensie); // Salvați imaginea cu un nume nou și extensie la dosar / poze dacă (file_put_contents (__dir__ "/ poze /". $ nume. $ format, $ brut)) (Die ( "A apărut o eroare la salvarea unei imagini."); }

Puteți utiliza imaginea pentru a salva file_put_contents ()care va înregistra conținut în fișier. Numele de fișier nou pe care îl vom crea prin funcție mD5 ()și extensia va face de la image_type_to_extension (). Acum putem încărca imagini pe link.

§6. Configurarea unei selecții de fișiere multiple

În această secțiune vom analiza metodele de descărcare a mai multor imagini dintr-o dată de la aparatul de utilizator local și pe link-uri de la distanță. Folosim linkuri pentru a trimite link-uri $ _Post. și să-i dăm toate datele folosind eticheta textarea.. Pentru a descărca fișiere din formular, vom continua să lucrăm $ _Files.. Noul nostru formular HTML va fi puțin diferit de cel vechi.

La sfârșitul numelui câmpului de selecție a fișierelor nume \u003d "Încărcare" Se adaugă bretele și atributul adăugat multiplucare permite browserului să selecteze mai multe fișiere. Toate fișierele sunt descărcate din nou într-un dosar temporar dacă nu există erori în PHP.ini. Le puteți intercepta în $ _Files.Dar de data aceasta variabila superglice va avea o structură incomodă pentru prelucrarea datelor în matrice. Această sarcină este rezolvată de manipulări mici cu o matrice:

// Schimbați structura $ _files Foreach ($ _files ["încărcare"] ca key key \u003d\u003e $ valoare) (valadă ($ valoare ca $ k \u003d\u003e $ v) ($ _files ["încărcare"] [$ K] [$ k cheie] \u003d $ V; ) // eliminați cheile vechi Desfaceți ($ _files ["Încărcare"] [tasta $]); ) // încărcați toate imaginile în ordine Foreach ($ _files ["încărcare"] ca $ k \u003d\u003e $ v) ( // încărcați un fișier $ _Files ["încărcare"] [$ k] ["tmp_name"]; $ _Files ["Încărcare"] [$ k] ["eroare"]; )

Pentru a descărca mai multe imagini pe adresa URL, hai să dăm legăturile noastre textarea. Cu numele. nume \u003d "Încărcare"unde pot fi specificate printr-un spațiu sau dintr-o linie nouă. Funcţie preg_split. Dezastru toate datele de la $ _Post ["Încărcare"] Și va forma o matrice în care trebuie să mergeți la ciclu și fiecare adresă URL validă trimite manipulatorului.

$ date \u003d preg_split ("/ \\ s + /", $ _post ["Încărcare"], - 1, preg_split_no_empty); FOREACH (Datele $ ca URL $) ( // Validarea și încărcare imaginea de pe adresa URL }

Creând o imagine goală.

Sintaxă:

Int imagineCreate (int x, int y)

Creează o dimensiune goală a imaginii x. pe y. Puncte și returnează identificatorul său. După crearea imaginii, toate lucrările cu acesta se efectuează prin acest identificator, prin analogie cu modul în care lucrăm cu fișierul prin descriptorul său.

Exemplu:

Crearea unei imagini noi cu Gd. și retrage-o în ecranul browserului:

imagecreatefrompng.

Crearea unei imagini din fișierul PNG.

Sintaxă:

Int imageCreatefrompng (numele de fișier șir)

Această funcție încărcați imagini din fișierul PNG în memorie și returnează-o la identificator. Ca după apel imageCreate ()

Exemplu:

Un exemplu de găsire a unei erori la deschiderea unui fișier grafic.

Funcția loadpng ($ imgname) ($ im \u003d @imagecreatefrompng ($ imgame); / * încercați să deschideți * / dacă (! $ Im) (/ * a se vedea dacă nu a eșuat * / $ im \u003d imagecreate (150, 30); / * Creați o imagine necompletată * / $ BGC \u003d Imagecoloraloclococerie ($ im, 255, 255, 255); $ tc \u003d Imagecoloraloc ($ im, 0, 0, 0); ImagefilateRecretangle ($ im, 0, 0, 150, 30, $ BGC); / * ieșire un errrmsg * / imagstring ($ im, 1, 5, 5, "Eroare la încărcare $ imgame", $ tc);) returnați $ im;)

imagecreatefromjpeg.

Crearea unei imagini dintr-un fișier JPEG.

Sintaxă:

Int imageCreatefromjpeg (numele de fișier șir)

imageCreate (), Lucrul în continuare cu imaginea este posibil numai prin acest identificator. Când porniți de pe un disc, imaginea este neplăcută și stocată în memorie deja într-un format despachetat, astfel încât să puteți efectua diferite operații cu acesta, cum ar fi scalarea, liniile de desen etc.

imagineCreatefromgif.

Crearea unui desen din fișierul GIF.

Sintaxă:

Int imageCreatefromgif (numele de fișier șir)

Această caracteristică încărcați imagini din fișier în memorie și returnați identificatorul acestuia. Ca după apel imageCreate (), Lucrul în continuare cu imaginea este posibil numai prin acest identificator. Când porniți de pe un disc, imaginea este neplăcută și stocată în memorie deja într-un format despachetat, astfel încât să puteți efectua diferite operații cu acesta, cum ar fi scalarea, liniile de desen etc.

Este de remarcat faptul că Gd. Pornind de la versiunea 1.6 nu acceptă formatul GIF. În acest sens, această funcție este practic utilizată.

imagepng.

Funcția afișează o imagine într-un format PNG în orice browser sau într-un fișier.

Sintaxă:

Int imgepng (int im [, nume de fișier șir))

Această caracteristică salvează imaginea specificată de identificatorul său și în memorie, pe disc sau să o aducă în browser.

imageCreate () sUNT..

Dacă argumentul nume de fișier. Tipul de conținut. Antet ().

Antet ("tip de conținut: imagine / png") Pentru PNG.

Exemplu: Un exemplu de utilizare a funcției imagepng ():

Pentru a salva imaginea sursei alfa-canal, utilizați funcția imageAvealpha ():

imageJpeg.

Strângeți browserul de imagine JPEG sau salvați-l în fișier.

Sintaxă:

INT ImageJpeg (INT IM [, Numele de fișier de șir [, INT Calitate]]

Această caracteristică salvează imaginea specificată de identificatorul său și de memorie pe disc sau afișează-o în browser.

Desigur, la început o imagine trebuie să fie încărcată sau creată utilizând o funcție. imageCreate (). Trebuie să-i cunoaștem identificatorul sUNT..

Dacă argumentul nume de fișier. Omitere, atunci datele comprimate în formatul corespunzător sunt afișate direct în fluxul de ieșire standard, adică În browser. Titlul dorit Tipul de conținut. Nu este afișat, având în vedere că trebuie să îl retrageți manual Antet ().

De fapt, trebuie să apelați una dintre cele trei comenzi, în funcție de tipul de imagine:

Antet ("tip de conținut: imagine / jpeg") Pentru JPEG.

Al treilea parametru opțional calitate. Setează calitatea imaginii (de la 0 la 100).

image2wbmp.

Afișarea imaginii într-un browser sau fișier.

Sintaxă:

INT Image2Wbmp (Imagine de Resurse [, String FileName [, Int Prag]])

Funcția afișează o imagine specificată de descriptor imagine., în browser sau într-un fișier al cărui nume este setat de un parametru opțional nume de fișier..

Dacă imaginea este afișată în browser, trebuie să specificați funcția de tip WBMP / VND.WAP.WBMP Antet ():

Funcţie image2wbmp () Disponibil PHP. numai dacă versiunea bibliotecii Gd. 1,8 sau mai mici.

imagegif.

Trimiterea unei imagini a browserului GIF sau salvarea acestuia în fișier.

Sintaxă:

INT IMAGEGIF (INT IM [, Numele de fișier șir))

Funcția Salvați imaginea specificată de identificatorul său și în memorie pe disc sau o ieșire la browser.

Desigur, la început o imagine trebuie să fie încărcată sau creată utilizând o funcție. imageCreate (). Trebuie să-i cunoaștem identificatorul sUNT..

Dacă argumentul nume de fișier. Omitere, atunci datele comprimate în formatul corespunzător sunt afișate direct în fluxul de ieșire standard, adică În browser. Titlul dorit Tipul de conținut. Nu este afișat, având în vedere că trebuie să îl retrageți manual Antet ().

De fapt, trebuie să apelați una dintre cele trei comenzi, în funcție de tipul de imagine:

Antet ("tip de conținut: imagine / gif")

pentru că bibliotecă Gd.Începând cu versiunea 1.6, nu acceptă formatul GIF, această funcție este rar utilizată.

imageCopy.

Copierea unei părți a modelului.

Sintaxă:

Int imagecopy (int dst_im, int src_im, int dst_x, int dst_y, int src_x, int src_y, int src_w, int src_h)

Funcția copiază zona dreptunghiulară din punct de vedere ( src_x., src_y.) Lățime src_w. și înălțime src_h. De la desen src_im. în desen dst_im., oferind o zonă compensată copiată ( dst_x., dst_y.).

Următorul exemplu va fi o imagine file1.png. în întregime copiate de B. file2.png.

imagecopyresized.

Copierea unei bucăți de model cu scalare.

Sintaxă:

Int imagecopyresized (int dst_im, int src_im, int dstx, int dty, int srcx, int dsth, int srcw, int srch)

Această caracteristică este una dintre cele mai puternice și universale. Folosind-o, puteți copia imagini (sau secțiunile lor), mutați-le sau scalarea acestora.

dst_im. Specifică identificatorul de imagine în care va fi plasat rezultatul funcției. Această imagine ar trebui să fie deja creată sau încărcată și are dimensiuni adecvate.

src_im. - Un identificator de imagine pentru care se desfășoară lucrările. Cu toate acestea, src_im și dst_immogut și coincid.

Parametri srcx., srcy., srcw., srch. Specificați zona din interiorul imaginii sursă deasupra căreia operația va fi efectuată - respectiv, coordonatele colțului din stânga sus, lățimii și înălțimii.

În cele din urmă, cele patru dstx., dTY., dSTW., dsth. Specifică locul în imagine dst_im.care va fi "stoarse" dreptunghiul specificat în ultimele patru. Rețineți că, dacă lățimea sau înălțimea a două dreptunghiuri nu coincid, imaginea va fi proiectată automat pentru a se întinde sau a fi comprimată.

În exemplul următor file1.jpg. scade de două ori și scrie în dosar file2.jp.g:

imagestestroy.

Model de distrugere.

Sintaxă:

Int imagedstroy (int im)

Funcția distruge descriptorul sUNT. Model creat anterior (cum ar fi închiderea unui fișier fLOSE () După deschidere fopen ()).

Dacă sunteți un dezvoltator Avid Php, probabil că nu numai că ați auzit despre Biblioteca Grafică a Bibliotecii GD. Pentru cei care nu sunt familiarizați cu el, explic că biblioteca GD vă permite să creați imagini, să modificați și să le gestionați fără prea mult efort. Astăzi, ne vom familiariza cu utilizarea AZA în Biblioteca GD Graffic PHP.

În primul rând

Asigurați-vă că biblioteca GD este instalată și activată pe serverul dvs. Nu știu cum să o faci? Nu vă faceți griji, totul este simplu! Trebuie doar să creați un fișier PHP pe server, apoi să introduceți următoarele:

Acum deschideți pagina browserului și veți vedea o listă imensă de caracteristici ale versiunii PHP. Derulați în jos un pic în jos, găsiți secțiunea "GD" și asigurați-vă că biblioteca este conectată. Dacă nu, contactați compania care găzduiește un serviciu de găzduire. Din fericire, pe majoritatea serverelor, pe care am reușit deja să lucrez și să lucrez, biblioteca GD este instalată și conectată.

Repere

Să trecem prin câteva momente importante. În primul rând, vom face astfel încât toate rapoartele de eroare să fie emise de browser. Acest lucru poate fi realizat prin introducerea următoarelor la începutul codului PHP:

Error_reporting (e_all);
?>

Trageți un pătrat

Să începem cu cea mai simplă și să tragem cu ajutorul PHP un pătrat albastru - nimic supranatural, desigur, dar este necesar să se ocupe de elementele de bază. Pentru a obține pătratul dorit, trebuie să efectuați următoarele acțiuni:

Setați tipul de conținut ca "imagine", astfel încât browserul să poată interpreta imaginea în mod corespunzător;
. Creați o nouă imagine goală prin setarea lățimii și înălțimii dorite;
. Faceți fundalul culorilor albastru;
. Salvați opțiunea de imagine finală și transferați-o în browser;
. Memorie clară care a fost utilizată pentru a crea și a depozita imaginea;
. Organizați afișarea imaginii din fișierul index.php

Acum că am decis cu privire la procedura de acțiune, puteți începe codarea. Am încercat să comentez pe fiecare linie a codului și despre funcțiile utilizate în procesul de codificare, atunci voi vorbi mai târziu. Deci, aici este codul pentru a crea piața noastră albastră. După scriere, o vom salva sub numele de "Basic_square.php".

// Instalați afișarea mesajelor de eroare
ini_set ("display_errors", "1");
Error_reporting (e_all);


// Determinați dimensiunile imaginii
// 125px lățime, înălțime 125px
$ image \u003d imagineCreate (125, 125);

// Alegeți culoarea de fundal
$ albastru \u003d Imagecoloraloc ($ imagine, 0, 0, 255);

// Setați o altă culoare - doar pentru a vă asigura că atunci când este afișat modelul, fundalul va fi primul set de culori ()
// Notă - Pătratul va fi albastru, nu roșu.
$ roșu \u003d imagecoloraloc ($ imagine, 255, 0, 0);

// Salvați fișierul în format PNG și afișați-l.
imagepng ($ image);

// curățați memoria utilizată
imagestestoy ($ image);
?>

Acum, să luăm în considerare toate funcțiile utilizate și fiecare etapă a codului de mai sus pentru a înțelege mai bine ceea ce facem în ea:

Așa cum am explicat deja, adăugăm o opțiune de mesaj de eroare pentru a le repara rapid dacă este necesar
. Apoi folosim funcția Header () pentru a seta tipul de conținut - PNG
. Salvăm imaginea și instalăm lățimea și înălțimea dorită - vezi imagineaCreate () în detaliu.
. Apoi utilizați funcția de imagineColoraloclocare pentru a selecta culoarea albastră pentru fundalul desenului nostru. Rețineți că în versiunea finală va fi o culoare instalată mai întâi, astfel încât pătratul nostru se va dovedi a fi albastru, nu roșu.
. Pentru depozitarea finală a imaginii, folosim Imagepng (). Dacă doriți să salvați imaginea în orice director, trebuie să introduceți parametri suplimentari.
. Și în cele din urmă, curățăm memoria folosind funcția imagedstroy ()

Putem privi la pătrat de noi prin deschiderea fișierului Blue_Square.php și va fi chiar mai bine dacă vom seta un link pe pagina principală:

Dacă totul a fost făcut corect, veți vedea acest pătrat albastru:

Salut Lume

Acum, când am învățat cum să creăm imagini, să încercăm să facem o imagine cu textul scris de fontul nostru selectat. Putem folosi orice font din directorul TrueType Font (.tff). În exemplele următoare, voi folosi fontul "Advent". Să scriem "Bună ziua" pe un pătrat gri închis. Atenție, uitați-vă la codul, apoi dezasamblați fiecare pas în detaliu.

ini_set ("display_errors", "1");
Error_reporting (e_all);


Antet ("tip de conținut: imagine / png");

// Determinați dimensiunea imaginii - 300x300 pixeli

// Instalați fundalul gri închis

// indicați calea către font
$ font_path \u003d "advent_light";

// scriem text
$ string \u003d "salut lume!";

// Conectați textul și imaginile
Imagettftext ($ imagine, 50, 0, 10, 160, $ alb, $ font_path, $ string);

// salvați imaginea
imagepng ($ image);

// curățați memoria
imagestestoy ($ image);
?>

Salvați codul în fișierul "Hello_world.php", îl vom deschide în același mod ca și cum ați enumerat mai sus. Deci, ce este nou aici?

Am setat dimensiunea imaginii de 300 * 300 pixeli și am folosit un fundal gri închis
. Vă rugăm să rețineți cum am arătat calea către font utilizând numele fontului: Faptul este că în continuare în Cod va trebui să aplicăm text imaginii. De asemenea, nu uitați că numele fontului este scris fără extindere. Cu toate acestea, depinde de ce versiune a Bibliotecii GD utilizează PHP: Dacă numele fontului nu începe cu "/", va fi necesar să extindeți TTF - adică dacă nu stați înainte de numele nostru Font, acesta va fi adăugat automat la TTF la sfârșit.
. Apoi scriem "Bună ziua!" și salvați textul pentru utilizare ulterioară
. Cea mai importantă funcție utilizată în acest cod este Imagettftext (), care necesită instrucțiuni 8 ale parametrilor: calea către imagine, dimensiunea imaginii, unghiul de înclinare, axa x, axa y, culoarea, font, text (în această ordine)

Salvați codul, deschideți-l în orice mod și veți vedea această imagine:

Porniți-l!

Ați observat că funcția ImaginettFtext care leagă textul și imaginea este parametrul de poziționare la un unghi "? Deci putem transforma textul nostru în orice unghi. Să recăpătăm codul și să întoarcem linia de pe piață.

// Instalați mesajele de eroare
ini_set ("display_errors", "1");
Error_reporting (e_all);

// Instalați tipul de conținut
Antet ("tip de conținut: imagine / png");

// determinarea dimensiunii imaginii: 300x300 pixeli
$ image \u003d imagineCreate (300, 300);

// Determinați culoarea fundalului - gri închis
$ Dark_grey \u003d imagecoloraloc ($ imagine, 102, 102, 102);
$ alb \u003d imagecoloraloc ($ imagine, 255, 255, 255);

// indicați calea către font
$ font_path \u003d "advent_light";

// scriem text
$ string \u003d "salut lume!";

// Conectați textul și imaginile
ImaginetFtext ($ Image, 50, -45, 30, 70, $ alb, $ font_path, $ string);

// salvați imaginea
imagepng ($ image);

// curățați memoria
imagestestoy ($ image);
?>

Rețineți că am setat valoarea -45 grade în loc de 0 grade (ca în exemplul anterior) - este tot ceea ce este necesar pentru a transforma textul. Uitate la imagine.

Cum? Interesant? Nu? Apoi, să încercăm să facem ceva mai practic.

Care este numărul de astăzi?

Nu putem să atragem numai imagini, ci și să folosiți gata! O mică codificare și vom avea un calendar care afișează data curentă (lună, zi și an). Căutăm o piesă de lucru din Calendar în Google, găsim o imagine în format.svg - i-am schimbat dimensiunea și am tradus în format PNG. Uită-te la piesa de prelucrat:

Acum avem o bază și o putem procesa folosind funcții GD și PHP. Am avertizat că nu mă prefac că sunt titlul celui mai mare designer din lume - poate cealaltă piesă de prelucrat și un alt font ar arăta mai bine pe site. Deci, designul este al tău, dar pentru moment să ne uităm la cod:

// Instalați mesajele de eroare
ini_set ("display_errors", "1");
Error_reporting (e_all);

// Instalați tipul de conținut

// păstrați data
Lista ($ luni, $ zi, $ ani) \u003d Explode ("/", data ("f / js / y"));

// Descărcați imaginea de fundal
$ image \u003d imageCreatefrompng ("calendar_blank.png");
$ image_width \u003d imaginixx ($ image);

// Determinați culoarea și fontul de fundal
$ alb \u003d imagecoloraloc ($ imagine, 255, 255, 255);
$ negru \u003d Imagecoloraloc ($ imagine, 0, 0, 0);
$ font_path \u003d "advent_light";

// specificați poziția textului
$ Pos_month \u003d imagettfbbox (13, 0, $ font_path, $ luni);
$ Pos_day \u003d imagetttfbbox (25, 0, $ font_path, $ zi);
$ Pos_year \u003d imagettfbbox (8, 0, $ font_path, $ an);

// scriu o lună
Imagettftext ($ image, 13, 0, ($ image_width - $ pos_month) / 2, 40, $ alb, $ font_path, $ luni);

// scrie ziua
Imagettftext ($ image, 25, 0, ($ image_width - $ Pos_Day) / 2, 80, $ negru, $ font_path, $ zi);

// scriem anul
Imagettftext ($ image, 8, 0, ($ image_width - $ pos_year) / 2, 100, $ negru, $ font_path, $ an);

// salvați imaginea
ImageJpeg ($ Image, ", 100);

// curățați memoria
imagestestoy ($ image);
?>

Deci, ce facem aici? Care este funcția listei ()? Să ne dăm seama:

Ca întotdeauna, am setat tipul de conținut, astfel încât imaginea să fie afișată corect.
. În linia a 10-a vedeți caracteristica funcției de listă. Definim formatul datei folosind funcția Explode () și salvează-o. Astfel, puteți aranja orice informații. Acum avem acces la informații despre luna curentă, zi și an.
. În corzile 22-24, folosim funcția ImaginettTfbbox () pentru a organiza formatul datei. Funcția asigură afișarea datei în ordinea specificată și pentru accesul la colțul inferior din dreapta pe care îl scriem $ pos_month. Toate acestea sunt necesare pentru ca textul să fie plasat automat corect, indiferent de dimensiunea sa.
. Apoi creăm fiecare linie la rândul său și setați dimensiunea textului de-a lungul axei X.

Dacă nu a apărut nicio catastrofă, ar trebui să aveți imaginea prezentată mai jos, singura diferență pe care o dată va fi cea instalată pe computerul dvs. - desenul meu, după cum puteți ghici, static. Pentru ajutor cu scriptul datorită site-ului Catpin.

Pisici și filtre de imagine

Ultimul lucru pe care îl voi învăța astăzi, acestea sunt filtre de imagini - un lucru foarte interesant, crede-mă. Funcția ImageFilter () ia imaginea finită și îl schimbă într-un anumit mod - de exemplu, se traduce în modul alb-negru. Să ne uităm la imaginea cu care vom lucra în forma sa originală.

Acum, să facem o pisică alb-negru folosind funcția de filtrare a imaginii.

// Instalați mesajele de eroare
ini_set ("display_errors", "1");
Error_reporting (e_all);

// Verificați dacă imaginea originală este setată
dacă (Isset ($ _ obține ["sursă"])) (
// efectuați procesarea de bază a desenului
$ image \u003d filtru_var ($ _ obține ["sursă"], filter_sanitize_string);

// Încarcă o imagine
$ image \u003d imageCreatefromjpeg ($ image);

// Traduceți-l în modul alb-negru
ImageFilter ($ image, img_filter_grayscale);

// Instalați tipul de conținut
Antet ("tip de conținut: imagine / jpeg");

// păstrați imaginea ca 90%
ImageJpeg ($ image, ", 90);

// curățați memoria
imagestestoy ($ image);
}
?>

Scriptul de mai sus este suficient de flexibil, astfel încât să puteți face cu ușurință orice desen negru și alb - ca acesta:

Am pus în "Sursa" orice imagine și, în curând, va deveni alb-negru. Cei care intenționează să utilizeze această caracteristică pe serverele disponibile publicului vor necesita măsuri suplimentare de securitate. Deși în scriptul de mai sus este un tip de tip. JPEG, puteți utiliza funcția pentru a procesa orice fișiere grafică. Acum, pisica noastra arata ca aceasta:

Alte filtre:

La sfârșitul lecției, vă voi prezenta la alte filtre grafice și la rezultatele utilizării lor.

Filtru de luminozitate

Pentru luminozitatea imaginii corespunde celui de-al treilea parametru:


// Cel de-al treilea parametru stabilește nivelul luminozității imaginii.
ImageFilter ($ image, img_filter_brightness, 40);
ImageJpeg ($ image, ", 90);
imagestestoy ($ image);
?>

Gaussian Blur.

Blur peste Gauss, nu parametri suplimentari

Antet ("tip de conținut: imagine / jpeg");

$ image \u003d imageCreatefromjpeg ("cat.jpg");
ImageFilter ($ image, img_filter_gaussian_blur);
ImageJpeg ($ image, ", 90);
imagestestoy ($ image);
?>

Contrast

Al treilea parametru determină contrastul

Antet ("tip de conținut: imagine / jpeg");
$ image \u003d imageCreatefromjpeg ("cat.jpg");
Imagefilter ($ image, img_filter_contrast, -15);
ImageJpeg ($ image, ", 90);
imagestestoy ($ image);
?>

Scoaterea valorii medii (efectul modelului)

Nu parametri suplimentari.

Antet ("tip de conținut: imagine / jpeg");
$ image \u003d imageCreatefromjpeg ("cat.jpg");
ImageFilter ($ image, img_filter_mean_removal);
ImageJpeg ($ image, ", 90);
imagestestoy ($ image);
?>

Soldul de culoare

Setează saturația canalului roșu, verde, albastru, precum și alfa (opțional) în următoarea ordine

Antet ("tip de conținut: imagine / jpeg");
$ image \u003d imageCreatefromjpeg ("cat.jpg");
// parametrul canalului alfa omis mai jos, deoarece este opțional.
ImageFilter ($ imagine, img_filter_colorize, 50, 0, 0);
ImageJpeg ($ image, ", 90);
imagestestoy ($ image);
?>

La întâlniri noi ...

Sper că ați tratat mai mult sau mai puțin cu biblioteca GD din PHP. În a doua parte, ne vom uita la unele tehnici avansate și, desigur, vom afla și mai interesant. Utilizați biblioteca GD și abilitățile dvs. creative și asigurați-vă că mi-ați spus ce aveți!

Dragi participanți la proiect în mișcare! Astăzi aștepți un alt subiect interesant. Suntem obișnuiți să, să spunem, să încărcați noi avatare pe rețelele sociale. Dar cum sunt scalate la dimensiunea dorită? Ce se întâmplă pe server? Acestea și multe alte întrebări vă așteaptă sub pisică.

Da, dacă cineva nu este conștient, atunci în terminologia Internet "Cat" (de la tăierea tăiată engleză), acesta este un loc care împărtășește știrile pentru o scurtă (în lista generală) și o prezentare completă.

Mulți știu că dezvolt propriul meu sistem de management al site-urilor numit Kogir (Cogear, http://cogear.ru). Povestea este complexă și lungă, dar du-te cu încăpățânare la scop.

Să vedem aspectele de bază ale lucrărilor cu imagini.

PHP are o bibliotecă GD încorporată. Iată documentația sa:

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

Pe această pagină veți găsi un număr mare de varietăți de funcții. Dar nu vă fie frică. Suntem interesați de beton destul.

După cum puteți vedea, lucrați cu imagini până acum se întâmplă sub formă de proceduri (funcții), astfel încât coaja orientată pe obiecte trebuie să scrie.

Cel mai simplu exemplu de lucru cu imaginea:

Încercăm mașina locală.

Creați un fișier. imagine.php.(Am un domeniu local pentru experimente test.local.).

Punem în rădăcina TEST.Local Dosar Site: 1.jpg Imagine:

Apelați în browserul http: //test.local/image.php (în cazul dvs., o altă adresă).

Găsim în dosarul Imagine 2.jpg:

Proporțiile nu sunt păstrate, după cum puteți vedea. Pentru că nu i-am recalculat.

Vom corecta scenariul nostru, astfel încât să aibă loc recalcularea:

$ ratio_orig) ($ width \u003d $ înălțime * $ ratio_orig;) altceva ($ înălțime \u003d $ width / $ ratio_orig;) // Deplasați imaginea din fișierul de pe web cu o schimbare în scara de imagineCopyresaSampled ($ image_p, $ imagine, 0, 0, 0, 0, $ lățime, $ înălțime, $ width_orig, $ înălțime_ORIG); // afișaj imaginejpeg ($ image_p, "2.jpg", 100);

Să analizăm rezultatul:

Deoarece am fost recalculați în înălțime, o parte din imaginea finală sa dovedit a fi negru (culoarea originală a panzei create).

Ce altceva poți să faci cu imaginea? Tăiați-o, întoarceți-vă, așezați un lucru la altul, trageți-l pe el.

Sunt sigur că veți fi interesat de clasa mea pentru a lucra cu imagini. Nu funcționează în afara sistemului, deoarece este un driver pentru modulul (modulul) "imagini".

Dar veți găsi multe lucruri interesante pentru dvs.:

* @Copyright Drepturi de autor (C) 2012, Belyaev Dmitri * @license http://cogear.ru/license.html * @Link http://cogear.ru * / clasa Image_driver_gd Extensions imagine_driver_abstract (/ ** * creează o imagine * / Funcție publică Creare () (Cazului Imagype_Jpeg: Cazul ImageType_JPEG2000: $ this-\u003e Sursa \u003d ImageCreatefromjpeg ($ this-\u003e Info-\u003e fișier); pauză; caz imagineType_png: $ this-\u003e sursa \u003d imageCreatefrompng ($ acest- \u003e Info-\u003e File); ImageColorttransparent ($ this-\u003e sursă, Imagecoloralocerie ($ această-\u003e Sursa, 0, 0, 0)); Imagealfabled ($ this-\u003e sursă, false); ImageAvealpha ($ this-\u003e sursă, Adevărat); Break; Case ImageType_gif: $ this-\u003e Sursa \u003d ImageCreatefromgif ($ acest-\u003e Fișier Info-\u003e); ImageColorttransparent ($ this-\u003e sursă, Imagecoloraloclococerie, 0, 0, 0)); Imaginialphabled ($ this-\u003e Sursa, False); ImaginiAvealpha ($ this-\u003e sursă, adevărat); pauză; caz imagineType_ico: $ this-\u003e sursa \u003d imageCreatefromwbmp ($ acest-\u003e dosar); rupere;)) / ** * distruge imaginea * / Funcție publică Distruge () (imageSesteroy ($ această-\u003e sursă); Is_resource ($ acest-\u003e țintă) && imagestestroy ($ acest-\u003e țintă); ) / ** * Creează o imagine țintă * * @param Mixed $ Lățime * @param Mixed $ înălțime * / Funcție publică CreareTarget ($ lățime, $ înălțime) ($ acest-\u003e țintă \u003d imageCreatusolor ($ lățime, $ înălțime); Dacă ($ this-\u003e Info-\u003e Type \u003d\u003d Imagype_png sau Imagype_gif \u003d\u003d $ Acest--\u003e Info-\u003e Tip) (ImageColorttransparent ($ this-\u003e țintă, ImageColoraloc ($ this-\u003e țintă, 0, 0, 0)) ); ($ This-\u003e Info-\u003e tip) imageALfabled ($ this-\u003e țintă, false); ImageAvealpha ($ acest-\u003e țintă, adevărat);) returnați $ acest-\u003e țintă;) / ** * modifică scara a imaginii * * @param Int | String $ lățime lățime * @ param int | șir $ înălțime înălțime * @param string $ fit lățime tip scaling, înălțime, fit * @param Int | string $ scară ce imagini scalare orice, sus, Jos * @return Obiect Imagine * / Funcție publică Redimensionare ($ lățime, $ înălțime, $ Fit \u003d "lățime", $ scară \u003d "orice") ($ source_width \u003d $ this-\u003e smartsize (lățime de $, "lățime"); $ Source_Height \u003d $ this-\u003e smartsize ($ înălțime, "înălțime"); // verificați tipul de scalare a comutatorului ($ Fit) (// dacă alegeți Unghii în lățime, atunci dau o înălțime la proporțiile dorite de caz "lățime": $ lățime \u003d $ source_width; $ Înălțime \u003d rotund (($ source_width * $ this- _\u003e Info-\u003e Înălțime) / $ this-\u003e width-\u003e Lățime); Pauză; // în cazul în care înălțimea de înălțime, dați lățimea la proporțiile dorite de caz "înălțime": $ lățime \u003d rotundă ((($ this-\u003e Info-\u003e Lățime * $ Source_Height) / $ Acest-\u003e Info-\u003e Înălțime ); $ Înălțime \u003d $ Source_Height; Pauză; Carcasă "Crop": dacă ($ this-\u003e Info-\u003e Lățime\u003e $ ăsta-\u003e Info-\u003e Înălțime) ($ lățime \u003d rotund (($ this-\u003e Info-\u003e Lățime * $ Source_Height) / $ Acest- Info -\u003e Înălțime); $ Înălțime \u003d $ Source_Height;) altceva ($ width \u003d $ source_width; $ înălțime \u003d rotund ((($ -\u003e Info-\u003e Înălțime * $ source_width) / $ Această-\u003e Lățimea informațiilor); ) Pauza; // Implicit pur și simplu se întind implicit: Carcasă "Fit" :) // Verificați dacă comutatorul va fi efectuat ($ scală) (// dacă imaginea este mai mare decât dimensiunile specificate, nimic nu se întâmplă "sus": dacă ( $ lățime< $this->info-\u003e Lățime & $ înălțime< $this-> Info-\u003e înălțime) (returnați acest $;) pauză; // Dacă o imagine este mai mică decât dimensiunile specificate, nimic nu se întâmplă cu "Down" cu acesta: dacă ($ lățime\u003e $ acest-\u003e Info-\u003e Lățime && $ Înălțime\u003e $ acest-\u003e Info-\u003e Înălțime) (return $ acest lucru;) ruperea; Cauza "Orice": Implicit: // nu face nimic. Filonic) $ acest-\u003e țintă \u003d $ this- _\u003e creaTarget ($ lățime, $ înălțime); Dacă (Imagine\u003e Target, $ ALY-\u003e Sursa, 0, 0, 0, 0, $ Lățime, $ Înălțime, $ Acest articol -\u003e Info-\u003e Lățime, $ Acest-\u003e Info-\u003e Înălțime)) ($ acest- Sursa \u003d $ this-\u003e țintă; $ this- _\u003e width \u003d $ lățime; $ this- _\u003e Info-\u003e Înălțime \u003d $ înălțime; dacă ("Crop" \u003d\u003d $ Fit) (returnați $ aceasta -\u003e Cultură ( "Centrul", "Centrul", $ source_width, $ Source_Height);)) Returnați acest lucru; ) / ** * produce tăierea unei imagini * * @param mixt $ x coordonate tăiere x * @param amestecat $ y Coordonate Cropping y * @param mixt $ latime trimes Lățime * @param mixt $ Înălțime de tăiere * @return Obiect imagine * / Crop funcția publică ($ x, $ y, $ lățime, $ înălțime) ($ x \u003d $ this-\u003e smartsize ($ x, "lățime") - $ lățime / 2; $ y \u003d $ this-\u003e smartsize ($ Y, "înălțime") - $ înălțime / 2; $ lățime \u003d $ this-\u003e smartsize ($ lățime, "lățime"); $ înălțime \u003d $ this-\u003e smartsize ($ înălțime, "înălțime"); $ acest- TARGET \u003d $ Acest- CREATETARGET ($ lățime, $ înălțime); if-\u003e țintă, $ this-\u003e sursă, 0, $ x, $ y, $ lățime, $ înălțime, $ lățime, $ înălțime)) ($ acest -\u003e Sursa \u003d $ this-\u003e tinta; $ this-\u003e width \u003d $ lățime; $ acest- €-\u003e Info-\u003e înălțime \u003d $ înălțime;) Returnați acest lucru;) / ** * Maging Imagini * / Funcția publică Merge (imagine $ imagine, $ x, $ y, $ procent \u003d 100) ($ x \u003d $ this-\u003e smartsize ($ x, "lățime"); $ y \u003d $ this-\u003e smartsize ($ y, "înălțime" ); (ImageCopymerge ($ aceasta-\u003e Sursa, $ image-\u003e GetSource (), $ x, $ y, 0, 0 , $ Image-\u003e Obiect () -\u003e Image-\u003e Lățime, $ Image-\u003e Obiect () -\u003e Imagine-\u003e Înălțime, $ procent)) () Returnați acest lucru; ) / ** * salvează o imagine * / Funcție publică Salvare ($ fișier \u003d , $ Opțiuni \u003d Array ()) ($ this-\u003e tinta sau $ this- italy- €-\u003e Sursa; dacă (STPO ($ ($ Fișier, ".") Sau $ FILE \u003d $ Acest-\u003e Fișier Info-\u003e\u003e File) ($ ext \u003d PATHFO ($ fișier, pathfo_extension); $ ext \u003d strtolower ($ ext);) altceva ($ ext \u003d strtolower ($ fișier ); $ file \u003d null;) comutator ($ ext) (caz "jpg": caz "jpeg": $ opțiuni sau $ opțiuni \u003d 90; ImageJpeg ($ acest-\u003e dosar, $ opțiuni); pauză; caz "GIF": ImageColorttransparent ($ this-\u003e țintă, ImageColoraLocaLpha ($ this-\u003e țintă, 0, 0, 127)); Imagealfabled ($ acest-\u003e țintă, falsă); ImageAvealpha ($ acest-\u003e țintă, adevărat); Imagegif ($ this-\u003e țintă, dosar); pauză; caz "png": imaginealphablending ($ acest-\u003e țintă, false); imaginiasavealpha ($ acest-\u003e țintă, adevărat); dacă (is_numeric ($ opțiuni)) ( $ Calitate \u003d $ opțiuni; $ filtre \u003d png_no_filter;) altceva ($ calitate \u003d izset ($ opțiuni ["calitate])? $ Opțiuni ["Calitate"]: 9; $ Filtre \u003d Isset ($ Opțiuni [Filters "]? $ Opțiuni ["Filtre"]: png_no_filter; ) imagepng ($ acest-\u003e țintă, $ fișier, $ calitate, $ filtre); Pauză; ) $ acest-\u003e distruge (); ) / * * Afișează o imagine * / Funcție publică ($ FORMAT, $ Opțiuni) ($ acest-\u003e Salvare ($ FORMAT, $ Opțiuni);)))

Cum funcționează în sistem? Pentru ceea ce este atât de mult cod?

Vedea:

$ image \u003d imagine nouă ("1.jpg"); $ Image-\u003e redimensionare (200.200, "lățime") -\u003e Crop (200.200) -\u003e Salvare ("2, JPG);

Intelegi? Funcționează automat cu toate formatele necesare. Funcțional, dacă este necesar, poate fi extins.

Temele pentru tine va face ceea ce este indicat mai sus (în clasa mea) pe mașina locală. Dacă doriți și timpul să experimentați parametrii.