PHP - 21. díl – začínáme s obrázky

PHP dokáže vytvářet, měnit a provádět nejrůznější akce s obrázky, což se může v mnoha případech hodit. Ať už pro vytváření grafů, změnu velikostí obrázků či další použití. Podíváme se, jak na to.

Možnost práce s obrázky není v PHP automatická, ale opírá se o takzvanou GD knihovnu, kterou je většinou nutné připojit jako externí modul. Pokud nemáte podporu GD knihovny, pak ani PHP s obrázky pracovat nedokáže. Pokud zkoušíte na intranetovém serveru ze 2. dílu, pak podpora GD knihovny je už automaticky zahrnuta.

Nejdříve bude tedy vhodné vůbec zjistit, zda PHP, na kterém zkoušíte, vůbec umí pracovat s obrázky. Nejjednodušeji to lze zjištěním konfigurace pomocí už nám známého jednoduchého skriptu:

<?php phpinfo(); ?>

Pokud se ve výpisu konfigurace objeví tabulka nadepsaná gd, potom PHP má podporu obrázků. V tabulce pod nápisem gd pak můžete zjistit detaily ohledně podpory obrázků.

S jakými formáty obrázků dokáže pracovat PHP? Pokud máte obvyklou GD knihovnu verze 2, pak bezproblémové jsou zejména formáty obrázků JPEG a PNG. Celkem běžný formát obrázku GIF je bohužel problematický, protože od jeho podpory se kdysi upustilo z důvodů licenčních potíží.

Zjištění informací o souboru s obrázkem

Pro zjištění informací o souboru s obrázkem existuje funkce getimagesize, která zjistí formát obrázku a jeho velikost. Připravte si proto nějaký obrázek, třeba ve formátu JPEG, přejmenujte ho na soubor obr1.jpg, nahrajte ho do stejného adresáře, jako následující PHP skript, a zkusme si zjistit, jakou má obrázek velikost:

<html>
<head>
<title>Příklad 1. z 21. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  $informace = getimagesize(`obr1.jpg`);
  echo `Šířka obrázku je `,$informace[0],` pixelů.<br>`;
  echo `Výška obrázku je `,$informace[1],` pixelů.<br>`;
  echo `Formát obrázku je číslo `,$informace[2],`.`;
?>
</body>
</html>

Pokud si výše uvedený příklad spustíte, zjistíte šířku a výšku obrázku a také číslo formátu (mělo by být 2). Číslo formátu určuje, o jaký formát se jedná, a může vám posloužit, pokud potřebujete nutně znát, o jaký formát jde. Co které číslo formátu znamená se dozvíte v následující tabulce:

Číslo Formát obrázku
1 GIF
2 JPEG
3 PNG
4 SWF
5 PSD
6 BMP
7 TIFF(intel byte order)
8 TIFF(motorola byte order)
9 JPC
10 JP2
11 JPX
12 JB2
13 SWC
14 IFF
15 WBMP
16 XBM

Funkce getimagesize vrací pole, kde index s číslem nula obsahuje šířku obrázku v pixelech, index s číslem jedna výšku obrázku v pixelech a index s číslem dva vrací číslo formátu. Tak je to ostatně vidět i v příkladu.

Samotná funkce getimagesize, kterou jsme použili pro určení vlastností obrázků, má jedno výjimečné postavení. Nepotřebuje GD knihovnu, a proto výše uvedený příklad bude pracovat naprosto všude i tam, kde GD knihovna není k dispozici. Protože funkce getimagesize nemá ani omezení GD knihovny, dokáže pracovat se spoustou formátů.

Jak se pracuje s funkcemi obrázkové knihovny?

Skoro všechny funkce, které se starají o vytváření nebo úpravu obrázků, začínají v názvu slovem image. Teď popíšu, jaká je filozofie práce při editaci obrázků.

Každý obrázek, se kterým se pracuje, je reprezentován speciálním obrázkovým identifikátorem. Každý obrázek jednoduše existuje jako jedna proměnná, která je v manuálu nazývána obrázkový identifikátor. A veškeré akce se dějí právě s touto proměnnou.

