Egoblog.cz - Petr Kobelka

Nette a zpracování obrázku - ImageMagick

Dnes vám ukážu skvělý způsob, jak na omezeném webhostingu zpracovat i velké fotografie. I když má vše své omezení.


PHP | Komentáře (0) | Shlédnuto 2236 × | Vloženo: 4. prosince 2014

Co stálo na počátku?

Pro jednoho zákazníka vytvářím menší e-shop. Ten je postaven jako součást webové prezentace a celý běží na Nette. Pro základní layout jsem použil Bootstrap, což zajišťuje výborné zobrazení i na mobilních zařízeních. Celý web pak běží na hostingu jedné společnosti, která má v konfiguraci zapnuto PHP 5.4.

Vše šlo hladce, problém ale nastal v případě, kdy chtěl zákazník nahrát k testovacím produktům fotografii.Hledal jsem, kde mohl nastat problém a zjistil jsem, že se vyčerpá paměť při zpracování obrázku. Ten má z fotoaparátu vlastnosti cca 4300x3200px a vleikost cca 3MB.Základní běh aplikace péři zpracování dat má režii do 10MB, ale při vytvoření velkého náhledu fotky v šířce 1000px si řekne v průměru o 80MB. To je ale opravdu až přespříliš.

Zvažované vartianty úprav obrázků

Poslední uvažovanou možností je naučit zákazníka fotku nejdříve zmenšit a pak ji nahrát na web. Proč ale? Chceme mít aplikaci User Friendly a tím, že jej budeme nutit zmenšovat fotky mimo e-shop mu jen přibude práce.

Ano, jednou z množností bylo, že by šel na vyšší tarif hostingu, kde je již limit paměti dostatečný. Vzhledem k tomu, že ale potřebujeme pouze tuto jednu věc a platit kvůli tomu 2x více je podle mě blbost.

Z dřívějška znám nástroj, který se jmenuje ImageMagick, konkrétně jeho nástroj convert. Uvažoval jsem, že přenesu zátěž zmenšení obrázku z PHP skriptu na operační systém serveru. Pomocí PHP info a oveřením na on-line helpdesku hostingu jsem se ujistil, že je tento nástroj podporován a začal jsem experimentovat, jak celý problém co nejlépe zvládnout.

Výsledné řešení v PHP a v Nette

Celý postup jsem vymyslel následovně

  1. Nahraji celou velkou fotku do temp/ adresáře aplikace
  2. Zde fotku pomocí ImageMagick zmenším
  3. Výsledný obrázek vezmu jako základ pro tvorbu náhledů
  4. odstraním fotku z temp/

A jak jsem to vymyslel, tak jsem to i napsal. $file - uploadovaná fotka před formulář v Nette.

Bod 1 - nahraji fotku do temp/

$tempDir = dirname(__DIR__).'/../../temp/';
move_uploaded_file($file->getTemporaryFile(), $tempDir.$file->getName());

Bod 2 - zmenšení fotky

Zmenším fotku knihovnou ImageMagick. Příkaz exec je z pochopitelných důvodů na serverech obvykle zakázán a tedy tato knihovna z PECL je jedinou mě známou možností.

$image = new \Imagick($tempDir.$file->getName());
$image->thumbnailImage(1000, 0);
$image->writeImage($tempDir.$file->getName());
$image = NULL;

Bod 3 - zpracování fotky nástroji v Nette

$imageB = Image::fromFile($tempDir.$file->getName());
$imageB->resize(1000, 750, Image::SHRINK_ONLY);
$imageB->save($basePath.'b_'.$fn_name.'.jpg', 95, Image::JPEG);
@chmod($basePath.'b_'.$fn_name.'.jpg', 0775);
$imageB = NULL;

$image = Image::fromFile($tempDir.$file->getName());
$image->resize(400, 300, Image::EXACT);
$image->save($basePath.$fn_name.'.jpg', 95, Image::JPEG);
@chmod($basePath.$fn_name.'.jpg', 0775);
$image = NULL;

Bod 4 - odstraněni fotky z temp/

@unlink($tempDir.$file->getName());

Výsledný stav po provedení změn

A výsledek? Z původní fotky, která měla 3MB jsem pracoval jen s fotku, která má 0.25MB a spotřeba paměti klesla z hrozivých 80MB na přijatelných 14MB, to je super, ne?

 

Podobné články jako "Nette a zpracování obrázku - ImageMagick"

Petr Kobelka | Egoblog.cz | Tvorba www stránek - www.petrkobelka.cz

Petr Kobelka
Autor je zkušeným web developerem a programátorem s více než 10 letými zkušenostmi. Pracuje jako programátor pro známou Olomouckou společnost zabývající se tvorbou internetových a intranetových řešení. Spolu se zaměstnáním pracuje na volné noze a zabývá se tvorbou internetových stránek. Ve volném čase rád fotí, jezdí na kole, plave a cestuje.

Komentáře

E-mail je potřeba pouze pro vygenerování Gravataru!

Oups, žádné komentáře? Buďtě první !!!

Blog píše Petr Kobelka

Petr Kobelka - egoblog.cz

Žádám všechny, kteří mají zájem vkládat komentáře, aby se řídili pravidly NETikety. Komentáře, porušující tato pravidla můžou být bez varování smazány.