• 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

  • 相关阅读:
    em,pt和px之间的换算
    css中 中文字体(fontfamily)的标准英文名称
    HTML css面试题
    css实现的透明三角形
    JavaScript经典面试题系列
    C++ template 学习笔记(第二章)
    C++ template 学习笔记 (第五章)
    20120906
    C++ template 学习笔记(第十六章) 16.1 命名模版参数
    C++ template 学习笔记(第三,四章)
  • 原文地址:https://www.cnblogs.com/Excellent/p/2255306.html
Copyright © 2020-2023  润新知