4
我想使用图像GD库来使用XOR滤镜来绘制线条。我一直无法找到一个简单的方法来做到这一点,因此一条线被“翻转”成白色到黑色,反之亦然。任何解决方案使用图像线和XOR的PHP
我想使用图像GD库来使用XOR滤镜来绘制线条。我一直无法找到一个简单的方法来做到这一点,因此一条线被“翻转”成白色到黑色,反之亦然。任何解决方案使用图像线和XOR的PHP
我敢肯定,使用PHP函数内置的imageline
来绘制XOR行是不可能的。尽管你可以用imagesetpixel
和自定义线条绘制算法自己绘制。例如像这样的东西可以工作(Bresenham Line Algorythm for PHP):
function line($im,$x1,$y1,$x2,$y2) {
$deltax=abs($x2-$x1);
$deltay=abs($y2-$y1);
if ($deltax>$deltay) {
$numpixels=$deltax+1;
$d=(2*$deltay)-$deltax;
$dinc1=$deltay << 1; $dinc2=($deltay-$deltax) << 1;
$xinc1=1; $xinc2=1;
$yinc1=0; $yinc2=1;
} else {
$numpixels=$deltay+1;
$d=(2*$deltax)-$deltay;
$dinc1=$deltax << 1; $dinc2=($deltax-$deltay)<<1;
$xinc1=0; $xinc2=1;
$yinc1=1; $yinc2=1;
}
if ($x1>$x2) {
$xinc1=-$xinc1;
$xinc2=-$xinc2;
}
if ($y1>$y2) {
$yinc1=-$yinc1;
$yinc2=-$yinc2;
}
$x=$x1;
$y=$y1;
for ($i=0;$i<$numpixels;$i++) {
$color_current = imagecolorat ($im, $x, $y);
$r = ($color_current >> 16) & 0xFF;
$g = ($color_current >> 8) & 0xFF;
$b = $color_current & 0xFF;
$color = imagecolorallocate($im, 255 - $r, 255 - $g, 255 - $b);
imagesetpixel($im,$x,$y,$color);
if ($d<0) {
$d+=$dinc1;
$x+=$xinc1;
$y+=$yinc1;
} else {
$d+=$dinc2;
$x+=$xinc2;
$y+=$yinc2;
}
}
return ;
}
功能完美适用于从文件创建的图像。
请解释什么是异或过滤器是 – 2011-02-08 00:27:23
@Mark - 不是将笔的颜色复制到画布上要绘制的点的颜色上,而是使用该颜色对其进行异或并将结果放在那里。如果你做了两次同样的事情,那么在你画出任何东西之前,你在画布上会得到相同的颜色。 – 2011-02-09 02:09:35