Autor Zpráva
miskith
Profil
Zdravím,
mám takový problém. Chci si přes GD knihovnu složit obrázek z průhledných PNG obrázků. Obrázky jsou k pozadí průhledné, ale samy k sobě nejsou. Neboli když dám dvě černá kolečka na sebe (mírně posunout, aby nebyly úplně na sobě), tak výsledný obrázek je kolem dokola těch koleček prázdný (průhledný), ale ve spodním kolečku je vyříznutý bílý čtverec. Zkoušel jsem, jaké by to bylo přes GIF a to fungovalo bez problémů. GIF ale nemá dostatečnou kvalitu, kterou potřebuji.

A protože chápu, že je to asi těžší na pochopení (tak i na vysvětlení), vytvořil jsem jednoduchou ukázku:


Takhle to vypadá, když dám oba obrázky na sebe v originálním rozlišení. Je vidět jen jedno kolečko, protože to druhé (posunuté) je jakoby pod ním.

Na tomhle obrázku jsem zmenšil vrchní kolečko na 200x200, aby bylo vidět, jak vykrajuje do druhého "bílou" díru

A takto má ve skutečnosti vypadat výsledek (Photoshop)


<?php
header('Content-Type: image/png');
 
$width = 430;
$height = 330; 
 
$image = imagecreatetruecolor($width, $height);
$transparent = imagecolorallocatealpha($image, 255, 255, 255, 127);
imagefilledrectangle($image, 0, 0, $width, $height, $transparent); 
imagealphablending($image, false);
imagesavealpha($image, true);
       
$image2 = imagecreatefrompng("gd_images/1.png");
imagealphablending($image2, false); imagesavealpha($image2, true);
imagecopy($image, $image2, 0, 0, 0, 0, $width, $height);
imagedestroy($image2); 
$image3 = imagecreatefrompng("gd_images/2.png");
imagealphablending($image3, false); imagesavealpha($image3, true);
imagecopy($image, $image3, 0, 0, 0, 0, $width, $height);
imagedestroy($image3);

imagepng($image); 
imagedestroy($image);   
?>


Na internetu jsem hledal a všude radí vypnout imagealphablending, což, jak je vidět, mám vypnuté.
Děkuji za pomoc :).
Marek88
Profil
miskith:
Na internetu jsem hledal a všude radí vypnout imagealphablending, což, jak je vidět, mám vypnuté.
Neměl bys to naopak zapnout? V dokumentaci funkce imagealphablending píšou: "In non-blending mode, the drawing color is copied literally with its alpha channel information, replacing the destination pixel."

To podle mě znamená, že když to vypneš, tak kreslící funkce potom budou doslova (literally) kopírovat jednotlivé pixely i s alpha kanálem. Já to chápu tak, že když to druhé kolečko má průhledné pozadí, tak se to průhledné pozadí přesně nakopíruje do obrázku (i když tam předtím už něco bylo, tak z toho udělá průhlednou). Naopak ale když to zapneš, tak by se ty barvy s ohledem na jejich průhlednot měly sloučit. Tzn. černá a průhledná dá dohromady černou...
miskith
Profil
Děkuji za snahu, ale s tím je pozadí celého obrázku bíle. Ale už jsem se spokojil s tím, že bude mít obrázek bílé pozadí. Stejné je na stránce, která má bílé pozadí, šlo mi jen o to, že kdybych někdy měnil barvu pozadí, aby i obrázek byl průhledný. Ale tak co nadělám... Kdyžtak ten PHP soubor upravím.

Ale i tak si cením snahy o pomoc ;).
Marek88
Profil
A co nějaká vhodná kombinace? Možná:
imagealphablending($image, false);
imagealphablending($image2, false);
imagealphablending($image3, true);

Přece to nějak musí jít... :)
miskith
Profil
Pozkoušel jsem i víc kombinací a buď to dopadlo jak sem už psal nahoře a nebo to nemělo průhledné pozadí.
1Pupik1989
Profil
no myslim si, ze by to chtelo imagecolortransparent
miskith
Profil
To jsem nenapsal.. Ten jsem také zkoušel a fungovalo to, až na to, že se obrázek znekvalitnil a vyl tak kvalitní, jako kdybych to uložil v GIFu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0