请注意,您只能为任何图像调色板分配 255 种颜色。如果您尝试分配更多颜色,imagecolorallocate() 将会失败。
例如,如果您要随机分配颜色,最好检查您是否已经用完了所有可能的颜色。您可以使用 imagecolorclosest() 来获取最接近的已分配颜色
<?php
$c1 = mt_rand(50,200); $c2 = mt_rand(50,200); $c3 = mt_rand(50,200); if(imagecolorstotal($pic)>=255) {
$color = imagecolorclosest($pic, $c1, $c2, $c3);
} else {
$color = imagecolorallocate($pic, $c1, $c2, $c3);
}
?>
此外,即使颜色已经存在于调色板中,imagecolorallocate() 也会在每次调用该函数时分配新的颜色
<?php
imagecolorallocate($pic,125,125,125); imagecolorallocate($pic,125,125,125); imagecolorallocate($pic,125,125,125); imagecolorallocate($pic,125,125,125); imagecolorallocate($pic,125,125,125); ?>
所以在这里,imagecolorexact() 很有用
<?php
$color = imagecolorexact($pic, $c1, $c2, $c3);
if($color==-1) {
$color = imagecolorallocate($pic, $c1, $c2, $c3);
}
?>
此外,为了更全面,我们可以将这两个想法结合起来。
<?php
$c1 = mt_rand(50,200); $c2 = mt_rand(50,200); $c3 = mt_rand(50,200); $color = imagecolorexact($pic, $c1, $c2, $c3);
if($color==-1) {
if(imagecolorstotal($pic)>=255) {
$color = imagecolorclosest($pic, $c1, $c2, $c3);
} else {
$color = imagecolorallocate($pic, $c1, $c2, $c3);
}
}
?>
或者作为函数
<?php
function createcolor($pic,$c1,$c2,$c3) {
$color = imagecolorexact($pic, $c1, $c2, $c3);
if($color==-1) {
if(imagecolorstotal($pic)>=255) {
$color = imagecolorclosest($pic, $c1, $c2, $c3);
} else {
$color = imagecolorallocate($pic, $c1, $c2, $c3);
}
}
return $color;
}
for($i=0; $i<1000; $i++) { $c1 = mt_rand(50,200); $c2 = mt_rand(50,200); $c3 = mt_rand(50,200); $color = createcolor($pic,$c1,$c2,$c3);
}
?>