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