czwartek, 28 maja 2015

[PHP][GD2] Manipulacje obrazami

TRUE
6962189171884698785
Dzięki bibliotece GD możemy manipulować dowolnymi obrazami zapisanymi w formatach JPEG, PNG, GIF i BMP. Możemy dokonywać na nich operacji takich samych jakie robiliśmy w poprzednich artykułach, a więc rysować po nich, pisać, a także łączyć je, skalować, obracać i wiele innych rzeczy. W artykule tym nauczymy się wczytywania obrazków z plików, manipulacji na nich, takich jak skalowanie, czy dodawanie do nich innej grafiki, a także zapisywania wygenerowanych i zmodyfikowanych obrazów do pliku.

Warto dokładnie zapoznać się choćby z podstawowymi funkcjami służącymi do manipulacji grafiką, tak aby móc następnie wykorzystywać to w praktyce, np. podczas generowania, czy tworzenia miniaturek dla zdjęć, bądź dodawania znaków wodnych do zdjęć. Zastosowań jest multum, zatem zaczynamy.

Na początek nauczymy się wczytywać grafikę z pliku. Jak wspomniałem na początku - mamy tutaj zaimplementowaną obsługę kilku formatów plików. Praca z nimi niczym się od siebie nie różni, używamy do tego jedynie odpowiednio innych funkcji.

Wczytanie obrazka z pliku - imagecreatefrom()

W poprzednich atykułach na samym początku tworzyliśmy uchwyt do pustego obrazka i dopiero potem na nim pracowaliśmy, rysując figury jak prostokąty, czy elipsy. Teraz zamiast tworzyć pusty obrazek, wczytamy go z pliku JPG.

Do wczytania obrazka z pliku służy kilka funkcji, w zależności od tego jaki format chcemy wczytać. I tak, np.
[code]
imagecreatefromjpeg($nazwa_pliku) //wczytuje obrazek z pliku JPG
imagecreatefrompng($nazwa_pliku) //wczytuje obrazek z pliku PNG
imagecreatefromgif($nazwa_pliku)  //wczytuje obrazek z pliku GIF
imagecreatefrombmp($nazwa_pliku)  //wczytuje obrazek z pliku BMP
[/code]

Na początek naszej pracy pobierzmy sobie dwa poniższe zdjęcia do testów i zapiszmy sobie je w folderze, w którym pisać będziemy nasz kod. Żeby nam się przyjemnie pracowało, to na obu mamy 2 piękne panie :)


oraz