Každý obrázek, s nímž chceme pracovat, zpracováváme tak, že nejdříve z něj vytvoříme obrázkový identifikátor. To znamená, že obrázek nahrajeme buď ze souboru, nebo vytvoříme prázdný.

Zde je jednoduchý příklad práce s obrázkem v PHP. Přiznám se, že teď trochu předbíhám pro ilustraci, jak pracovat s obrázky, a proto je příklad trochu komplexnější:

<html>
<head>
<title>Příklad 2. z 21. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  echo `Vytvářím červený banner`;
  $obrazek = imagecreatetruecolor(468,60);
  $cervena_barva = imagecolorallocate($obrazek,255,0,0);
  imagefill($obrazek,0,0,$cervena_barva);
  imagepng($obrazek,`obr2.png`);
  imagedestroy($obrazek);
?>
</body>
</html>

Pokud si příklad spustíte, zjistíte, že v adresáři, kde je umístěný skript, vám vznikl obrázek v souboru s názvem obr2.png. Obrázek obsahuje banner o velikosti 468 x 80 pixelů a je vybarven červenou barvou. Na příkladu chci hlavně ukázat, jaký je základní princip práce s obrázkem v PHP:

  • Vytvořím obrázek, ať už prázdný, nebo ze souboru, a obdržím proměnnou typu obrázek (obrázkový identifikátor). V našem příkladu je to proměnná s názvem $obrazek.
  • Pracuji s obrázkem pomocí proměnné typu obrázek (obrázkového identifikátoru) a postupně na obrázek pouštím veškeré editační akce, které chci s obrázkem provést.
  • Použiji výsledný obrázek.
  • Zruším obrázkový identifikátor pomocí funkce imagedestroy. Pokud jej zapomenu zrušit, udělá to PHP skript sám automaticky na konci skriptu.

Výše uvedené 4 body v zásadě platí pro každou práci s obrázkem, ať provádíme cokoli.

Jak vytvořit proměnnou typu obrázek?

Před jakoukoli prací je potřeba vytvořit proměnnou typu obrázek. Toho je možné docílit několika způsoby, které lze rozdělit v zásadě na vytvoření nového prázdného obrázku nebo nahrátí obrázku ze souboru.

Pro tvorbu prázdného obrázku máme k dispozici dvě funkce: funkci imagecreatetruecolor a imagecreate. Rozdíl mezi nimi je malý, osobně doporučuji používat tu první z nich. Při pokusech s funkcí imagecreate se mi totiž pravidelně stávalo, že nezvládla pracovat s více než 256 barvami. Pokud obrázek obsahoval více barev, funkce imagecreate tyto barvy poničila. Proto doporučuji používat imagecreatetruecolor. Tato funkce vytvoří prázdný obrázek o zadané šířce a výšce:

imagecreatetruecolor (šířka, výška)

Funkce vrátí proměnnou typu obrázek (obrázkový identifikátor), kterou je možné potom použít pro další akce s obrázkem.

Kromě toho existují i jiné funkce, jak vytvořit proměnnou typu obrázek, a to nahrátím ze souboru. Zde se musí použít ta správná funkce podle typu obrázku. Pokud máte obrázek typu JPEG, pak se použije funkce imagecreatefromjpeg. Pokud máte obrázek typu PNG, pak se musí použít funkce imagecreatefrompng. Obě funkce očekávají jako parametr jméno souboru a vracejí proměnnou typu obrázek:

imagecreatefromjpeg (jméno_souboru)

imagecreatefrompng (jméno_souboru)

Jak použít proměnnou typu obrázek?

Pokud už máme obrázek v proměnné typu obrázek, můžeme provádět libovolné akce s obrázkem. Výsledkem by ale mělo být, že by se obrázek měl k něčemu použít. A to něco je buď uložení do souboru, nebo poslání někam.

Uložení obrázku do souboru je velice jednoduché. Pokud chci uložit obrázek jako typ PNG, potom použiji funkci imagepng. Funkce může mít buď jeden, nebo dva parametry:

