Nette Image resize() čierna bodka v rohu PNG

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

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)

enumag
Člen | 2118
+
0
-

Ideálně dej na gist testovací skript, přilož problémový obrázek, uveď verzi Nette, PHP a GD. Je totiž docela dobře možné, že se to děje třeba jen s nějakou konkrétní verzí GD a bylo by třeba otestovat to.

orech
Člen | 40
+
0
-

„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);

obrazok.png – resiznutý

EDIT:
Original
obrazok.png

Editoval orech (15. 10. 2012 20:25)

iguana007
Člen | 970
+
0
-

Vždyť máš tu černou tečku už v tom originále … tak ji z tama odmaž a máš po problému ;)

enumag
Člen | 2118
+
0
-

Hezká chyba. :-D

Gist

orech
Člen | 40
+
0
-

Aaaa, sorry. Uploadol som ten resiznutý :)

Toto je original:
obrazok.png

enumag
Člen | 2118
+
0
-

Ááá už si vzpomínám! Myslím, že jsem se s touhle chybou už setkal. Jestli si to pamatuju správně tak když odstraníš $image->sharpen(); tak chyba zmizí. ;-)

orech
Člen | 40
+
0
-

Díky, ozaj to potom zmizlo.
Ale teraz pozorujem, že menšie thumby (38×38), ktoré ďalej vytváram, sú celkom rozmazané.

enumag
Člen | 2118
+
0
-

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

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)