• 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

  • 相关阅读:
    hdu 5007 水题 (2014西安网赛A题)
    hdu 1698 线段树(成段替换 区间求和)
    poj 3468 线段树 成段增减 区间求和
    hdu 2795 公告板 (单点最值)
    UVaLive 6833 Miscalculation (表达式计算)
    UVaLive 6832 Bit String Reordering (模拟)
    CodeForces 124C Prime Permutation (数论+贪心)
    SPOJ BALNUM (数位DP)
    CodeForces 628D Magic Numbers (数位DP)
    POJ 3252 Round Numbers (数位DP)
  • 原文地址:https://www.cnblogs.com/Excellent/p/2255306.html
Copyright © 2020-2023  润新知