Nette Image resize() čierna bodka v rohu PNG
- orech
- Člen | 40
Zdravím,
po funkcii resize() sa mi priesvitný obrázok PNG uloží s čiernou bodkou
v rohu. Bodka je stále rovnakej veľkosti, aj pri menších veľkostiach
obrázkov, takže sa to nedá prehliadnuť.
Skúšal som 3 roky upravené staré
riešenie na podobný
problém, no nepomohlo mi – obrázky ostali kompletne nepriesvitné a
pozadie čierne :(
Vopred veľmi pekne ďakujem za pomoc
EDIT: dole nájdete riešenie
Editoval orech (20. 10. 2012 12:39)
- orech
- Člen | 40
„gist“ – To je…? :)
Každopádne:
Nette: version 2.0.3 released on 2012–04–04
PHP: PHP Version 5.4.4 (localhost, xampp)
GD: bundled (2.0.34 compatible)
$image = Image::fromFile('obrazok.png');
$image->resize(190, 190);
$image->sharpen();
$this->save('obrazok.png', 100);
EDIT:
Original
obrazok.png
Editoval orech (15. 10. 2012 20:25)
- enumag
- Člen | 2118
S tím už ti neporadím. Ta metoda sharpen je kvůli té chybé vhodná akorát pro neprůhledné JPEGy, já ji ze svého kódu raději odstranil úplně. Můžeš to zkusit reportovat jako chybu Nette, ale myslím, že je to spíše problém GD.
Možná by to fungovalo správně kdybys před tím voláním sharpen odstranil průhlednost, což myslím řeší PHP funkce imagealphablending. Otázka je, jestli ti odstranění průhlednosti vadí nebo ne.
- orech
- Člen | 40
Riešenie:
S pomocou chlapíka zo stackoverflow:
Toto stačí pridať do Image.php
, alebo (ako to mám ja) do
triedy, ktorá Image extenduje (dôležitá je tam výška a šírka obrázku,
ale kedže sa táto funkcia volá väčšinou po resize()
, tak by
to nemal byť problém :)).
public function sharpenPhoto($width, $height) {
$imageResource = ImageCreateTrueColor($width, $height);
ImageColorTransparent($imageResource, ImageColorAllocateAlpha($imageResource, 0, 0, 0, 127));
ImageAlphaBlending($imageResource, FALSE);
ImageSaveAlpha($imageResource, TRUE);
ImageCopyResampled($imageResource, $this->getImageResource(), 0, 0, 0, 0, $width, $height, ImageSX($this->getImageResource()), ImageSY($this->getImageResource()));
$color = ImageColorAt($imageResource, 0, 0);
ImageConvolution($imageResource, array(
array(-1, -1, -1),
array(-1, 24, -1),
array(-1, -1, -1),
), 16, 0);
ImageSetPixel($imageResource, 0, 0, $color);
$this->setImageResource($imageResource);
}
Editoval orech (20. 10. 2012 12:40)