Prace s obrazky – resize a ulozeni ve WEBP formatu ulozi obrazek cely cerny
- michal.ksada
- Člen | 7
Mam problem s ulozenim obrazku do WEBP formatu. Pouzivam Nette 2.4 a PHP 7.3 + nginx
Mam napsanou tridu, ktera veme obrazek, resizuje ho a ulozi v nekolika rozmerech a formatech.
Napr rozmery 100×100, 200×200 a 300×300 ve formatech png a webp, takze ve vysledku je to 6 obrazku.
Potiz je v tom, ze se nektere obrazky ulozi do webp v poradku a nektere jsou kompletne cerne. Nesetkal jste se s tim nekdo?
Taky jsem si vsiml, ze na localhostu to funguje dobre, ale na serveru to dela potize. Nejvetsi zahadou je, ze nektere obrazky se zobrazi normalne a nektere cerne. Bohuzel jsem v tom zadnou logiku nenasel.
Obrazky ukladam takto:
foreach ($config["sizes"] as $name => $size)
{
$image = Image::fromFile($originImage);
$image->resize($size, null);
$name = $fileName . "-" . $name;
foreach ($config["formats"] as $format)
{
switch ($format)
{
case "webp":
$image->save($uploadDir . $name . ".webp", 80, Image::WEBP);
break;
case "jpeg":
$image->save($uploadDir . $name . ".jpeg", 80, Image::JPEG);
break;
case "gif":
$image->save($uploadDir . $name . ".gif", 80, Image::GIF);
break;
case "png":
$image->save($uploadDir . $name . ".png", 80, Image::PNG);
break;
}
}
}
a v neonu mam konfig, kde definuju v jakych formatech a rozmerech se ma obrazek ulozit
product:
formats:
- png
- webp
sizes:
large: 300
small: 150
large_2x: 600
small_2x: 300
dir: /uploads-repository/images/products/
Editoval michal.ksada (6. 6. 2019 18:13)
- michal.ksada
- Člen | 7
Diky za reakci. Zapatral jsem, co je spatne v gd knihovne a docetl jsem se, ze nektere verze spatne dopocitavaji velikost souboru na sudy pocet bytu. Ciste teoreticky by stacilo pri ukladani souboru pridat nulovy byte.
Az se k tomu dostanu, tak vyzkousim a kdyztak sem nahodim nejaky funkcni reseni.
- michal.ksada
- Člen | 7
Našel jsem řešení. Na vině je opravdu GD knihovna, která ukládá poškozený soubory, protože některé verze zapominají dorovnat počet bytů na sudý počet. A tady je řešení:
Místo ukládání
$image->save($uploadDir . $name . ".webp", 80, Image::WEBP);
ukládám soubory do WEBP tatkto:
$image = Image::fromFile($uplodaedImage);
$this->saveWebP($uploadDir . $name . ".webp", 80, $image->getImageResource());
private function saveWebP($file, $quality, $image)
{
imagewebp($image, $file, $quality);
if (filesize($file) % 2 == 1) {
file_put_contents($file, "\0", FILE_APPEND);
}
}
- Pavel Kravčík
- Člen | 1196
Pull request – v podstatě připravíš kód do Nette, který někdo zkontroluje zařadí do „ostré“.
- michal.ksada
- Člen | 7
Dobry napad nahodit validaci Webp souboru do Nette. Az se k tomu dostanu, tak to tam nahodim, at se to nemusi takhle „hackovat“.