NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Komprese obrázků

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:8.2.2017 11:11

Ahoj.
Projíždím web pomocí PageSpeed od Googlu. Velkým problémem jsou obrázky. Ty ke článkům ukládám dejme tomu o rozměrech 1200x580px. U detailu článku se používá šířka okolo 800px (ano, tady můžu trochu ubrat při ukládání fotky, ale ne moc).
Větší problém je na HP (homepage). Tam se používají náhledy, tedy šířka obrázku je okolo 250-300px, tedy mnohem menší než originál. PageSpeed mě pobízí ke zmenšení obrázků.
Raději než že bych každý obrázek musel ukládat a mít dvakrát (velký a malý náhledový), bych se chtěl zeptat, jestli nejde třeba pomocí PHP nějak provést tuto kompresi --> tedy že se načte uložený velký obrázek a pro náhled ho zkomprimuji přímo ve skriptu a ušetřím tak pár MB :)

Díky :)

 
Odpovědět
8.2.2017 11:11
Avatar
Odpovídá na Michal Kuba
Patrik Valkovič:8.2.2017 11:16

Ušetříš pár megabajtů, ale bez větší optimalizace (cachování) budeš muset pro každý request ten stejný obrázek komprimovat znovu a znovu. To je zbytečné a zdegraduješ už tak pomalé PHP. Pokud používáš cache, tak sice nebude komprimovat pokaždé, ale zase ti to zabere ty MB :D
Já být tebou to ukládám do databáze nebo někam do složky a jednou za čas bych to projel CRONem a promazal to.

Nahoru Odpovědět
8.2.2017 11:16
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Michal Kuba:8.2.2017 11:23

Obrázky jsou uloženy na serveru, udaje k němu v dtb. Nicméně mě jde o to, že se načítají až moc zmenšené obrázky pomocí CSS, což PageSpeedu vadí. Radí mi kompresi, jde to teda provést nějak efektivně?

Promazávat žádné obrázky nikdy nechci, články nejsou na bázi zpráv ale článků, které mohou lidi využít dnes nebo klidně za deset let, obrázek k tomu proto chci zachovat.

 
Nahoru Odpovědět
8.2.2017 11:23
Avatar
Odpovídá na Michal Kuba
Patrik Valkovič:8.2.2017 11:44

Jak jsem řekl. Budeš mít obrázky uloženy stejně, jako je tomu teď. Plus si pro obrázky na homepage vytvoříš separátní složku nebo sloupec v databázi, kde budeš mít komprimované verze obrázků. Předpokládám, že se obrázky na homepage nebudou vyskytovat moc dlouho, takže by bylo dobré tuto složku (se zmenšenými obrázky) jednou za čas promáznout.
Příjde mi to jako nejefektivnější řešení.

Nahoru Odpovědět
8.2.2017 11:44
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal Kuba
katrincsak:9.2.2017 21:41

Jak radí patrik.valkovic, také bych to řešil stejným způsobem. Přijde mi hloupost v tomto případě provádět opakovanou kompresy při každém requestu.

Zachoval bych obrázek v originální velikosti a vytvořil k tomu náhled, který se zmenší a provedl bych zároveň i kompresy a tím se dostaneš na několik desítek KB.

 
Nahoru Odpovědět
9.2.2017 21:41
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Michal Kuba:31.5.2017 23:47

Tak jsem si na to po delší době sedl, ale nedaří se :/

Rovnou ukážu asi kod. Na MVC architektuře v kontroleru se už dostanu na uložení obrázku, tak rovnou tam přidám i onu kompresi:

if(move_uploaded_file($_FILES['file']['tmp_name'], $dir)){

                 $this->compress_image($_FILES['file'],$_FILES['file']['tmp_name'], $dir.'.jpg', 65);

funkce je potom v kontroleru, ze kterého dědí ten, který zpracovává obrázky. Funkce komprese (několikrát zminovaná ruzně na netu)

public function compress_image($info,$source_url, $destination_url, $quality) {



          if ($info['type'] == 'image/jpeg')
          $image = imagecreatefromjpeg($source_url);

          elseif ($info['type'] == 'image/gif')
          $image = imagecreatefromgif($source_url);

          elseif ($info['type'] == 'image/png')
          $image = imagecreatefrompng($source_url);

          imagejpeg($image, $destination_url, $quality);
          return $destination_url;
        }

Když to odešlu, obrázek původní se sice uloží, komprimovaný (který by se jmenoval obrazek.jpg.jpg) ale už nikoliv. Předtím vyhodí PHP chybové hlášení, po jehož refreshi se vrátím zpět do adminu. Hláška je taková:

Warning: imagecreatefromjpeg(/data/web/virtuals/136924/virtual/tmp/phpspj4lh): failed to open stream: No such file or directory in /data/web/virtuals/136924/virtual/www/subdom/admin/kontrolery/Kontroler.php on line 129

Warning: imagejpeg() expects parameter 1 to be resource, boolean given in /data/web/virtuals/136924/virtual/www/subdom/admin/kontrolery/Kontroler.php on line 137

Nějaké rady, prosím? Fakt nevím, co dělám špatně. Ta funkce na internetu je odsud http://blog.clonesinfo.com/…ng-php-code/

Předem díky!

 
Nahoru Odpovědět
31.5.2017 23:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.