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两行的代码,程序仍然会正常运行,只是看到的效果是一个笑脸和被笑脸图像用背景色抹掉的一条直线

捕获3

第11行是大家熟悉的划线函数,比较特别的是最后一个参数IMG_COLOR_STYLEDBRUSHED,这个参数明确了在划线时要用一个图像来作为笔刷。而笔刷又由上面一行(第10行)中的imagesetbrush函数来确定。这段代码对于有面向对象开发的程序员来说确实有点绕(至少我当时看这段时已经被绕进去了)

 

将颜色作为笔刷

这个是虚线效果,相对上面来说要容易理解一些

捕获2

实现虚线的代码如下:

$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,表示用颜色而不是用图片作为画笔,看个效果图

捕获4

//... 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

posted @ 2011-11-19 15:56  涂文瀚  阅读(1422)  评论(0编辑  收藏  举报
foot