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