Darmowy fragment publikacji:
Idź do
• Spis treści
• Przykładowy rozdział
• Skorowidz
Katalog książek
• Katalog online
• Zamów drukowany
katalog
Twój koszyk
• Dodaj do koszyka
Cennik i informacje
• Zamów informacje
o nowościach
• Zamów cennik
Czytelnia
• Fragmenty książek
online
Kontakt
Helion SA
ul. Kościuszki 1c
44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl
© Helion 1991–2011
PHP 5. Praktyczny kurs.
Wydanie II
Autor: Marcin Lis
ISBN: 978-83-246-3393-7
Format: 158×235, stron: 456
Rewelacyjne strony internetowe w PHP 5 – dowiedz się, jak je zrobić!
• Instalacja i konfiguracja narzędzi, czyli bez czego nie da się ruszyć dalej
• Elementy języka i współpraca z systemem plików, czyli co koniecznie trzeba opanować
• Obiektowy PHP i współpraca z bazami danych, czyli co może Ci się przydać
Znajomość języka skryptowego PHP, szczególnie w wersji PHP 5, to w dzisiejszych czasach
standard, bez którego nie może się obyć żaden szanujący się twórca stron internetowych.
Środowisko PHP 5 pozwala tworzyć dynamiczne witryny, efektywnie komunikujące się z bazami
danych. Zapewnia też możliwość współpracy Twojej strony z różnymi rodzajami danych, a ponadto
nadaje się do tworzenia samodzielnie działających aplikacji. Jeśli marzy Ci się kariera webmastera,
a nie masz jeszcze odpowiednich umiejętności w tej dziedzinie lub chcesz odświeżyć wiedzę, ta
książka umożliwi Ci szybkie wejście na grunt praktycznego zastosowania możliwości języka PHP
w Twoich własnych projektach.
W podręczniku „PHP 5. Praktyczny kurs. Wydanie II” znajdziesz kompletne informacje o podstawach
PHP – od kwestii związanych z nazewnictwem, instalacją i konfiguracją niezbędnych narzędzi,
przez omówienie zasad budowy skryptów, aż po programowanie obiektowe i obsługę sieci.
Dowiesz się, jak uruchomić działającą (i atrakcyjną) witrynę internetową, jak wykorzystać
możliwości grafiki i o czym należy pamiętać, aby uniknąć kłopotów z wyświetlaniem witryny
w przeglądarce. Nauczysz się obsługiwać protokoły sieciowe i zrozumiesz, na czym polega obsługa
sesji. Sprawdź, jak wiele możesz osiągnąć, programując w PHP!
• Instalacja i konfiguracja narzędzi
• Pierwszy skrypt
• Zmienne, typy danych i operatory
• Instrukcje sterujące i funkcje
• Obsługa daty i czasu, ciągi znaków, tablice
• Operacje na strukturze systemu plików
• Operacje na plikach i praktyczne wykorzystanie plików
• Odbieranie danych z przeglądarki
• Wysyłanie danych do przeglądarki
• Obsługa cookies, sesje i wyjątki
• Programowanie obiektowe
• Obsługa grafiki
• Połączenia sieciowe, poczta i FTP
• PHP i popularne bazy danych
• Obiektowa współpraca z MySQL i SQLite
• Bazy danych w praktyce
PHP 5 – po prostu musisz to znać!
Rozdziaä 0.
Spis treĈci
Wstöp .............................................................................................. 7
Rozdziaä 1. Podstawy ....................................................................................... 11
Lekcja 1. Czym jest PHP? .............................................................................................. 11
JĊzyk skryptowy ....................................................................................................... 11
Krótka historia PHP ................................................................................................. 12
Jak to dziaáa? ............................................................................................................ 12
Lekcja 2. Instalacja i konfiguracja narzĊdzi .................................................................... 14
Samodzielna instalacja narzĊdzi ............................................................................... 14
Korzystanie z pakietu XAMPP ................................................................................. 31
Plik konfiguracyjny PHP .......................................................................................... 38
PHP w wierszu poleceĔ ............................................................................................ 39
Rozdziaä 2. Elementy jözyka ............................................................................. 41
Lekcja 3. Pierwszy skrypt ............................................................................................... 41
Zaczynamy ............................................................................................................... 41
Znaczniki PHP ......................................................................................................... 45
Komentarze .............................................................................................................. 47
WyĞwietlanie informacji .......................................................................................... 49
Instrukcja print ......................................................................................................... 50
àączenie skryptów .................................................................................................... 51
Lekcja 4. Zmienne, typy danych i operatory .................................................................. 57
Czym są zmienne? .................................................................................................... 57
Rodzaje zmiennych, czyli typy danych .................................................................... 58
Zmienne w kodzie skryptu ....................................................................................... 62
WyĞwietlanie wartoĞci zmiennych ........................................................................... 64
Operacje na zmiennych ............................................................................................ 68
Operatory ................................................................................................................. 68
Zmienne globalne (superglobalne) ........................................................................... 83
Konwersje typów ...................................................................................................... 85
ûwiczenia do samodzielnego wykonania ................................................................. 89
Lekcja 5. Instrukcje sterujące ......................................................................................... 90
Instrukcje warunkowe .............................................................................................. 90
Instrukcja wyboru ..................................................................................................... 97
Operator warunkowy ................................................................................................ 99
PĊtle ........................................................................................................................ 100
Skáadnia alternatywna ............................................................................................ 111
ûwiczenia do samodzielnego wykonania ............................................................... 113
4
PHP5. Praktyczny kurs
Lekcja 6. Funkcje ......................................................................................................... 114
Definiowanie funkcji .............................................................................................. 114
Argumenty funkcji ................................................................................................. 115
Zwracanie wartoĞci przez funkcje .......................................................................... 117
ZasiĊg zmiennych ................................................................................................... 118
Sposoby przekazywania argumentów ..................................................................... 123
DomyĞlne argumenty funkcji ................................................................................. 125
ûwiczenia do samodzielnego wykonania ............................................................... 126
Lekcja 7. Obsáuga daty i czasu ..................................................................................... 127
WyĞwietlanie daty i czasu ...................................................................................... 127
Tworzenie znacznika czasu .................................................................................... 135
Pozostaáe funkcje .................................................................................................... 138
ûwiczenia do samodzielnego wykonania ............................................................... 141
Lekcja 8. Ciągi znaków ................................................................................................ 141
Rodzaje ciągów znaków ......................................................................................... 141
WyraĪenia záoĪone w ciągach znaków ................................................................... 143
Która metoda jest szybsza? .................................................................................... 144
Formatowanie ciągów ............................................................................................ 146
Przetwarzanie ciągów znaków ............................................................................... 152
Porównania ............................................................................................................. 154
Przeszukiwanie ....................................................................................................... 155
ûwiczenia do samodzielnego wykonania ............................................................... 157
Lekcja 9. Tablice .......................................................................................................... 158
Proste tablice .......................................................................................................... 158
Tablice asocjacyjne ................................................................................................ 161
Operacje na tablicach ............................................................................................. 163
ûwiczenia do samodzielnego wykonania ............................................................... 170
Rozdziaä 3. Wspóäpraca z systemem plików .................................................... 171
Lekcja 10. Operacje na strukturze systemu plików ...................................................... 171
Odczyt zawartoĞci katalogu .................................................................................... 171
Operacje na katalogach .......................................................................................... 176
Operacje na plikach ................................................................................................ 178
Miejsce na dysku .................................................................................................... 180
Rekurencyjne usuwanie zawartoĞci katalogu ......................................................... 182
Nawigacja po katalogach ........................................................................................ 182
ûwiczenia do samodzielnego wykonania ............................................................... 185
Lekcja 11. Operacje na plikach ..................................................................................... 186
Tworzenie i otwieranie plików ............................................................................... 186
Zamykanie plików .................................................................................................. 188
Odczyt danych ........................................................................................................ 188
Zapis danych .......................................................................................................... 195
Inne operacje .......................................................................................................... 201
ûwiczenia do samodzielnego wykonania ............................................................... 204
Lekcja 12. Praktyczne wykorzystanie plików ............................................................... 204
Tekstowy licznik odwiedzin ................................................................................... 205
Licznik wykorzystujący grafikĊ ............................................................................. 207
Lista odnoĞników ................................................................................................... 209
Lista odwiedzin ...................................................................................................... 210
ûwiczenia do samodzielnego wykonania ............................................................... 213
Spis treĈci
5
Rozdziaä 4. Wspóäpraca z przeglñdarkñ ........................................................... 215
Lekcja 13. Odbieranie danych z przeglądarki ............................................................... 215
Formularze HTML ................................................................................................. 215
Wysyáanie metodą GET ......................................................................................... 216
Metoda POST ......................................................................................................... 221
Wysyáanie plików do serwera ................................................................................ 223
ûwiczenia do samodzielnego wykonania ............................................................... 227
Lekcja 14. Wysyáanie danych do przeglądarki ............................................................. 228
Sposoby wysyáania danych .................................................................................... 228
Wysyáanie zawartoĞci plików ................................................................................. 228
Sposoby pobierania plików z serwisu .................................................................... 232
ûwiczenia do samodzielnego wykonania ............................................................... 245
Lekcja 15. Obsáuga cookies .......................................................................................... 245
Krótko o cookies .................................................................................................... 245
Obsáuga cookies w PHP ......................................................................................... 246
Korzystanie z cookies ............................................................................................. 250
ûwiczenia do samodzielnego wykonania ............................................................... 255
Lekcja 16. Sesje ............................................................................................................ 255
WstĊp do sesji ........................................................................................................ 255
Identyfikator sesji ................................................................................................... 256
Rozpoczynanie sesji ............................................................................................... 256
KoĔczenie sesji ....................................................................................................... 257
Zmienne sesji ......................................................................................................... 257
Konfiguracja sesji ................................................................................................... 258
Implementacja sesji ................................................................................................ 260
ĝledzenie zachowaĔ uĪytkownika .......................................................................... 264
Kontrola dostĊpu z wykorzystaniem sesji .............................................................. 266
System logowania z danymi w pliku ...................................................................... 271
ûwiczenia do samodzielnego wykonania ............................................................... 274
Rozdziaä 5. Obiektowy PHP ............................................................................ 275
Lekcja 17. Podstawy obiektowoĞci ............................................................................... 275
Czym jest obiekt? ................................................................................................... 275
Definicja klasy ....................................................................................................... 276
Tworzenie obiektów ............................................................................................... 279
Konstruktory i destruktory ..................................................................................... 281
Automatyczne áadowanie kodu klasy ..................................................................... 284
Obiektowa lista odwiedzin ..................................................................................... 286
ûwiczenia do samodzielnego wykonania ............................................................... 288
Lekcja 18. WiĊcej o programowaniu obiektowym ....................................................... 288
Dziedziczenie ......................................................................................................... 288
Przesáanianie skáadowych ....................................................................................... 292
Klasy i skáadowe finalne ........................................................................................ 294
Konstruktory i destruktory klas bazowych ............................................................. 295
Specyfikatory dostĊpu ............................................................................................ 297
Skáadowe statyczne ................................................................................................ 299
ûwiczenia do samodzielnego wykonania ............................................................... 302
Lekcja 19. Wyjątki ....................................................................................................... 303
Instrukcja throw ..................................................................................................... 303
Klasa Exception i pochodne ................................................................................... 304
Blok try...catch ....................................................................................................... 305
Przechwytywanie wielu wyjątków ......................................................................... 310
Wáasne wyjątki ....................................................................................................... 313
ûwiczenia do samodzielnego wykonania ............................................................... 314
6
PHP5. Praktyczny kurs
Rozdziaä 6. Grafika i obrazy ............................................................................ 315
Lekcja 20. Obsáuga grafiki ........................................................................................... 315
Biblioteka graficzna ............................................................................................... 315
Jak stworzyü galeriĊ obrazów? ............................................................................... 316
Przetwarzanie grafiki .............................................................................................. 325
ûwiczenia do samodzielnego wykonania ............................................................... 337
Rozdziaä 7. Obsäuga sieci ............................................................................... 339
Lekcja 21. Poáączenia, poczta i FTP ............................................................................. 339
Tablica $_SERVER ................................................................................................ 339
Adresy IP ................................................................................................................ 342
Jak rozpoznaü przeglądarkĊ? .................................................................................. 345
Poáączenie FTP ....................................................................................................... 347
Wysyáanie poczty ................................................................................................... 349
ûwiczenia do samodzielnego wykonania ............................................................... 352
Rozdziaä 8. Wspóäpraca z bazami danych ........................................................ 353
Lekcja 22. Podstawy baz danych .................................................................................. 353
MySQL i SQLite .................................................................................................... 353
Tabele, klucze i relacje ........................................................................................... 354
Bazy danych a PHP ................................................................................................ 358
Instalacja systemu bazy danych .............................................................................. 359
Obsáuga serwera MySQL ....................................................................................... 365
Lekcja 23. Podstawy SQL ............................................................................................ 371
Czym jest SQL? ..................................................................................................... 371
Obsáuga tabel .......................................................................................................... 372
Typy danych w kolumnach .................................................................................... 377
Zapytania ................................................................................................................ 382
Lekcja 24. PHP i bazy danych ...................................................................................... 394
PHP i MySQL ........................................................................................................ 394
PHP i SQLite .......................................................................................................... 402
ûwiczenia do samodzielnego wykonania ............................................................... 409
Lekcja 25. PodejĞcie obiektowe .................................................................................... 410
Korzystanie z PDO ................................................................................................. 410
PHP i SQLite .......................................................................................................... 418
Lekcja 26. Bazy danych w praktyce ............................................................................. 423
Licznik ................................................................................................................... 423
Logowanie .............................................................................................................. 426
Ankieta ................................................................................................................... 428
Lista odwiedzin ...................................................................................................... 433
Liczba osób na stronie ............................................................................................ 435
ûwiczenia do samodzielnego wykonania ............................................................... 437
Skorowidz .................................................................................... 439
Rozdziaä 6.
Grafika i obrazy
Lekcja 20. Obsäuga grafiki
Biblioteka graficzna
PHP umoĪliwia zarówno wykonywanie róĪnorodnych operacji na obrazach, jak i ge-
nerowanie plików graficznych. Wraz z PHP jest w tym celu dostarczana standardowo
biblioteka GD1 (dostĊpna równieĪ pod adresem http://www.libgd.org/ lub http://www.
boutell.com/gd/). W przypadku systemu Windows uaktywnienie funkcji graficznych
uzyskamy przez usuniĊcie komentarza (początkowego Ğrednika) z wiersza:
extension=php_gd2.dll
znajdującego siĊ w pliku php.ini (oczywiĞcie o ile ten wiersz jest ujĊty w komentarz
— poprzedzony Ğrednikiem).
W przypadku Linuksa w pakietach dla poszczególnych dystrybucji biblioteka GD jest
zwykle doáączana standardowo i nie trzeba wykonywaü dodatkowych czynnoĞci. Aby
wáączyü obsáugĊ biblioteki GD w przypadku samodzielnej kompilacji pakietów PHP,
naleĪy podczas konfiguracji podaü dodatkową opcjĊ:
--with-gd
jeĞli chcemy korzystaü z biblioteki dostarczonej wraz z PHP lub:
--with-gd=nazwa_katalogu
jeĞli chcemy korzystaü z zewnĊtrznej wersji biblioteki, np. pobranej spod podanego
wyĪej adresu. W tym przypadku parametr nazwa_katalogu powinien wskazywaü kata-
log, w którym ta biblioteka zostaáa zainstalowana.
1 Jako rozszerzenia dostĊpne są teĪ inne biblioteki, np. ImageMagic, Gmagick, Cairo. Dokáadne
informacje o nich moĪna znaleĨü w dokumentacji PHP.
316
PHP5. Praktyczny kurs
W celu przekonania siĊ, czy dana wersja PHP ma wáączoną obsáugĊ biblioteki GD, moĪ-
na uĪyü funkcji o nazwie gd_info. Zwraca ona tablicĊ asocjacyjną zawierającą infor-
macje o konfiguracji. Wystarczy zatem wywoáaü skrypt przedstawiony na listingu 6.1.
Listing 6.1. Informacje o zainstalowanej bibliotece graficznej
?php
$arr = gd_info();
foreach($arr as $key = $val){
echo $key = $val\n ;
}
?
Przykáadowy efekt dziaáania kodu w konsoli systemu Windows zostaá zaprezentowany
na rysunku 6.1 (skrypt moĪna teĪ wywoáaü w przeglądarce, dodając jednak dla forma-
towania znacznik br / ). W sytuacji gdy wykonanie skryptu nie spowoduje wyĞwie-
tlania informacji lub teĪ pojawi siĊ komunikat o nieznanej funkcji gd_info, bĊdzie to
oznaczaü, Īe obsáuga biblioteki GD nie zostaáa wáączona.
Rysunek 6.1.
Informacje o wersji
i opcjach biblioteki
graficznej GD
Jak stworzyè galeriö obrazów?
Zanim przejdziemy do procedur przetwarzających grafikĊ, spróbujmy zająü siĊ bar-
dzo popularnym tematem tworzenia galerii obrazów. W wiĊkszoĞci wypadków nie wy-
maga to wykorzystywania funkcji udostĊpnianych przez bibliotekĊ GD — wystarczą
zdobyte do tej pory wiadomoĞci dotyczące jĊzyka PHP, w tym wspóápracy z przeglą-
darką (lekcje z rozdziaáu 4.) oraz systemem plików (lekcje z rozdziaáu 3.). Stwórzmy
wiĊc kilka przykáadowych galerii.
Prosta galeria
Najprostsza galeria wyĞwietla pojedyncze obrazy wraz z odnoĞnikami nawigacyjnymi,
tak jak zostaáo to zaprezentowane na rysunku 6.2. Jej utworzenie nie powinno spra-
wiü Īadnego káopotu. Pliki z obrazami zapiszemy w osobnym katalogu, np. o nazwie
images. Skrypt oczywiĞcie uwzglĊdni automatycznie wszelkie zmiany zawartoĞci tego
katalogu, nie trzeba wiĊc bĊdzie troszczyü siĊ o rĊczną aktualizacjĊ danych. Aby jed-
nak nie komplikowaü kodu skryptu, przyjĊte zostanie zaáoĪenie, Īe katalog nie moĪe
Rozdziaä 6. i Grafika i obrazy
317
Rysunek 6.2. Przykáadowy wygląd galerii
zawieraü innych plików niĪ pliki galerii ani podkatalogów. BĊdzie siĊ w nim teĪ mu-
siaá znajdowaü co najmniej jeden plik graficzny.
Numer wyĞwietlanego obrazu bĊdzie przekazywany do skryptu za pomocą metody GET
w postaci parametru o nazwie imgid. Obrazy bĊdą wyĞwietlane w kolejnoĞci alfabetycz-
nej (wedáug nazw plików), pierwszy z nich bĊdzie miaá identyfikator 0, drugi — 1 itd.
Na kaĪdej stronie galerii, tak jak jest to widoczne na rysunku 6.2, bĊdą wyĞwietlane:
obraz (umieszczany na stronie za pomocą znacznika img ),
nazwa pliku graficznego,
numer obrazu (numeracja bĊdzie siĊ rozpoczynaü od 1),
caákowita liczba obrazów,
odnoĞniki do pierwszego, poprzedniego, nastĊpnego i ostatniego obrazu.
Skrypt generujący tak okreĞloną galeriĊ zostaá przedstawiony na listingu 6.2. Przyj-
rzyjmy siĊ mu bliĪej.
Listing 6.2. Prosta galeria obrazów
!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01//EN
html
head
meta http-equiv= Content-Type content= text/html; charset=iso-8859-2
title Galeria obrazów /title
318
PHP5. Praktyczny kurs
/head
body
?php
$imgDir = ./images ;
//odczytanie parametru
if(isSet($_GET[ imgid ])){
$imgId = $_GET[ imgid ];
}
else{
$imgId = 0;
}
//odczytanie zawartoĞci katalogu
$dir = scandir($imgDir);
array_shift($dir);
array_shift($dir);
$count = count($dir);
//sprawdzenie poprawnoĞci parametru
if($imgId 0 || $imgId = $count || !is_Numeric($imgId)){
$imgId = 0;
}
//ustalenie nazwy bieĪącego obrazu oraz
//identyfikatorów obrazów dla odnoĞników
$imgName = $dir[ $imgId ];
$first = 0;
$last = $count - 1;
if($imgId $count - 1){
$next = $imgId + 1;
}
else{
$next = $count - 1;
}
if($imgId 0){
$prev = $imgId - 1;
}
else{
$prev = 0;
}
?
div
div id= obraz style= text-align:center
?php
echo img src=\ $imgDir/$imgName\ alt=\ $imgName\ / ;
?
/div
div id= opis style= text-align:center
?php
$imgId++;
echo Obraz $imgName ($imgId z $count) ;
?
/div
div id= nawigacja style= text-align:center
Rozdziaä 6. i Grafika i obrazy
319
?php
echo a href=\ galeria.php?imgid=$first\ Pierwszy /a ;
echo a href=\ galeria.php?imgid=$prev\ Poprzedni /a ;
echo a href=\ galeria.php?imgid=$next\ Nastúpny /a ;
echo a href=\ galeria.php?imgid=$last\ Ostatni /a ;
?
/div
/div
/body
/html
Kod rozpoczyna siĊ od ustawienia zmiennej $imgDir wskazującej katalog, w którym
bĊdą umieszczane obrazy (musi to byü katalog dostĊpny przez serwer WWW). W tym
przypadku jest to podkatalog images katalogu, w którym bĊdzie umieszczony skrypt
galeria.php. NastĊpnie za pomocą instrukcji warunkowej if sprawdzane jest, czy do
skryptu zostaá przekazany parametr imgid, czyli czy w tablicy $_GET jest klucz o nazwie
imgid. JeĞli tak, jego wartoĞü jest odczytywana, konwertowana za pomocą funkcji
intval do typu integer (por. lekcja 4. z rozdziaáu 2.) i przypisywana zmiennej $imgId,
w przeciwnym razie wartoĞü zmiennej $imgId jest ustawiana na 0.
Po wykonaniu tych wstĊpnych czynnoĞci za pomocą funkcji scandir odczytywana jest
zawartoĞü katalogu wskazywanego przez $imgDir i przypisywana zmiennej $dir. Jak
wiadomo z lekcji 10. (rozdziaá 3.), wynikiem dziaáania scandir jest tablica zawierająca
wszystkie elementy wskazanego katalogu (dlatego teĪ powinny siĊ w nim znajdowaü
wyáącznie pliki graficzne galerii) posortowane w kolejnoĞci alfabetycznej. Pierwsze dwa
elementy tej tablicy to wskazanie do katalogu bieĪącego (.) oraz nadrzĊdnego (..)2,
dlatego teĪ są one usuwane za pomocą dwóch wywoáaĔ funkcji array_shift (funkcja
array_shift usuwa z tablicy pierwszą komórkĊ, czyli pierwszy indeks).
NastĊpnie za pomocą wywoáania funkcji count pobierana jest i zapisywana w zmien-
nej $count caákowita liczba obrazów, a za pomocą instrukcji if nastĊpuje sprawdzenie
poprawnoĞci parametru zapisanego w zmiennej $imgId. Nie moĪna bowiem zakáadaü,
Īe do skryptu zostaáa przekazana na pewno poprawna wartoĞü. Dlatego teĪ jest spraw-
dzane, czy wartoĞü $imgId jest:
mniejsza od 0,
wiĊksza od maksymalnej moĪliwej wartoĞci ($count - 1),
JeĞli jeden z tych warunków jest prawdziwy (czyli kiedy zostanie stwierdzona niepra-
widáowoĞü przekazanych danych), zmiennej $imgId jest przypisywana wartoĞü 0, co
oznacza, Īe zostanie wyĞwietlony pierwszy obraz.
Po ostatecznym ustaleniu identyfikatora wyĞwietlanego obrazu są ustawiane wartoĞci
zmiennych, które w dalszej czĊĞci posáuĪą jako parametry dla znaczników HTML. Są to:
$imgName — nazwa pliku graficznego pobrana z tablicy $dir,
$first — identyfikator pierwszego obrazu (czyli 0),
2 Wyjątkiem jest sytuacja, gdy parametrem przekazanym funkcji scandir jest nazwa katalogu gáównego.
320
PHP5. Praktyczny kurs
$last — identyfikator ostatniego obrazu, czyli liczba elementów tablicy
$dir pomniejszona o 1 ($dir - 1),
$next — identyfikator nastĊpnego obrazu, czyli wartoĞü aktualnego
identyfikatora powiĊkszona o 1 ($imgId + 1),
$prev — identyfikator poprzedniego obrazu, czyli wartoĞü aktualnego
identyfikatora pomniejszona o 1 ($imgId - 1).
NaleĪy przy tym zwróciü uwagĊ, Īe jeĞli aktualny identyfikator ma wartoĞü 0, to war-
toĞcią $prev powinno byü 0 (nie ma bowiem wczeĞniejszego obrazu) — i analogicz-
nie jeĞli aktualny identyfikator ma wartoĞü równą identyfikatorowi ostatniego obrazu,
to wartoĞcią $next powinien byü wáaĞnie on (nie ma bowiem nastĊpnego obrazu).
Wszystkie zebrane w opisany sposób dane pozwalają na wygenerowanie znacznika
img w postaci:
img src=\ $imgDir/$imgName\ alt=\ $imgName\ /
np.:
img src= ./images/obraz001.jpg alt= obraz001.jpg /
oraz odnoĞników:
a href= galeria.php?imgid=$first Pierwszy /a — do obrazu
pierwszego,
a href= galeria.php?imgid=$prev Poprzedni /a — do obrazu
poprzedniego,
a href= galeria.php?imgid=$next Nastúpny /a — do obrazu nastĊpnego,
a href= galeria.php?imgid=$last Ostatni /a — do obrazu ostatniego,
oraz pozostaáych danych: nazwy pliku graficznego ($imgName), numeru
aktualnego obrazu ($imgId + 1), caákowitej liczby obrazów ($count).
Galeria z miniaturami obrazów
Nieco bardziej záoĪonym przykáadem jest galeria zawierająca miniatury obrazów (ta-
ka jak zaprezentowana na rysunku 6.3). U góry strony wyĞwietlana jest pewna liczba
miniatur (zdefiniowana w kodzie skryptu). KlikniĊcie kaĪdej z nich powoduje wyĞwie-
tlenie w dolnej czĊĞci strony wybranego obrazu w peánej rozdzielczoĞci. Pod minia-
turkami znajdują siĊ z kolei odnoĞniki pozwalające na nawigacjĊ pomiĊdzy kolejnymi
stronami miniatur. Spróbujmy napisaü skrypt tworzący taką galeriĊ.
Zacznijmy od przygotowania obrazów. Pliki graficzne zawierające zdjĊcia w peánej
rozdzielczoĞci zapiszemy w podkatalogu o nazwie images, natomiast miniatury w pod-
katalogu thumbnails. Miniatury moĪna przygotowaü w dowolnym programie graficz-
nym. Oba podkatalogi zapiszemy w katalogu, w którym bĊdzie znajdowaá siĊ skrypt
realizujący funkcje galerii. Skrypt nazwiemy galeria.php. OczywiĞcie wszystkie wy-
mienione nazwy moĪna zmieniaü wedáug wáasnych potrzeb, bĊdzie to jednak wymaga-
áo uwzglĊdnienia wprowadzonych zmian w kodzie. NaleĪy zwróciü przy tym uwagĊ,
Rozdziaä 6. i Grafika i obrazy
321
Rysunek 6.3. Galeria zawierająca miniatury obrazów
aby w podkatalogach przeznaczonych do umieszczania plików galerii znajdowaáy siĊ
jedynie pliki graficzne, poniewaĪ skrypt nie bĊdzie sprawdzaá typów plików (weryfi-
kacja zostanie pominiĊta w celu uproszczenia kodu).
Zastanówmy siĊ teraz, jak ma wyglądaü struktura strony zawierającej galeriĊ. MoĪe
byü ona zrealizowana na kilka sposobów. NajproĞciej jest uĪyü kilku warstw (które
moĪna dowolnie ostylowaü) albo teĪ do formatowania uĪyü zwykáej tabeli (choü nie
jest to obecnie sposób zalecany). Skorzystajmy zatem z trzech warstw. Górna bĊdzie
przechowywaü obrazy miniatur, Ğrodkowa — odnoĞniki do kolejnych stron z miniatu-
rami, a dolna — wybrany przez uĪytkownika obraz w peánej rozdzielczoĞci. Struktura
ta bĊdzie miaáa zatem schematyczną postaü:
div id= miniatury style= text-align:center
!-- lista miniatur --
/div
div id= nawigacja style= text-align:center
!-- odnoĞniki do kolejnych stron z miniaturami --
/div
div id= obraz style= text-align:center
!-- obraz w peánej rozdzielczoĞci--
/div
Do skryptu bĊdą przekazywane dwa argumenty:
322
PHP5. Praktyczny kurs
pid — (od page id) okreĞlający numer strony z miniaturkami, która ma zostaü
wyĞwietlona w górnej czĊĞci witryny.
iid — (od image id) okreĞlający numer obrazu, który ma zostaü wyĞwietlony
w dolnej czĊĞci witryny.
Miniatury powinny mieü takie same nazwy jak wáaĞciwe pliki z grafiką i byü wedáug
nich ustawione w kolejnoĞci alfabetycznej. PoniewaĪ liczba obrazów w galerii nie bĊ-
dzie z góry ustalana (tak aby moĪna byáo ją aktualizowaü jedynie przez zmianĊ zawar-
toĞci katalogów z grafiką), niezbĊdne bĊdzie obliczanie liczby stron z miniaturami, co
bĊdzie siĊ odbywaáo wedáug prostego wzoru:
liczba stron = cađkowita liczba miniatur / liczba miniatur na pojedynczej stronie
Kod skryptu generującego galeriĊ zostaá przedstawiony na listingu 6.3. W celu zaosz-
czĊdzenia miejsca zostaáy w nim pominiĊte wstĊpne znaczniki HTML, które są takie
same jak w poprzednim przykáadzie.
Listing 6.3. Skrypt generujący galeriĊ z miniaturami obrazów
!-- początek kodu HTML jak w przykáadzie z listingu 6.2 --
body
?php
$imgDir = ./images ;
$thumbDir = ./thumbnails ;
$thOnPage = 5;
if(isSet($_GET[ iid ]) isSet($_GET[ pid ])){
$iId = $_GET[ iid ];
$pId = $_GET[ pid ];
}
else{
$iId = 0;
$pId = 0;
}
$dir = scandir($thumbDir);
array_shift($dir);
array_shift($dir);
$count = count($dir);
$pages = ceil($count / $thOnPage);
if($iId 0 || $iId $count || $pId 0 || $pId $pages){
$iId = 0;
$pId = 0;
}
?
div id= miniatury style= text-align:center
?php
for($i = 0; $i $thOnPage; $i++){
$imgNo = $pId * $thOnPage + $i;
if($imgNo = $count) break;
$imgName = $dir[$imgNo];
Rozdziaä 6. i Grafika i obrazy
323
$imgTag = img src=\ $thumbDir/$imgName\ alt=\ $imgName\ / \n ;
$aHead = a href=\ ./galeria.php?pid=$pId amp;iid=$imgNo\ ;
$aFoot = /a ;
echo $aHead $imgTag $aFoot\n ;
}
?
/div
div id= nawigacja style= text-align:center
Idļ do strony:
?php
for($i = 0; $i $pages; $i++){
echo a href=\ ./galeria.php?pid=$i amp;iid=$iId\ $i /a nbsp; ;
}
?
/div
div id= obraz style= text-align:center
?php
$imgName = $dir[$iId];
echo img src=\ $imgDir/$imgName\ alt=\ $imgName\ / \n ;
?
/div
/body
/html
Kod rozpoczyna siĊ od ustawienia zmiennych, które zawierają: nazwĊ katalogu z ob-
razami ($imgDir), nazwĊ katalogu z miniaturami ($thumbDir) oraz liczbĊ miniatur wy-
Ğwietlanych na pojedynczej stronie ($thOnPage). DziĊki temu wszelkie modyfikacje
tych parametrów bĊdą mogáy byü wykonywane w prosty sposób w jednym miejscu.
NastĊpnie ma miejsce sprawdzenie, czy do skryptu zostaáy przekazane parametry pid
i iid. JeĞli tak, ich wartoĞci za pomocą funkcji intval są konwertowane na liczby caá-
kowite i przypisywane zmiennym $pid i $iid, jeĞli nie — zmienne te otrzymują war-
toĞü 0. Oznacza to, Īe wywoáanie skryptu bez podania parametrów spowoduje, iĪ zo-
staną wyĞwietlone strona miniatur oraz obraz, które bĊdą miaáy indeks 0.
Kolejne instrukcje to wczytanie i zapisanie w zmiennej $dir zawartoĞci katalogu z mi-
niaturami oraz usuniĊcie dwóch pierwszych komórek tej tablicy, czyli pozbycie siĊ
wskazaĔ do katalogu bieĪącego i nadrzĊdnego. Te czynnoĞci są wykonywane dokáad-
nie w ten sam sposób jak w poprzednim przykáadzie. Po wczytaniu danych nastĊpuje
obliczenie caákowitej liczby plików (zmienna $count) oraz wynikającej z niej liczby
stron z miniaturami (zmienna $pages). PoniewaĪ w tym drugim przypadku wynik mo-
Īe byü liczbą z czĊĞcią uáamkową, jest on zaokrąglany do liczby caákowitej za pomo-
cą funkcji ceil (zaokrąglenie w górĊ).
Gdy znamy juĪ zarówno caákowitą liczbĊ plików, jak i liczbĊ stron z miniaturami, a za-
tem równieĪ zakres wartoĞci, jakie mogą przyjmowaü zmienne $iId i $pId, dokonuje-
my weryfikacji danych. Nie moĪna bowiem zakáadaü, Īe dane przesáane do skryptu na
pewno są poprawne. W przypadku stwierdzenia jakiejkolwiek nieprawidáowoĞci (war-
toĞci poza dopuszczalnym zakresem) zmiennym $iId i $pId zostaną przypisane warto-
Ğci 0, czyli skrypt zachowa siĊ tak, jakby nie zostaáy mu przekazane Īadne parametry.
Po przeprowadzeniu wszystkich opisanych procedur moĪna juĪ przystąpiü do wygene-
rowania górnego wiersza zawierającego obrazy miniatur. Proces ten odbywa siĊ w pĊtli
324
PHP5. Praktyczny kurs
for, która ma tyle przebiegów, ile miniatur ma siĊ znaleĨü na stronie. Wewnątrz pĊtli
najpierw jest obliczany indeks aktualnie przetwarzanej miniatury (zmienna $imgNo),
który wynika ze wzoru:
indeks obrazu = indeks wyħwietlanej strony * liczba miniatur na stronie + $i
Gdyby siĊ okazaáo, Īe tak wyliczona wartoĞü jest wiĊksza od caákowitej liczby obra-
zów lub jej równa, pĊtla zostanie przerwana. Oznacza to bowiem, Īe przetwarzana jest
ostatnia strona z miniaturami, na której liczba miniatur moĪe byü mniejsza niĪ na po-
zostaáych stronach.
Po obliczeniu indeksu aktualnej miniatury z tablicy $dir jest odczytywana (i zapisy-
wana w zmiennej $imgName) nazwa odpowiadającego jej pliku. Pozwala to na skon-
struowanie znacznika img w postaci:
img src= $thumbDir/$imgName alt= $imgName /
który jest przypisywany zmiennej $imgTag. Konstruowany jest równieĪ znacznik a ,
który spowoduje, Īe miniatura bĊdzie jednoczeĞnie odnoĞnikiem pozwalającym na wy-
Ğwietlenie odpowiadającego jej obrazu w peánej rozdzielczoĞci. Znacznik ten przyjmu-
je postaü:
a href= ./galeria.php?pid=$pId amp;iid=$imgNo znacznik img /a
W kodzie zostaá on rozbity na dwie czĊĞci — $aHead i $aFoot — tak aby w prosty spo-
sób moĪna byáo skonstruowaü zawartoĞü wysyáaną do przeglądarki za pomocą instruk-
cji echo. Przyjmuje ona postaü:
echo $aHead $imgTag $aFoot ;
NaleĪy zwróciü uwagĊ na sposób zapisania znaku w postaci amp;. Jest to niezbĊdne,
aby zachowaü zgodnoĞü z obowiązującymi standardami HTML.
Druga czĊĞü strony (druga warstwa div ) musi zawieraü odnoĞniki do wszystkich
stron z miniaturami. Jej konstrukcja nie jest skomplikowana. OdnoĞniki są generowa-
ne w pĊtli for, a kaĪdy z nich ma postaü:
a href= ./galeria.php?pid=$i amp;iid=$iId $i /a nbsp;
Jak widaü, zmienia siĊ tu wartoĞü parametru pid, natomiast wartoĞcią iid jest indeks
aktualnie wyĞwietlanego obrazu. DziĊki temu obraz w peánej rozdzielczoĞci wyĞwie-
tlany w dolnej komórce tabeli bĊdzie siĊ zmieniaá tylko na wyraĨne Īyczenie uĪytkow-
nika przeglądającego galeriĊ, gdy kliknie on wybraną miniaturĊ.
Równie prosta jest konstrukcja ostatniego, dolnego wiersza witryny (trzeciej warstwy
div ). Powinien siĊ w nim znaleĨü jedynie znacznik img powodujący wyĞwietlenie
wybranego przez uĪytkownika obrazu. Nazwa pliku z tym obrazem jest pobierana
z tablicy $dir (jej indeks jest zapisany w zmiennej $iId) i przypisywana pomocniczej
zmiennej $imgName. NastĊpnie konstruowany jest znacznik img w postaci:
img src= $imgDir/$imgName alt= $imgName /
który jest wysyáany do przeglądarki za pomocą instrukcji echo.
Rozdziaä 6. i Grafika i obrazy
Przetwarzanie grafiki
Tworzenie obrazu
325
W celu utworzenia nowego obrazu w pamiĊci naleĪy wykorzystaü funkcjĊ imagecreate-
truecolor3, której jako argumenty przekazuje siĊ szerokoĞü i wysokoĞü obrazu. Sche-
matyczne wywoáanie ma zatem postaü:
imagecreatetruecolor(szerokoħè, wysokoħè)
Funkcja zwraca identyfikator obrazu (wartoĞü typu resource), który pozwala na dal-
sze operacje. Gdy obraz utworzony za pomocą imagecreatetruecolor nie bĊdzie juĪ
potrzebny, powinien zostaü usuniĊty z pamiĊci za pomocą wywoáania imagedestroy.
Funkcja imagedestroy zwraca wartoĞü true, jeĞli operacja siĊ powiedzie, lub false
w przeciwnym wypadku. Konstrukcja skryptu (dla przykáadowego obrazu o rozmia-
rach 200×100 pikseli) powinna byü wiĊc nastĊpująca:
?php
$wysokosc = 100;
$szerokosc = 200;
$img = imagecreatetruecolor($szerokosc, $wysokosc);
//operacje na obrazie
imagedestroy($img);
?
W przypadku gdy chcemy wczytaü obraz z pliku graficznego, naleĪy uĪyü funkcji de-
dykowanej dla danego formatu graficznego4:
imagecreatefromgif — dla formatu GIF,
imagecreatefromjpeg — dla formatu JPEG,
imagecreatefrompng — dla formatu PNG.
KaĪda z nich przyjmuje jako argument nazwĊ pliku graficznego (o ile konfiguracja
Ğrodowiska na to pozwala, moĪe byü to teĪ ciąg wskazujący URL obrazu). Wczytanie
zawartoĞci przykáadowego pliku o nazwie obraz1.jpg, który znajduje siĊ w katalogu
/var/www/images, osiągniemy przez wykonanie instrukcji:
$img = imagecreatefromjpeg( /var/www/images/obraz1.jpg );
a gdy ten obraz znajduje siĊ w katalogu c:\www\obrazy\, dziĊki instrukcji:
$img = imagecreatefromjpeg( c:\\www\\obrazy\\obraz1.jpg );
lub:
$img = imagecreatefromjpeg( c:/www/obrazy/obraz1.jpg );
3 MoĪna takĪe uĪyü funkcji imagecreate, zaleca siĊ jednak korzystanie z imagecreatetruecolor.
4 DostĊpne są takĪe funkcje dla mniej popularnych formatów, np. gd2, bmp, xpm itp. Ich opis moĪna
znaleĨü w dokumentacji PHP.
326
PHP5. Praktyczny kurs
Zapisywanie plików graficznych
Obraz utworzony w pamiĊci (niezaleĪnie od tego, jak ta czynnoĞü zostaáa wykonana)
moĪe byü w prosty sposób zapisany do pliku lub wysáany do standardowego wyjĞcia
(np. przeglądarki). W zaleĪnoĞci od wybranego formatu naleĪy uĪyü jednej z dedyko-
wanych funkcji:
imagegif — dla formatu GIF,
imagejpeg — dla formatu JPEG,
imagepng — dla formatu PNG.
KaĪda z nich przyjmuje dwa argumenty — pierwszy okreĞla obraz, natomiast drugi
nazwĊ pliku. JeĞli parametr okreĞlający nazwĊ pliku zostanie pominiĊty, obraz jest wy-
syáany do standardowego wyjĞcia. Aby na przykáad zapisaü na dysku plik typu JPEG
o nazwie image.jpg utworzony z obrazu wskazywanego przez zmienną $img, zastosu-
jemy konstrukcjĊ:
imagejpeg($img, image.jpg );
aby natomiast wysáaü taki obraz do przeglądarki — konstrukcjĊ5:
imagejpeg($img);
Funkcje imagejpg oraz imagepng mogą teĪ przyjmowaü trzeci argument okreĞlający ja-
koĞü pliku wynikowego. W przypadku imagejpg jest to wartoĞü od 0 do 100, przy czym
0 oznacza najwiĊkszą kompresjĊ i najwiĊkszą utratĊ jakoĞci (ale najmniejszy rozmiar
pliku wynikowego), natomiast 100 — najmniejszą kompresjĊ i najmniejszą utratĊ ja-
koĞci (ale najwiĊkszy rozmiar pliku wynikowego). W przypadku imagepng jest to war-
toĞü od 0 do 9, gdzie 0 oznacza brak kompresji, a 9 najwiĊkszą kompresjĊ6.
JeĪeli stosowany jest trzeci argument, a obraz powinien byü wysáany do przeglądarki,
jako nazwy pliku (drugi argument) naleĪy uĪyü wartoĞci null, np.:
imagejpeg($img, null, 85);
Kolory
Wiele funkcji operujących na obrazie wymaga podania w postaci argumentu koloru, któ-
ry ma byü uĪyty (np. funkcja rysująca linie wymaga podania koloru linii). Aby jednak
móc skorzystaü z danego koloru, niezbĊdne jest wczeĞniejsze jego zaalokowanie, które
odbywa siĊ przez wywoáanie funkcji imagecolorallocate. Jej wywoáanie ma postaü:
imagecolorallocate($obraz, czerwony, zielony, niebieski)
gdzie $obraz to identyfikator zwrócony przez jedną z funkcji tworzących obraz, nato-
miast pozostaáe argumenty okreĞlają poszczególne skáadowe koloru w formacie RGB.
Mogą byü one podawane w postaci dziesiĊtnej lub szesnastkowej. Wybrane kolory
5 W takim przypadku niezbĊdne byáoby równieĪ wczeĞniejsze wysáanie odpowiedniego nagáówka HTTP.
6 Ten argument jest dostĊpny od PHP w wersji 5.1.2. Począwszy od wersji 5.1.3, jest teĪ moĪliwe
stosowanie czwartego argumentu okreĞlającego filtry, jakie mają byü zastosowane do obrazu.
Rozdziaä 6. i Grafika i obrazy
327
i odpowiadające im skáadowe RGB zostaáy przedstawione w tabeli 6.1. Funkcja ima-
gecolorallocate zwraca identyfikator koloru lub wartoĞü false (w wersjach PHP po-
niĪej 5.1.3 — –1), jeĞli jej dziaáanie nie zakoĔczyáo siĊ powodzeniem. Przykáadowo,
uzyskanie indeksu koloru czerwonego dla obrazu wskazywanego przez zmienną $img
bĊdzie wymagaáo wywoáania w postaci:
$czerwony = imagecolorallocate($img, 255, 0, 0);
lub:
$czerwony = imagecolorallocate($img, 0xFF, 0, 0);
Tabela 6.1. Wybrane kolory i odpowiadające im skáadowe RGB
Kolor
BeĪowy
Biaáy
BáĊkitny
Brązowy
Czarny
Czerwony
Ciemnoczerwony
Ciemnoniebieski
Ciemnoszary
Ciemnozielony
Fiolet
Koralowy
Niebieski
Oliwkowy
Purpurowy
Srebrny
Stalowoniebieski
Szary
Zielony
ĩóátozielony
ĩóáty
Skäadowa R
Skäadowa G
Skäadowa B
245
255
0
139
0
255
192
0
169
0
238
255
0
128
128
192
70
128
0
192
255
245
255
191
69
0
0
0
0
169
100
130
127
0
128
0
192
130
128
255
255
255
220
255
255
19
0
0
0
139
169
0
238
80
255
0
128
192
180
128
0
62
0
JeĞli chcemy wypeániü wybranym kolorem pewien obszar obrazu, moĪna skorzystaü
z funkcji imagefill, której wywoáanie ma postaü:
imagefill($obraz, wspx, wspy, kolor);
gdzie $obraz okreĞla obraz, wspx i wspy — wspóárzĊdną punktu, od którego rozpocznie
siĊ procedura wypeániania, a kolor — kolor wypeánienia. Aby na przykáad w obrazie
wskazywanym przez zmienną $img wypeániü kolorem niebieskim obszar rozpoczyna-
jący siĊ od punktu o wspóárzĊdnych (15, 25), naleĪy zastosowaü instrukcjĊ:
328
PHP5. Praktyczny kurs
$niebieski = imagecolorallocate($img, 0, 0, 0xFF);
imagefill($img, 15, 25, $niebieski);
Informacje o obrazie
JeĞli chcemy otrzymaü informacjĊ o rozmiarach znajdującego siĊ w pamiĊci obrazu, mo-
Īemy skorzystaü z funkcji imagesx (z ang. image size x) i imagesy (z ang. image size y).
Pierwsza z nich zwraca szerokoĞü, a druga wysokoĞü obrazu. W obu przypadkach ja-
ko argument naleĪy podaü odnoĞnik do obrazu. JeĞli zatem utworzyliĞmy lub wczyta-
liĞmy z pliku obraz, który jest identyfikowany przez zmienną $img, to jego rozmiary
moĪemy uzyskaü za pomocą przykáadowych wywoáaĔ:
$szerokosc = imagesx($img);
$wysokosc = imagesy($img);
Równie przydatną funkcją jest getimagesize, która (nieco wbrew swojej nazwie) zwraca
wiele przydatnych informacji, a nie tylko rozmiary obrazu. Jej wywoáanie ma postaü:
getimagesize(nazwa_pliku[, $tablica]);
gdzie nazwa_pliku okreĞla nazwĊ pliku, z którego dane chcemy odczytaü (moĪe to byü
zarówno plik lokalny, jak i zdalny), a tablica — opcjonalną tablicĊ, w jakiej zostaną
zapisane dodatkowe informacje (w obecnej wersji PHP zapisywane są w niej jedynie
niektóre znaczniki APP z plików JPG).
WartoĞcią zwracaną przez getimagesize jest tablica o nastĊpującej zawartoĞci:
indeks 0 — szerokoĞü obrazu w pikselach,
indeks 1 — wysokoĞü obrazu w pikselach,
indeks 2 — okreĞlenie typu pliku (dostĊpne wartoĞci zostaáy
zaprezentowane w tabeli 6.2),
indeks 3 — ciąg znaków zapisany w postaci height= wysokoħè
width= szerokoħè , który okreĞla rozmiary obrazu,
klucz mime — ciąg znaków okreĞlający typ mime pliku.
klucz channels — liczba kanaáów (3 dla RGB, 4 dla CMYK).
klucz bits — liczba bitów, na których zapisywany jest kolor (z czego
bezpoĞrednio wynika maksymalna moĪliwa liczba kolorów w obrazie).
Generowanie grafiki
Na obrazie utworzonym lub wczytanym w sposób opisany w sekcji „Tworzenie obra-
zu” moĪna za pomocą odpowiednich funkcji wykonywaü róĪne operacje graficzne.
Na kolejnych stronach omówione zostanie kilka z nich. Funkcje te pozwalają m.in. na
rysowanie linii, áuków, prostokątów, wielokątów i elips.
Rysowanie linii
Do rysowania linii sáuĪy funkcja imageline, której wywoáanie ma postaü:
imageline($obraz, xp, yp, xk, yk, kolor)
Rozdziaä 6. i Grafika i obrazy
329
Tabela 6.2. Typy plików rozpoznawane przez funkcjĊ getimagesize
Typ
GIF
JPEG
PNG
SWF
PSD
BMP
TIFF_II7
TIFF_MM8
JPC
JPEG_2000
JP2
JPX
JB2
SWC
IFF
WBMP
XBM
ICO9
WartoĈè
1
2
3
4
5
6
7
8
9
9
10
11
12
13
14
15
16
17
gdzie:
$obraz — to okreĞlenie obrazu,
xp — wspóárzĊdna x początku linii,
yp — wspóárzĊdna y początku linii,
xk — wspóárzĊdna x koĔca linii,
yk — wspóárzĊdna y koĔca linii,
kolor — okreĞlenie koloru.
NaleĪy przy tym pamiĊtaü, Īe wspóárzĊdne lewego górnego rogu to (0, 0). Przykáado-
wo, aby utworzyü obraz o biaáym tle i o rozdzielczoĞci 100u30 pikseli, który by za-
wieraá dwie przekątne (pierwszą koloru zielonego, a drugą czerwonego), i zapisaü go
na dysku pod nazwą obraz1.jpg, naleĪy wykonaü kod widoczny na listingu 6.4.
7 KolejnoĞü bajtów zgodna z formatem Intela (z ang. intel byte order).
8 KolejnoĞü bajtów zgodna z formatem Motoroli (z ang. motorola byte order).
9 Począwszy od PHP w wersji 5.3.0.
330
PHP5. Praktyczny kurs
Listing 6.4. Rysowanie przekątnych
?php
$img = imagecreatetruecolor(100, 30);
$bialy = imagecolorallocate($img, 255, 255, 255);
$zielony = imagecolorallocate($img, 0, 255, 0);
$czerwony = imagecolorallocate($img, 255, 0, 0);
imagefill($img, 0, 0, $bialy);
imageline($img, 0, 0, 99, 29, $czerwony);
imageline($img, 0, 29, 99, 0, $zielony);
imagejpeg($img, obraz1.jpg );
imagedestroy($img);
?
Obraz jest tworzony za pomocą funkcji imagecreatetruecolor. Ta funkcja zwraca za-
sób bĊdący odwoáaniem do obrazu (czy teĪ identyfikatorem obrazu). A zatem w dal-
szej czĊĞci skryptu obraz bĊdzie reprezentowany przez zmienną $img. W uproszczeniu
czĊsto mówi siĊ po prostu o obrazie $img.
NastĊpnie za pomocą funkcji imagecolorallocate alokowane są trzy kolory: biaáy, zie-
lony i czerwony. Wyniki dziaáania funkcji (identyfikatory kolorów) są przypisywane
zmiennym $bialy, $zielony i $czerwony. Obszar obrazu jest wypeániany kolorem bia-
áym dziĊki funkcji imagefill, a przekątne są rysowane przez funkcjĊ imageline. Na za-
koĔczenie obraz jest zapisywany do pliku o nazwie obraz1.jpg (odpowiada za to funk-
cja imagejpg) oraz usuwany z pamiĊci (odpowiada za to funkcja imagedestroy).
Rysowanie prostokñtów
Do rysowania prostokątów sáuĪą funkcje imagerectangle i imagefilledrectangle, któ-
rych wywoáanie ma postaü:
imagerectangle($obraz, xp, yp, xk, yk, kolor)
imagefilledrectangle($obraz, xp, yp, xk, yk, kolor)
gdzie:
$obraz — to okreĞlenie obrazu,
xp — wspóárzĊdna x lewego górnego rogu,
yp — wspóárzĊdna y lewego górnego rogu,
xk — wspóárzĊdna x prawego dolnego rogu,
yk — wspóárzĊdna y prawego dolnego rogu,
kolor — okreĞlenie koloru.
Pierwsza funkcja tworzy sam kontur prostokąta, a druga prostokąt wypeániony kolorem.
Aby zatem utworzyü obraz o biaáym tle i o rozdzielczoĞci 100×100 pikseli, który by
zawieraá cztery uáoĪone w szachownicĊ prostokąty w kolorach niebieskim i zielonym
(w tym dwa wypeánione wáasnym kolorem i dwa wypeánione kolorem táa), oraz zapi-
saü go na dysku pod nazwą obraz1.jpg, naleĪy wykonaü kod widoczny na listingu 6.5.
Rozdziaä 6. i Grafika i obrazy
Listing 6.5. Tworzenie prostokątów
331
?php
$img = imagecreatetruecolor(100, 100);
$bialy = imagecolorallocate($img, 255, 255, 255);
$zielony = imagecolorallocate($img, 0, 255, 0);
$niebieski = imagecolorallocate($img, 0, 0, 255);
imagefill($img, 0, 0, $bialy);
imagefilledrectangle($img, 10, 10, 50, 50, $niebieski);
imagefilledrectangle($img, 50, 50, 90, 90, $niebieski);
imagerectangle($img, 10, 50, 50, 90, $zielony);
imagerectangle($img, 50, 10, 90, 50, $zielony);
imagejpeg($img, obraz1.jpg );
imagedestroy($img);
?
Rysowanie wielokñtów
Do rysowania wielokątów sáuĪą funkcje imagepolygon i imagefilledpolygon, których
wywoáanie ma postaü:
imagepolygon($obraz, $punkty, ile, kolor)
imagefilledpolygon($obraz, $punkty, ile, kolor)
gdzie:
$obraz — to okreĞlenie obrazu,
$punkty — tablica zawierająca wspóárzĊdne kolejnych punktów,
ile — liczba wierzchoáków,
kolor — okreĞlenie koloru.
Tablica punkty musi byü zbudowana w taki sposób, Īe klucze 0 i 1 zawierają wspóárzĊd-
ne x i y pierwszego wierzchoáka, klucze 2 i 3 — drugiego wierzchoáka, 4 i 5 — trze-
ciego wierzchoáka itd. Funkcja imagepolygon rysuje sam kontur wielokąta, natomiast
imagefilledpolygon wielokąt wypeániony wskazanym kolorem. Aby na przykáad uzy-
skaü obraz o biaáym tle i o rozdzielczoĞci 320u200 pikseli, który by zawieraá szeĞcio-
kąt wypeániony kolorem Īóátym, naleĪy wykorzystaü kod widoczny na listingu 6.6.
Listing 6.6. Tworzenie szeĞciokąta wypeánionego kolorem Īóátym
?php
$img = imagecreatetruecolor(320, 200);
$bialy = imagecolorallocate($img, 255, 255, 255);
$zolty = imagecolorallocate($img, 255, 255, 0);
imagefill($img, 0, 0, $bialy);
$tab = array(80, 100, 120, 20, 200, 20, 240, 100, 200, 180, 120, 180);
imagefilledpolygon($img, $tab, 6, $zolty);
332
PHP5. Praktyczny kurs
imagejpeg($img, obraz1.jpg );
imagedestroy($img);
?
Rysowanie elips
Do rysowania elips sáuĪą funkcje imageelipse i imagefilledelipse, których wywoáa-
nie ma postaü:
imageelipse($obraz, xc, yc, xw, xh, kolor)
imagefilledelipse($obraz, xc, yc, xw, xh, kolor)
gdzie:
$obraz — to okreĞlenie obrazu,
xc — wspóárzĊdna x Ğrodka elipsy,
yc — wspóárzĊdna y Ğrodka elipsy,
xw — szerokoĞü elipsy (Ğrednica pozioma),
xh — wysokoĞü elipsy (Ğrednica pionowa),
kolor — okreĞlenie koloru.
Funkcja imageelipse rysuje sam kontur, natomiast imagefilledelipse elipsĊ wypeá-
nioną wskazanym kolorem. Aby na przykáad uzyskaü obraz o biaáym tle i o rozdziel-
czoĞci 320×200 pikseli, który by zawieraá czarny okrąg oraz elipsĊ wypeánioną kolo-
rem niebieskim, naleĪy wykorzystaü kod widoczny na listingu 6.7.
Listing 6.7. Rysowanie elips
?php
$img = imagecreatetruecolor(320, 200);
$bialy = imagecolorallocate($img, 255, 255, 255);
$czarny = imagecolorallocate($img, 0, 0, 0);
$niebieski = imagecolorallocate($img, 0, 0, 255);
imagefill($img, 0, 0, $bialy);
imagefilledellipse($img, 100, 100, 100, 30, $niebieski);
imageellipse($img, 220, 100, 80, 80, $czarny);
imagejpeg($img, obraz1.jpg );
imagedestroy($img);
?
Rysowanie wycinków elips
Do rysowania wycinków elips sáuĪą funkcje imagearc i imagefilledarc, których wy-
woáanie ma postaü:
imagearc($obraz, xc, yc, xw, xh, k1, k2, kolor)
imagefilledarc($obraz, xc, yc, xw, xh, k1, k2, kolor, styl)
gdzie:
Rozdziaä 6. i Grafika i obrazy
333
$obraz — to okreĞlenie obrazu,
xc — wspóárzĊdna x Ğrodka elipsy,
yc — wspóárzĊdna y Ğrodka elipsy,
xw — szerokoĞü elipsy (Ğrednica pozioma),
xh — wysokoĞü elipsy (Ğrednica pionowa),
k1 — kąt (w stopniach) okreĞlający liniĊ początkową,
k2 — kąt (w stopniach) okreĞlający liniĊ koĔcową,
kolor — okreĞlenie koloru,
styl — styl wypeánienia.
Pierwsza z nich rysuje sam áuk, druga wycinek elipsy zgodnie ze stylem przekazanym
w argumencie styl. Argument ten skáada siĊ z nastĊpujących staáych, które moĪna áą-
czyü przez sumĊ bitową (operator |):
IMG_ARC_PIE — wycinek, którego koĔce są poáączone áukiem, standardowo
wypeániony zadanym kolorem.
IMG_ARC_CHORD — wycinek, którego koĔce poáączone są linią prostą,
standardowo wypeániony zadanym kolorem.
IMG_ARC_NOFILL — wycinek nie bĊdzie wypeániany kolorem.
IMG_ARC_EDGED — w poáączeniu z IMG_ARC_NOFILL powoduje, Īe zostanie
wykreĞlony peány kontur wycinka.
Opcje IMG_ARC_PIE i IMG_ARC_CHORD wzajemnie siĊ wykluczają, czyli nie mogą byü uĪy-
te jednoczeĞnie. Wygenerowanie obrazu widocznego na rysunku 6.4 osiągniemy zatem,
stosując kod zaprezentowany na listingu 6.8.
Rysunek 6.4.
Wykorzystanie
róĪnych opcji funkcji
imagefilledarc
Listing 6.8. RóĪne sposoby rysowania wycinków elips
?php
$img = imagecreatetruecolor(400, 200);
$bialy = imagecolorallocate($img, 255, 255, 255);
$czerwony = imagecolorallocate($img, 255, 0, 0);
$niebieski = imagecolorallocate($img, 0, 0, 255);
imagefill($img, 0, 0, $bialy);
imagearc($img, 110, 100, 80, 80, 0, 90, $czerwony);
imagearc($img, 90, 100, 80, 80, 90, 180, $czerwony);
imagearc($img, 90, 90, 80, 80, 180, 270, $czerwony);
imagearc($img, 110, 90, 80, 80, 270, 360, $czerwony);
334
PHP5. Praktyczny kurs
imagefilledarc($img, 310, 100, 80, 80, 0, 90, $niebieski, IMG_ARC_PIE);
imagefilledarc($img, 290, 100, 80, 80, 90, 180, $niebieski, IMG_ARC_CHORD);
imagefilledarc($img, 290, 90, 80, 80, 180, 270, $niebieski, IMG_ARC_NOFILL);
imagefilledarc($img, 310, 90, 80, 80, 270, 360, $niebieski, IMG_ARC_NOFILL |
IMG_ARC_EDGED);
imagejpeg($img, obraz1.jpg );
imagedestroy($img);
?
Przetwarzanie obrazów
Nakäadanie filtrów
WĞród funkcji przetwarzających obrazy znajduje siĊ imagefilter, która nakáada na nie
jeden z dostĊpnych filtrów. Jej wywoáanie ma postaü:
imagefilter($obraz, filtr[, arg1[, arg2[, arg3]]])
Argument $obraz okreĞla obraz poddawany zmianie, filtr — rodzaj filtra (dostĊpne
wartoĞci zostaáy podane w tabeli 6.3), natomiast arg1, arg2, arg3 i arg4 to parametry
niezbĊdne do dziaáania niektórych filtrów. Funkcja zwraca wartoĞü true, jeĞli jej dzia-
áanie zakoĔczyáo siĊ sukcesem, lub false w przeciwnym razie.
Tabela 6.3. Filtry dostĊpne dla funkcji imagefilter
Nazwa filtra
IMG_FILTER_NEGATE
IMG_FILTER_GRAYSCALE
IMG_FILTER_BRIGHTNESS
IMG_FILTER_CONTRAST
IMG_FILTER_COLORIZE
IMG_FILTER_EDGEDETECT
IMG_FILTER_EMBOSS
IMG_FILTER_GAUSSIAN_BLUR
IMG_FILTER_SELECTIVE_BLUR
IMG_FILTER_MEAN_REMOVAL
IMG_FILTER_SMOOTH
IMG_FILTER_PIXELATE
Opis
Inwersja kolorów.
Konwersja obrazu do odcieni szaroĞci.
Zmiana poziomu jasnoĞci obrazu. Do jego ustalenia naleĪy
wykorzystaü argument arg1.
Zmiana kontrastu obrazu. Do ustalenia kontrastu naleĪy wykorzystaü
argument arg1.
Dziaáanie podobne do IMG_FILTER_GRAYSCALE z tą róĪnicą, Īe istnieje
moĪliwoĞü ustalenia koloru bazowego. Kolor ten naleĪy podaü
w formacie RGB, gdzie R to wartoĞü arg1, G — wartoĞü arg2,
B — wartoĞü arg3, a kanaá alfa (przezroczystoĞü) — arg4 (dostĊpny
od PHP 5.2.5).
Uwypuklenie krawĊdzi w obrazie.
Wytáoczenie obrazu.
Rozmycie obrazu metodą Gaussa.
Rozmycie obrazu.
Uwypuklenie krawĊdzi.
Wygáadzenie (zmiĊkczenie, rozmycie) obrazu. Parametr arg1 pozwala
na okreĞlenie poziomu intensywnoĞci efektu.
Pikselizacja obrazu. Argument arg1 okreĞla rozmiar bloku, natomiast
arg2 ustawiony na true (domyĞlnie false) wáącza przetwarzanie
zaawansowane (wiĊksze wygáadzenie obrazu wynikowego).
Rozdziaä 6. i Grafika i obrazy
335
MoĪna zatem napisaü przykáadowy skrypt, który podczas wywoáywania w wierszu po-
leceĔ bĊdzie otrzymywaá nazwĊ pliku graficznego w formacie JPG oraz wartoĞü caá-
kowitą, a takĪe wykona zmianĊ poziomu kontrastu tego pliku. Dziaáający w ten sposób
kod zostaá zaprezentowany na listingu 6.9.
Listing 6.9. Zmiana poziomu kontrastu
?php
if($argc 3){
exit( Wywođanie skryptu: php konwertuj.php nazwa_pliku poziom_kontrastu\n );
}
if(!$img = imagecreatefromjpeg($argv[1])){
exit( Nie udađo siú wczytaè pliku {$argv[1]}.\n );
}
if(!is_numeric($argv[2])){
exit( Poziom kontrastu musi byè liczbæ cađkowitæ!\n );
}
if(!imagefilter($img, IMG_FILTER_CONTRAST, $argv[2])){
exit( Nie udađo siú zmieniè poziomu kontrastu w pliku {$argv[1]}. );
}
if(!imagejpeg($img, $argv[1])){
exit( Wystæpiđ bđæd podczas zapisu pliku {$argv[1]}. );
}
echo Operacja zmiany kontrastu zakoēczona sukcesem! ;
imagedestroy($img);
?
Skalowanie
W celu przeskalowania obrazu do zadanych rozmiarów moĪna uĪyü funkcji imageco-
pyresized lub imagecopyresampled. W rzeczywistoĞci pobierają one okreĞlony para-
metrami wycinek z obrazu Ĩródáowego i wstawiają go w miejsce obrazu docelowego
(równieĪ okreĞlone parametrami). JeĞli wyznaczone obszary obrazu Ĩródáowego i do-
celowego nie bĊdą takie same, nastąpi odpowiednie przeskalowanie. RóĪnica pomiĊdzy
imagecopyresized a imagecopyresampled jest taka, Īe druga z nich podczas skalowa-
nia dokonuje interpolacji pikseli, dziĊki czemu uzyskuje siĊ dokáadniejszy efekt. Obie
funkcje przyjmują identyczne zestawy argumentów, a ich wywoáania mają postaü:
imagecopyresized($obraz_docelowy, $obraz_ļródđowy, xd, yd, xs, ys, wd, hd, ws, hs);
imagecopyresampled($obraz_docelowy, $obraz_ļródđowy, xd, yd, xs, ys, wd, hd, ws, hs);
gdzie:
$obraz_docelowy — okreĞla obraz docelowy,
$obraz_ļródđowy — okreĞla obraz Ĩródáowy,
xd — wspóárzĊdna x lewego górnego rogu kopiowanego obszaru w obrazie
docelowym,
336
PHP5. Praktyczny kurs
yd — wspóárzĊdna y lewego górnego rogu kopiowanego obszaru w obrazie
docelowym,
xs — wspóárzĊdna x lewego górnego rogu kopiowanego obszaru w obrazie
Ĩródáowym,
ys — wspóárzĊdna y lewego górnego rogu kopiowanego obszaru w obrazie
Ĩródáowym,
wd — szerokoĞü kopiowanego obszaru w obrazie docelowym,
hd — wysokoĞü
Pobierz darmowy fragment (pdf)