imagepng (proměnná_typu_obrázek, jméno_souboru)

Pokud chybí druhý parametr u funkce imagepng, tedy chybí jméno souboru, potom se výsledný obrázek vypíše na standardní výstup, přímo jako součást výsledného HTML. Jak toho využít si řekneme později, zatím budeme vždy uvádět jméno souboru.

Pokud chci uložit obrázek ve formátu JPEG, musím použít funkci imagejpeg. Funkce může mít jeden, dva nebo tři parametry.

imagejpeg (proměnná_typu_obrázek, jméno_souboru, kvalita)

Třetí parametr kvalita je číslo od nuly do sta, přičemž nula znamená nejhorší kvalita, ale také nejmenší velikost souboru. Stovka znamená největší kvalita, ale také největší soubor. Pokud se třetí parametr kvalita nepoužije, potom se automaticky dosadí číslo 75.

Druhý parametr jméno_souboru je jméno souboru, pod kterým bude obrázek uložen. Pokud druhý parametr chybí, výsledný obrázek se vypíše na standardní výstup, tedy jako součást výsledného HTML.

Jednoduchý příklad na převod formátů

Teď už známe dost na to, abychom mohli uvést jednoduchý příklad na převod formátů obrázků. Připravte si nějaký pokusný JPEG obrázek v souboru obr1.jpg a dejte ho do stejného adresáře jako následující PHP skript:

<html>
<head>
<title>Příklad 3. z 21. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  echo `Převod z formátu JPEG do PNG.`;
  $obrazek = imagecreatefromjpeg(`obr1.jpg`);
  imagepng($obrazek,`obr1.png`);
  imagedestroy($obrazek);
?>
</body>
</html>

Po spuštění příkladu se obrázek převede do formátu PNG. Ve stejném adresáři jako je PHP skript se vám objeví i soubor s obrázkem obr1.png.

Jak to celé funguje? Jednoduše. Nejdříve se pomocí funkce imagecreatefromjpeg natáhne obrázek ve formátu JPEG. Pokud je obrázek již natáhnutý do proměnné typu obrázek, potom nic nebrání uložit jej v jakémkoli formátu požadujeme. Proto na dalším řádku využiji funkce imagepng k uložení obrázku ve formátu PNG. A nakonec uvolním proměnnou typu obrázek pomocí imagedestroy, protože ji už nepotřebuji.

Diskuze (11) Další článek: nVidia nabídne technologii SLI pro rychlejší hraní

Témata článku: Software, Windows, Programování, PHP, Obrázek, HTML, Order, Jednoduchý typ, Stejná kvalita, Head, Největší potíž, Funkce, Echo, Největší soubor, Stejné parametry, Šířka, Externí modul, Díl, Výsledné dílo


Určitě si přečtěte

Co přijde po Netflixu a Amazonu? Tohle jsou streamovací služby, na které v Česku čekáme

Co přijde po Netflixu a Amazonu? Tohle jsou streamovací služby, na které v Česku čekáme

** Rozhodujete se mezi Netflixem a HBO Go? Věřte, bude hůř ** Na trhu je mnohem víc ambicióznějších streamovacích služeb ** Některé by mohly do ČR zamířit ještě letos

Lukáš Václavík | 45

Velký test televizorů v Computeru: i levnější značky překvapily kvalitou obrazu

Velký test televizorů v Computeru: i levnější značky překvapily kvalitou obrazu

** Jak funguje biometrické zabezpečení ve Windows ** Nejlepší správci hesel ** Létáme v Microsoft Flight Simulator

Časopis Computer | 5

Šmírování kamerami Googlu: Koukněte, co šíleného se objevilo na Street View

Šmírování kamerami Googlu: Koukněte, co šíleného se objevilo na Street View

Google stále fotí celý svět do své služby Street View. A novodobou zábavou je hledat v mapách Googlu vtipné záběry. Podívejte se na výběr nejlepších!

redakce | 4


Aktuální číslo časopisu Computer

Megatest mobilů do 8 000 Kč

Test bezdrátových headsetů

Linux i pro začátečníky

Jak surfovat anonymně