![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 12 Pomógł: 0 Dołączył: 7.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Mam prosty problem.
Używam funkcji imagecopymerge(); aby skleić 5 obrazków w jeden. Wszystkie 5 obrazków mają w sumie więcej niż 255 różnych kolorów. Niestety podczas operacji sklejania nie jest to w żaden cywilizowany sposób redukowane, tylko nadmiarowe kolory są po prostu odcinane z tablicy. Po krótce: wygląda to tak, że mam 4 ścinki obrazków (z różowym tłem które jest potem wycinane), każdy ze ścinków jest kolorowany na dowolny/inny kolor. Potem wszystkie 4 ścinki wklejam na piąty obrazek. Niestety wszystkich kolorów na wszystkich 5 obrazkach jest około 350. Przy wielokrotnym naklejaniu na obrazek innych, zapisuje się tylko pierwszych 255 kolorów... nadmiarowe kolory z później (w kolejności) naklejanych obrazków są odrzucane, i dopasowywane do już istniejącej tablicy. Wygląda to tak, że jak skleimy z sobą obrazek z zielonych + niebieskich + żółtych + czerwonych kawałków, to zachowują się odcienie zielonego i niebieskiego, natomiast już żółte i czerwone kawałki wyświetlają się także na niebiesko i zielono. Jest jakiś sposób aby przekroczyć limit 255 kolorów lub zredukować je w bardziej cywilizowany sposób (niż tylko wywalać te kolory które przychodzą później) ? Kod <?php
function image_colorizer($source, $arg1 = null, $arg2 = null, $arg3 = null){ $ilosc_kolorow=imagecolorstotal($source); for($i=0; $ilosc_kolorow>$i; $i++){ $lik = imagecolorsforindex($source, $i); if ($lik['red']=='255' and $g=$lik['green']=='0' and $lik['blue']=='255'){ imagecolortransparent($source, $i); } else { $r=(int)(($lik['red']+$arg1)/2); $g=(int)(($lik['green']+$arg2)/2); $b=(int)(($lik['blue']+$arg3)/2); $r = ($r > 255)? 255 : (($r < 0)? 0:$r); $g = ($g > 255)? 255 : (($g < 0)? 0:$g); $b = ($b > 255)? 255 : (($b < 0)? 0:$b); imagecolorset($source, $i,$r,$g,$b); }} return true; } function image_set_transparency($source){ $ilosc_kolorow=imagecolorstotal($source); for($i=0; $ilosc_kolorow>$i; $i++){ $lik = imagecolorsforindex($source, $i); if ($lik['red']=='255' and $g=$lik['green']=='0' and $lik['blue']=='255'){ imagecolortransparent($source, $i); } } return true; } $color1='#ff0000'; $color2='#00ff00'; $color3='#00ff00'; $color4='#00ff00'; $pic1=ImageCreateFromPNG('abcd1.png'); $pic2=ImageCreateFromPNG('abcd2.png'); $pic3=ImageCreateFromPNG('abcd3.png'); $pic4=ImageCreateFromPNG('abcd4.png'); $pic5=ImageCreateFromPNG('abcd5.png'); $colors=sscanf($color1, '#%2x%2x%2x'); imagecolorizer($pic1,$colors[0],$colors[1],$colors[2]); $colors=sscanf($color2, '#%2x%2x%2x'); imagecolorizer($pic2,$colors[0],$colors[1],$colors[2]); $colors=sscanf($color3, '#%2x%2x%2x'); imagecolorizer($pic3,$colors[0],$colors[1],$colors[2]); $colors=sscanf($color4, '#%2x%2x%2x'); image_colorizer($pic4,$colors[0],$colors[1],$colors[2]); image_set_transparency($pic5); imagecopymerge($pic5, $pic1, 0, 0, 0, 0, 64, 64, 100); imagecopymerge($pic5, $pic2, 0, 0, 0, 0, 64, 64, 100); imagecopymerge($pic5, $pic3, 0, 0, 0, 0, 64, 64, 100); imagecopymerge($pic5, $pic4, 0, 0, 0, 0, 64, 64, 100); Header("Content-type: image/jpeg"); ImageJPEG($pic5,'',100); imagedestroy($pic1); imagedestroy($pic2); imagedestroy($pic3); imagedestroy($pic4); imagedestroy($pic5); ?> Ten post edytował przemdro 8.06.2009, 15:24:01 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 13:32 |