Upload obrázku – průhlednost

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
MW
Člen | 626
+
0
-

Zdravím,

nahrávám obrázek přes form a následně do databáze:

if($values->fotka->isImage()) {
	    $img = Nette\Image::fromFile($values->fotka);
	    $img->resize(100, null);
	    $values->fotka = (string) $img;
	}

Ale u průhledných pozadí (png nebo gif) to onu průhlednost nezachová.
Jak na to prosím ?

Díky !

enumag
Člen | 2118
+
0
-

Huh? Tohle se řešilo v době Nette 0.9 kdy jsem to sám reportoval (i s fixem) a vím že se to tehdy opravilo takže by to mělo fungovat.

Když koukám do kódu tak ten fix tam pořád je, ale je pravda že jsem v poslední době neověřoval že funguje…

MW
Člen | 626
+
0
-

Tak zkousim gif i png, stejny :/

A pro upresneni, ukladam do db jako BLOB a v sablone to zobrazuji

<img src={$clen->obr_hodnost|dataStream}>

Diky!

enumag
Člen | 2118
+
0
-

Můžeš zkusit pls jednoduchý případ který jen natáhne obrázek do Nette\Image, resizne a uloží?

David Matějka
Moderator | 6445
+
0
-

bude to tim, ze toString pouziva jako defaultni typ JPEG, viz https://api.nette.org/…age.php.html#557 takze zkus zavolat ->toString(Nette\Image::PNG);

enumag
Člen | 2118
+
0
-

@matej21: Nice catch, to bude ono. :-)

MW
Člen | 626
+
0
-

Tak zkousim ulozit:

if($values->obr_hodnost->isImage()) {
	    $img = Nette\Image::fromFile($values->obr_hodnost);
	    $img->resize(60, null);
	    $img->save('test.png');
	    $values->obr_hodnost = (string) $img;
	}

ale

Cannot set HTTP code after HTTP headers have been sent (output started at /domains1/microreg_cz/public/www_root/libs/Nette/common/Image.php:480

Mimochodem, co delam blbe? Uklada se jinak?

ALE
Nice catch to byl ;)

if($values->obr_hodnost->isImage()) {
	    $img = Nette\Image::fromFile($values->obr_hodnost);
	    $img->resize(60, null);
	    $values->obr_hodnost = $img->toString(Nette\Image::PNG);
	}

jen ze vseho delam PNG.. ale to ani není nic proti nicemu.. pokud tomu tedy nebudu delat nejakou logiku :-)

Diky !

enumag
Člen | 2118
+
0
-

Co máš vůbec za verzi? Na řádku Image.php:480 v aktuální verzi není nic (doc comment).

Nemusíš ze všeho dělat PNG, stačí detekovat typ původního obrázku a neměnit ho.

David Matějka
Moderator | 6445
+
0
-

vubec by nebylo spatny, kdyby trida Nette\Images mela metodu getOriginalFormat, co? :)

enumag
Člen | 2118
+
0
-

Nápad to není špatný, ale má to háček. Typ obrázku nelze zjistit z resource takže by se musel přidat druhý parametr konstruktoru. Druhá věc je že když už by ta metoda existovala tak by bylo fajn aby ten původní typ používaly metody save a toString jako výchozí a to už by byl solidní BC break. (I tak jsem pro.)

Editoval enumag (4. 9. 2013 9:26)

MW
Člen | 626
+
0
-

je tam

		switch ($type) {
		case self::JPEG:
			$quality = $quality === NULL ? 85 : max(0, min(100, (int) $quality));
			return imagejpeg($this->getImageResource(), $file, $quality);

		case self::PNG:
			$quality = $quality === NULL ? 9 : max(0, min(9, (int) $quality));
			return imagepng($this->getImageResource(), $file, $quality);

		case self::GIF:
			return $file === NULL ? imagegif($this->getImageResource()) : imagegif($this->getImageResource(), $file); // PHP bug #44591

		default:
			throw new InvalidArgumentException("Unsupported image type.");
		}
	}

konkrétně

480: return imagepng($this->getImageResource(), $file, $quality);