Gdy mamy oba zdjęcia zapisane w naszym folderze, wczytajmy pierwsze zdjęcie do naszego kodu:
[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');
?>
[/code]
Tym sposobem wczytane zdjęcie znajduje się teraz w naszym uchwycie (w poprzednich artykułach mieliśmy tutaj pusty obrazek). Możemy to sprawdzić. Jak widzimy zdjęcie jest w formacie JPG, wyświetlmy je zatem jako PNG:
[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');
// wczytujemy zdjęcie do uchwytu

header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($image);
// generujemy obrazek PNG

imagedestroy($image);
// zwalniamy uchwyt do obrazka
?>
[/code]
Jak widać, dokonaliśmy nieświadomie pierwszej manipulacji, mianowicie konwersji z formatu JPG na format PNG.

Skalowanie obrazu - imagecopyresized() 

Do przeskalowania gotowego obrazka służy funkcja:
[code]imagecopyresized($new_image, $source_image, $new_x, $new_y, $source_x, $source_y, $new_width, $new_height, $source_width, $source_height);[/code]

Jak widać składnia jest dość długa, ale powoli wytłumaczymy sobie wszystko.
Funkcja ta powoduje skopiowanie jednego obrazka do drugiego (jak widzimy będziemy musieli tutaj utworzyć drugi uchwyt do nowego obrazka) pobierając za parametry informacje takie jak wielkość obrazka źródłowego oraz wielkość jaką chcemy uzyskać.

Wyjaśnijmy sobie może najpierw wszystkie argumenty funkcji po koleji:

  • $new_image - uchwyt do nowo tworzonego obrazu
  • $source_image -  uchwyt do obrazu źródłowego (nasza Angelina)
  • $new_x -  współrzędna X od której zaczniemy nowy obrazek
  • $new_y -  współrzędna Y od której zaczniemy nowy obrazek
  • $source_x -  współrzędna X od której kopiujemy stary obrazek
  • $source_y - współrzędna Y od której kopiujemy stary obrazek
  • $new_width -  szerokosć nowego obrazka
  • $new_height -  wysokość nowego obrazka
  • $source_width - szerokosć obrazka źródłowego
  • $source_height - wysokość obrazka źródłowego

Wyjaśnienia tutaj wymagają wymagane współrzędne X i Y.
Na czym to polega? Otóż kopiowanie starego obrazka może odbyć się od zadanego miejsca. Podając tutaj (x=0, y=0) rozpoczniemy kopiowanie obrazu źródłowego od jego początku, podając jednak np. x=200, y=200 rozpoczniemy właśnie od tego miejsca.

Rozmiar źródłowego obrazu możemy w każdej chwili pobrać za pomocą funkcji:
[code]$width = imagesx($image) // szerokość[/code]
oraz
[code]$height = imagesy($image) // wysokosć[/code]

Zobaczmy działanie na przykładzie, najpierw skopiujmy całość nie zmieniając żadnych rozmiarów i zostawiając wszystkie parametry na domyślne. Rozdzielczość zdjęcia z Angeliną to: 760x360px.
[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');
// wczytujemy zdjęcie do uchwytu

$image_width = imagesx($image);
$image_height = imagesy($image);
// pobieramy rozmiar oryginalnego obrazu

$new_width = 760;
$new_height = 360;
// definiujemy rozmiar dla nowego obrazu

$new_image = imagecreatetruecolor($new_width, $new_height);
// tworzymy uchwyt dla nowego obrazu

imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height);
// kopiujemy, narazie bez zmiany parametrów

header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($new_image);
// generujemy obrazek PNG

imagedestroy($new_image);
imagedestroy($image);
// zwalniamy uchwyty do obrazków
?>
[/code]

Wynkiem jest to, że oba zdjęcia (źródłowe i docelowe) niczym się nie różnią:



A teraz zmieńmy punkt początkowy (na obrazie docelowym), od którego będziemy nakładać skopiowany z pliku źródłowego obrazek, czyli $new_x i $new_y i zobaczmy co się stanie.
Rozpoczynamy kopiowanie od punktu x=0, y=0, ale nanosimy kopię od punktu x=200, y=120 na nowym zdjęciu:
[code]imagecopyresized($new_image, $image, 200, 150, 0, 0, $new_width, $new_height, $image_width, $image_height);[/code]
Wynik:



Teraz zmieńmy punkt początkowy, od którego kopiować będziemy obrazek źródłowy.
[code]imagecopyresized($new_image, $image, 0, 0, 200, 120, $new_width, $new_height, $image_width, $image_height);[/code]




I w ostatnim przykładzie zmieńmy zarówno jedno jak i drugie:
Rozpoczynamy kopiowanie od punktu x=200, y=120 i nanosimy kopię od punktu x=100, y=150 na nowym zdjęciu:
[code]imagecopyresized($new_image, $image, 100, 150, 200, 120, $new_width, $new_height, $image_width, $image_height);[/code]



Jak widać, zmiana punktu początkowego zarówno w jednym jak i drugim zdjęciu przynosi różne efekty. Sprawdźmy teraz co się stanie podczas skalowania zdjęcia. Standardowo na początek pozostawmy wszystkie punkty początkowe w miejscach (0,0) ale teraz zmieńmy rozdzielczość obrazu wynikowego, np. na 380x180 czyli o połowę:
[code]imagecopyresized($new_image, $image, 0, 0, 0, 0, 380, 180, $image_width, $image_height);[/code]
Wynikiem jest:



Jak widać Angelina zmniejszyła nam się o połowę, ale rozmiar obrazu to wciąż 760x360px, dlaczego? Stało się tak z prostego powodu - na samym początku zadeklarowaliśmy taką właśnie wielkość dla nowego obrazu:
[code]$new_width = 760;
$new_height = 360;
$new_image = imagecreatetruecolor($new_width, $new_height);
[/code]

Natomiast w funkcji imagecopyresized parametry te wpisaliśmy ręcznie, w związku z czym obrazek zeskalował się poprawnie, ale jego bazowa wielkość pozostała bez zmian.
Zmieńmy to więc na 380x180 i zobaczmy co sie stanie:
[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');
// wczytujemy zdjęcie do uchwytu

$image_width = imagesx($image);
$image_height = imagesy($image);
// pobieramy rozmiar oryginalnego obrazu

$new_width = 380;
$new_height = 180;
// definiujemy rozmiar dla nowego obrazu

$new_image = imagecreatetruecolor($new_width, $new_height);
// tworzymy uchwyt dla nowego obrazu

imagecopyresized($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height);
// kopiujemy, skalujemy

header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($new_image);
// generujemy obrazek PNG

imagedestroy($new_image);
imagedestroy($image);
// zwalniamy uchwyty do obrazków
?>
[/code]



Jak widzimy - teraz dopiero zdjęcie zmniejszyło się o połowę do rozmiaru 380x180px.
Należy zawsze o tym pamiętać - rozmiar wynikowego obrazka będzie zawsze rozmiaru zadeklarowanego podczas tworzenia uchwytu do niego!

Spróbójmy teraz czegoś innego - spróbujmy powiększyć wybrany fragment zdjęcia. Jak tego dokonać? Załóżmy, że rozmiar zdjęcia wynikowego ma być taki sam jak zdjęcia oryginalnego, ale ma się w nim znaleźć powiększony fragment oryginału. Po pierwsze całą operację musimy zacząć od zadanego miejsca na obrazku źródłowym ustawiając startowe współrzędne X i Y.

Po drugie - szerokość i wysokość zdjęcia podawana w funkcji imagecopyresized musi być odpowiednio większa i po trzecie - na zdjęciu wynikowym nakładamy skopiowanie zdjęcie od punktu (0, 0). Zobaczmy jak to zadziała w praktyce. Spróbujmy powiększyć oczy, czyli obszar mniej więcej od x=220, y=110. Powiększymy wszystko o 400% - wartość o ile razy powiększamy obraz określimy sobie w zmiennych $zoom_x i $zoom_y.

[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');
// wczytujemy zdjęcie do uchwytu

$image_width = imagesx($image);
$image_height = imagesy($image);
// pobieramy rozmiar oryginalnego obrazu

$zoom_x = 4;
$zoom_y = 4;
// o ile razy powiększamy zdjęcie

$new_width = $image_width * $zoom_x;
$new_height = $image_height * $zoom_y;
// definiujemy rozmiar dla nowego obrazu

$new_image = imagecreatetruecolor(760, 360);
// tworzymy uchwyt dla nowego obrazu, pozostawiamy rozmiar oryginału

imagecopyresized($new_image, $image, 0, 0, 220, 110, $new_width, $new_height, $image_width, $image_height);
// kopiujemy, powiększamy

header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($new_image);
// generujemy obrazek PNG

imagedestroy($new_image);
imagedestroy($image);
// zwalniamy uchwyty do obrazków
?>
[/code]

Wynik:



Kopiowanie z resamplingiem - imagecopyresampled()

Identycznie do funkcji imagecopyresized() działa bliźniacza funkcja:
[code]imagecopyresampled()[/code]
Z tą jednak różnicą, iż w przypadku tej drugiej wartości pixeli są interpolowane, co może poprawić nieznacznie jakość wynikowego obrazu.
Składnia tej funkcji jest identyczna jak funkcji imagecopyresized().

Zwykłe kopiowanie - imagecopy()

Istnieje też zwykła funkcja imagecopy(), która różni się tym, że - jak sama nazwa wskazuje - nie dokonuje przekształceń na rozmiarze, lecz jedynie kopiuje jeden obraz na drugi. Składnia jest podobna, nie występuje w niej jedynie podawanie argumentów dotyczących rozmiaru obrazu docelowego:

[code]imagecopy($new_image, $source_image, $new_x, $new_y, $source_x, $source_y,  $source_width, $source_height);[/code]

Rotacja zdjęcia - imagerotate()

Do obracania obrazu o zadany kąt służy funkcja:
[code]$new_image = imagerotate($image, $angle, $bg_color)[/code]
gdzie:

  • $image - uchwyt do obrazka
  • $angle - kąt o jaki obracamy
  • $bg_color - kolor tła

Powróćmy zatem do pierwotnej wersji naszej Angeliny i spróbujmy obrócić ją o kąt 90 stopni:
[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');

$new_image = imagerotate($image, 90, 0);
// obracamy Angelinę o 90 stopni w lewo

header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($new_image);
// generujemy obrazek PNG
imagedestroy($new_image);
imagedestroy($image);
// zwalniamy uchwyty
?>
[/code]
Wynik:



Uwaga - obracanie działa przeciwnie do ruchu wskazówek zegara, czyli w lewo, aby obrócić w prawo - podajemy minusową wartość kąta.

Rysowanie po obrazie

Tak samo jak w przypadku obrazu utworzonego za pomocą funkcji imagecreatetruecolor() tak i w przypadku wczytanego pliku graficznego mamy do dyspozycji wszystkie związane z generowaniem grafiki funkcje. Żeby zobaczyć jak sprawdza się to w połączeniu z gotowym zdjęciem narysujmy naszej Angelinie okulary. Zrobimy to za pomocą funkcji rysującej elipsę, czyli:
[code]imagefilledellipse()[/code]
rysując dwie elipsy koloru czarnego, o średnicy 70px, następnie dodając wygenerowany tekstowy podpis na samym dole zdjęcia (koloru białego).
Punkty centralne dla elips umieścimy odpowiednio w miejscach:

  • Elipsa 1: $cx1 = 290, $cxy = 160;
  • Elipsa 2: $cx2 = 390, $cy2 = 160;

Dodamy też dwie linie o następujących współrzędnych:

  • Linia 1: x1=325, y1=160, x2=355, y2=160
  • Linia 2: x1=425, y1=160, x2=460, y2=170

[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');
// wczytujemy zdjęcie do uchwytu

$black = imagecolorallocatealpha($image, 0, 0, 0, 20);
// zdefiniowaliśmy kolor czarny

$white = imagecolorallocate($image, 255, 255, 255);
// zdefiniowaliśmy kolor biały

imagefilledellipse($image, 290, 160, 70, 70, $black);
// rusujemy prawy okular

imagefilledellipse($image, 390, 160, 70, 70, $black);
// rysujemy lewy okular

imageline($image, 325, 160, 355, 160, $black);
// rysujemy linię pomiędzy okularami

imageline($image, 425, 160, 460, 170, $black);
// rysujemy linię od lewego okulara do lewego ucha

imagestring($image, 5, 25,340, "photoshoped by GD2 :)", $white);

header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($image);
// generujemy obrazek PNG


imagedestroy($image);
// zwalniamy uchwyty do obrazków
?>
[/code]
Oto wynik ;)



Wszystko poza samą Angeliną zostało tutaj wygenerowane za pomocą PHP.

Filtry - imagefilter()

Posłużymy się teraz naszym drugim zdjęciem i zobaczymy co oferują filtry w GD2.
Dzięki filtrom zaaplikować możemy do zdjęcia kilka standardowych efektów, takich jak utworzenie z niego negatywu, czy desaturacja. Przyjrzyjmy się po krótce wszystkim dostępnym możliwościom, ale najpierw wczytajmy oryginalne zdjęcie:
[code]
<?php
$image = imagecreatefromjpeg('monica.jpg');
// wczytujemy zdjęcie do uchwytu

header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($image);
// generujemy obrazek PNG

imagedestroy($image);
// zwalniamy uchwyty do obrazków
?>
[/code]



Filtry nakładamy za pomocą funkcji:
[code]imagefilter($image, $filter, $arg1, $arg2, $arg3, $arg4)[/code]
gdzie

  • $image - uchwyt do obrazka
  • $filter - rodzaj filtra
  • $arg1$arg2,$arg3,$arg4 - argumenty dla odpowiednich filtrów,

pełny opis tutaj: http://php.net/manual/en/function.imagefilter.php

Na chwilę obecną dostępne mamy następujące rodzaje filtrów:

  • IMG_FILTER_NEGATE  - tworzy negatyw z obrazu
  • IMG_FILTER_GRAYSCALE - konwertuje obraz na odcienie szarości
  • IMG_FILTER_BRIGHTNESS - Zmienia jasność obrazu (definiowana w $arg1)
  • IMG_FILTER_CONTRAST - zmienia kontrast obrazu (definiowany w $arg1)
  • IMG_FILTER_COLORIZE - kolorozyje obraz, wartości RGB podajemy odpowiednio w $arg1, $arg2, $arg3
  • IMG_FILTER_EDGEDETECT - uwypukla krawędzie
  • IMG_FILTER_EMBOSS - dodaje filtr embros, który "uwypukla" obraz
  • IMG_FILTER_GAUSSIAN_BLUR - dodaje rozmycie metodą Gaussa
  • IMG_FILTER_SELECTIVE_BLUR - rozmywa obraz
  • IMG_FILTER_MEAN_REMOVAL - tworzy coś w rodzaju szkicu
  • IMG_FILTER_SMOOTH - wygładza obraz, wartość wygładzenia podajemy w $arg1
  • IMG_FILTER_PIXELATE - dodaje pixelizację, wartości podajemy w $arg1 i $arg2


Przyjrzyjmy się pierwszemu filtrowi, czyli zróbmy sobie negatyw:
[code]
<?php
$image = imagecreatefromjpeg('monica.jpg');
// wczytujemy zdjęcie do uchwytu

imagefilter($image, IMG_FILTER_NEGATE);
// aplikujemy filtr

header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($image);
// generujemy obrazek PNG

imagedestroy($image);
// zwalniamy uchwyt do obrazu
?>
[/code]
Wynik:



I kolejne filtry:

[code]imagefilter($image, IMG_FILTER_GRAYSCALE);[/code]



[code]imagefilter($image, IMG_FILTER_BRIGHTNESS, 130);[/code]



[code]imagefilter($image, IMG_FILTER_BRIGHTNESS, -150);[/code]



[code]imagefilter($image, IMG_FILTER_CONTRAST, -50);[/code]



[code]imagefilter($image, IMG_FILTER_CONTRAST, 50);[/code]



[code]imagefilter($image, IMG_FILTER_COLORIZE, 255, 0, 0);[/code]



[code]imagefilter($image, IMG_FILTER_COLORIZE, 0, 0, 128);[/code]



[code]imagefilter($image, IMG_FILTER_EDGEDETECT);[/code]



[code]imagefilter($image, IMG_FILTER_EMBOSS);[/code]



[code]imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR);[/code]



[code]imagefilter($image, IMG_FILTER_SELECTIVE_BLUR);[/code]



[code]imagefilter($image, IMG_FILTER_MEAN_REMOVAL);[/code]



[code]imagefilter($image, IMG_FILTER_SMOOTH, 8);[/code]



[code]imagefilter($image, IMG_FILTER_PIXELATE, 2, 8);[/code]


Jak widać, biblioteka GD pozwala na całkiem przyzwoite efekty.

Scalanie obrazków - imagemerge()

Pozostała nam do omówienia jeszcze jedna bardzo często wykorzystywana w GD2 kwestia, mianowicie łączenie ze sobą obrazków. Wyobraźmy sobie, że chcemy np. dodać graficzny znak wodny do danego zdjęcia, lub nałożyć jedno zdjęcie na drugie. Jak tego dokonać? Zacznijmy może prostego nałożenia jednego obrazka na drugi. Spróbujemy nałożyć obraz z Monicą Bellucci na obraz z Angeliną Jolie.

Posłuży nam do tego funkcja:
[code]imagecopymerge($image, $image_to_add, $image_x, $image_y, $image_to_add_x, $image_to_add_y, $image_to_add_width, $image_to_add_height, $opacity);[/code]
gdzie:

  • $image - uchwyt do bazowego obrazka (Angelina) - ten obrazek będzie pod spodem
  • $image_to_add -  uchwyt do obrazu który będziemy nakładać (Monica) - ten obrazek nałożymy
  • $image_x -  współrzędna X bazowego obrazka (Angelina) od której nakładany na nią drugi obraz (Monica)
  • $image_y - współrzędna Y bazowego obrazka (Angelina) od której nakładany na nią drugi obraz (Monica)
  • $image_to_add_x -  współrzędna X nakładanego obrazu od której zaczynamy nakładanie  (Monica)
  • $image_to_add_y -  współrzędna Y nakładanego obrazu od której zaczynamy nakładanie  (Monica)
  • $image_to_add_width - szerokosć nakładanego obrazka (Monica)
  • $image_to_add_height - wysokość nakładaneg obrazka (Monica)
  • $opacity - stopień przezroczystości nakładanego obrazka


Najepiej zobaczmy to na przykładzie:
[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');
$image_to_add = imagecreatefromjpeg('monica.jpg');

$image_x = 15;
// współrzędna X bazowego obrazka (Angelina) od której nakładany na nią drugi obraz (Monica)

$image_y = 195;
// współrzędna Y bazowego obrazka (Angelina) od której nakładany na nią drugi obraz (Monica)

$image_to_add_x =  95;
// współrzędna X nakładanego obrazu od której zaczynamy nakładanie  (Monica)

$image_to_add_y = 75;
// współrzędna Y nakładanego obrazu od której zaczynamy nakładanie  (Monica)

$image_to_add_width = 150;
// szerokosć nakładanego obrazka (Monica)

$image_to_add_height = 150;
// wysokość nakładaneg obrazka (Monica)

$opacity = 80;
// stopień przezroczystości nakładanego obrazka

imagecopymerge($image, $image_to_add, $image_x, $image_y, $image_to_add_x, $image_to_add_y, $image_to_add_width, $image_to_add_height, 100);
// nakładamy Monicę na Angelinę


header("Content-type: image/png");
// definiujemy nagłówek z mimetype

imagepng($image);
// generujemy obrazek PNG

imagedestroy($image);
imagedestroy($image_to_add);
// zwalniamy uchwyty do obrazków
?>
[/code]

Przeanalizujmy po koleji:
Nakładać będziemy zdjęcie z Monicą.
Nałożymy część jej zdjęcia, która zaczyna się od współrzędnych:

  • $image_to_add_x = 95px
  • $image_to_add_y = 75px


Obszar nakładany będzie miał rozmiar:

  • $image_to_add_width = 150px
  • $image_to_add_height = 150px






Następnie wybrany obszar nakładać będziemy na zdjęcie Angeliny, począwszy od współrzędnych:

  • $image_x = 15px;
  • $image_y = 195px;



Co w efekcie da nam takie oto zdjęcie:



Dodając trochę więcej przeźroczystości:
[code]$opacity = 80[/code]
otrzymamy natomiast coś w rodzaju znaku wodnego:



Jak widać nie jest to takie trudne.
Została nam jeszcze jedna kwestia:

Zapis obrazu do pliku - imagejpeg(), imagepng(), imagegif(), imagebmp()

Jak do tej pory generowaliśmy obraz bezpośrednio do przeglądarki, zobaczymy teraz w jaki sposób zapisać zdjęcie do pliku, a jest to bardzo proste i ogranicza się do podania jednego dodatkowego parametru, do którejś z poniższych funkcji:
[code]imagepng($image, "nazwa_pliku");[/code]
[code]imagejpeg($image, "nazwa_pliku");[/code]
[code]imagegif($image, "nazwa_pliku");[/code]
[code]imagebmp($image, "nazwa_pliku");[/code]

Podanie jako drugi parametr nazwy pliku spowoduje zapis obrazu do pliku zamiast wyświetlenia go na ekran.
Przetestujmy:
[code]
<?php
$image = imagecreatefromjpeg('angelina.jpg');

if(imagepng($image, "angelina2.png"))
{
  echo 'Image saved to file.';
}
// generujemy i zapisujemy obrazek PNG

imagedestroy($image);
// zwalniamy uchwyt
?>[/code]

Jak widzimy, wszystko to nie jest takie trudne jak może wydawać się na pierwszy rzut okna.
Zachęcam ponownie do eksperymentowania we własnym zakresie.
W następnych artykułach zajmiemy się czcionkami TrueType, pracą nad kolorami i gradientami oraz jeszcze kilkoma ciekawymi rzeczami.

Brak komentarzy:

Prześlij komentarz

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji