Prace s obrazky – resize a ulozeni ve WEBP formatu ulozi obrazek cely cerny

michal.ksada
Člen | 7
+
0
-

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)

MajklNajt
Člen | 471
+
0
-

ja som mal tento problém s PNG, vtedy som sa dočítal, že to je problém GD knižnice, nakoľko sú 2 spôsoby jej inštalácie – bundled a externá (a tá máva problémy s transparenciou napr. pri funkcii imagecrop())

michal.ksada
Člen | 7
+
0
-

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
+
+6
-

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);
		}
	}
David Matějka
Moderator | 6445
+
+3
-

@michalksada nechces poslat PR do nette? :)

michal.ksada
Člen | 7
+
0
-

Asi blba otazka, ale co znamena PR?

Zapp3
Člen | 8
+
0
-

pull request

Editoval Zapp3 (24. 6. 2019 12:45)

Pavel Kravčík
Člen | 1180
+
0
-

Pull request – v podstatě připravíš kód do Nette, který někdo zkontroluje zařadí do „ostré“.

https://github.com/…/utils/pulls

michal.ksada
Člen | 7
+
0
-

Dobry napad nahodit validaci Webp souboru do Nette. Az se k tomu dostanu, tak to tam nahodim, at se to nemusi takhle „hackovat“.