GD库之有意思的imagesetstyle
在写cookbook图像一章的笔记时从官方网站上看到的一个关于imagesetstyle例子,在本机测试了一下,还不错,但对于其中的代码,由于官方并未有详细的解释,导致学习上费了一番功夫。故写一篇博文总结一下
将一个图片作为笔刷
先看个效果图
这个是将一个图片作为笔刷进行绘制的效果,下面是实现的代码:
$image = ImageCreate(500,500); $bg = imagecolorallocate($image, 255,255,255); $color = imagecolorallocate($image, 200,0,0); //笔刷效果-笑脸 $style = array($bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$bg,$color); imagesetstyle($image, $style);//设置划线样式 $brush = imagecreatefrompng("http://www.libpng.org/pub/png/images/smile.happy.png"); $w2 = imagecolorallocate($brush, 255, 255, 255); imagecolortransparent($brush, $w2);//设置透明色 imagesetbrush($image, $brush);//设置笔刷 imageline($image, 100, 280, 400, 220, IMG_COLOR_STYLEDBRUSHED);//划线 header('Content-type:image/png'); imagepng($image);
代码解析:
比较关键的就是第5行中$style参数是一个一维数组,其中$bg必须是第一个imagecolorallocate(第一个代表设定图片背景色),每个$bg代表1像素,$color代表笑脸出现的位置。所以这里$bg的重复数越多,笑脸与笑脸之间的间距就越大,反之亦然。可以有多个$color。$bg参数是必须的,缺少会出错。
第6行就是用来将笔刷的$style加载到$image中便于后面使用。
如果去掉5、6两行的代码,程序仍然会正常运行,只是看到的效果是一个笑脸和被笑脸图像用背景色抹掉的一条直线
第11行是大家熟悉的划线函数,比较特别的是最后一个参数IMG_COLOR_STYLEDBRUSHED,这个参数明确了在划线时要用一个图像来作为笔刷。而笔刷又由上面一行(第10行)中的imagesetbrush函数来确定。这段代码对于有面向对象开发的程序员来说确实有点绕(至少我当时看这段时已经被绕进去了)
将颜色作为笔刷
这个是虚线效果,相对上面来说要容易理解一些
实现虚线的代码如下:
$image = ImageCreate(500,500); $bg = imagecolorallocate($image, 255,255,255); $color = imagecolorallocate($image, 200,0,0); //笔刷效果-虚线 $style = array($color, $color, $color, $color, $color, $bg, $bg, $bg, $bg, $bg, ); imagesetstyle($image, $style);//设置划线样式 imageline($image, 50, 350, 150, 350, IMG_COLOR_STYLED);//划线 imageline($image, 150, 350, 150, 450, IMG_COLOR_STYLED); imageline($image, 150, 450, 50, 450, IMG_COLOR_STYLED); imageline($image, 50, 450, 50, 350, IMG_COLOR_STYLED); header('Content-type:image/png'); imagepng($image);
代码解析:
相对前一个,这个就比较简单了。第5行和前面一个最大的不同是这里的$color代表前景色,$bg代表另一个色(而不是透明间距),所以可以由多种颜色构成。$bg不是必须的。
划线函数imageline的最后一个参数也和之前不同,是IMG_COLOR_STYLED,表示用颜色而不是用图片作为画笔,看个效果图
//... code ... $style = array($color, $color, $color, $color, $color,$bg,$bg, $blue,$blue,$blue,$blue,$blue,$bg,$bg,$green ,$green ,$green ,$green ,$green,$bg,$bg ); //... code ...
参考资料
官方imagesetstyle() 例子:http://cn.php.net/ImageSetStyle