/*给图片加文字水印的方法*/
$dst_path = 'http://f4.topitme.com/4/15/11/1166351597fe111154l.jpg';//保证路径正确
$dst = imagecreatefromstring(file_get_contents($dst_path));
/*imagecreatefromstring()--从字符串中的图像流新建一个图像,返回一个图像标示符,其表达了从给定字符串得来的图像
图像格式将自动监测,只要php支持jpeg,png,gif,wbmp,gd2.*/$font = 'C://test.ttc';//保证路径正确$black = imagecolorallocate($dst, 0, 0, 0);
imagefttext($dst, 20, 0, 100, 300, $black, $font, 'Hello wor123123123123123123123123123ldwor123123123123123123123123123ldwor123123123123123123123123123ldwor123123123123123123123123123ld!');
/*imagefttext($img,$size,$angle,$x,$y,$color,$fontfile,$text)
$img由图像创建函数返回的图像资源
size要使用的水印的字体大小
angle(角度)文字的倾斜角度,如果是0度代表文字从左往右,如果是90度代表从上往下
x,y水印文字的第一个文字的起始位置
color是水印文字的颜色
fontfile,你希望使用truetype字体的路径*/
list($dst_w,$dst_h,$dst_type) = getimagesize($dst_path);
/*list(mixed $varname[,mixed $......])--把数组中的值赋给一些变量
像array()一样,这不是真正的函数,而是语言结构,List()用一步操作给一组变量进行赋值*/
/*getimagesize()能获取到什么信息?
getimagesize函数会返回图像的所有信息,包括大小,类型等等*/
switch($dst_type){case 1://GIFheader("content-type:image/gif");imagegif($dst);break;case 2://JPGheader("content-type:image/jpeg");imagejpeg($dst);break;case 3://PNGheader("content-type:image/png");imagepng($dst);break;default:break;/*imagepng--以PNG格式将图像输出到浏览器或文件imagepng()将GD图像流(image)以png格式输出到标注输出(通常为浏览器),或者如果用filename给出了文件名则将其输出到文件*/
}
imagedestroy($dst);

  • 下面都是摘抄的
  •   因为一开始,“大家”都说一般任务中,用php操作图片不常见,像我们这种基本业务型的,就更用不到了,所以先别看,偶就没有看。现在有机会了自然要来玩一把。

      以前学过C#的GDI+,交了课程设计后忘得一干二净。又被迫学了点MFC的画图,觉得这是最蛋疼的画图过程。去年做了个小任务时用到了js图表控件,用的是封装好的js库直接调方法,然后发现这是用HTML5的canvas元素结合js打造而成,这些chart控件很多很漂亮:jsChart、HighChart、EChart、aChart、Chart.js等等,都是基于canvas,还有svg这货也很强大。

      对比下有不少共同点,首先都要创建一个环境(context),就像真实的人画画一样,得给他一个完整的环境:一间画室,一张画板,若干画笔、颜料等,这样的硬性条件具备后才能开始作图,这个环境听起来很抽象,简单理解就是机子上必须具备某些“库”、“扩展”,类似于.net framework、jave runtime等,画js图表你得下载和加载对应的js文件,你的浏览器得支持canvas,这些硬性条件构成了这个(底层)环境,某些任务需要这些底层去完成,就像玩游戏,很多大点的游戏必须要directX,也是这个道理。

      然后就是调用这个环境提供的各种库的方法,来画各种图形:点、线、圆(弧)、椭圆、矩形、多边形、字符、文本等,再强大的可能直接提供了一些经典的曲线如贝塞尔等,然后可以设置这些图形的样式,线条连续还是断续,颜色红还是绿,画图形时是画个空框架还是将内部填充,画在界面上哪里(图在屏幕上坐标多少),正着放还是歇着放(角度多少),图形长宽如何等等,都应有方法可调。

      等一切设置完毕就是画到界面上了,然后可能会做释放某些资源的扫尾工作(垃圾回收)。大多数工作都在设置各种参数的阶段。

      php使用GD库进行绘图,请确保开启了这个扩展。可以看到当前GD库的版本,支持的类型GIF、JPEG、PNG、WBMP等,FreeType大致查了下是一个字体引擎,提供访问各种字体接口,可供我们绘制文字,也算一个库扩展,只是包含在gd库中。

          

      php画图也基本遵循这个过程:创建画布(相当于绘图环境)->设置参数,绘制图像 -> 输出(保存)图像 -> 资源释放。如果是将图片直接输出到浏览器,实际是放在一个img标签中,它的src属性是这个脚本的所在路径。一个最简单的示例

    view sourceprint?
    01.<?php
    02.    // 创建画布
    03.    $width = 200;   // 规定画布的宽高
    04.    $height = 100;
    05.    $image = imagecreatetruecolor($width, $height);  // 创建一幅真彩色图像
    06.    // 添加一些即将用到的颜色
    07.    $white = imagecolorallocate($image, 0xf2, 0xec, 0xe0);
    08.    $orange = imagecolorallocate($image, 0xff, 0xa5, 0x4c);
    09.    // 对画布背景填充颜色
    10.    imagefill($image, 0, 0, $white);
    11.    // 画一串字符串在画布上
    12.    imagestring($image, 5, 30, 40, "Hello World", $orange);
    13.    // 通知<a href="http://www.it165.net/edu/ewl/" target="_blank" class="keylink">浏览器</a>输出的是图像(png类型)
    14.    header('Content-Type: image/png');
    15.    // 输出到浏览器
    16.    imagepng($image);
    17.    // 释放图像资源
    18.    imagedestroy($image);

       运行结果与审查元素,src是脚本访问链接,图片实际是放在img标签中。

            

      1. 创建画布

      在php中有三种方式,一是imagecreate方法,一是imagecreatetruecolor,这两者不依赖已有文件,创建一幅画布,参数需要制定画布的宽高(如示例),返回一个resource资源型变量,有的称为句柄,以后的操作都在这个资源型变量上进行,它就代表这这幅图像,imagesx和imagesy方法可分别获取到它的宽高属性。稍不同的是,imagecreate方法会在添加颜色时,将第一种添加的颜色(调用imagecolorallocate方法)作为整个画布的背景色,而后者则需要调用方法对背景指定一个添加好的颜色进行填充。还有一类方法是基于现有的文件来创建画布,如imagecreatefromjpeg方法,从一个现有的jpeg(jpg)格式图片创建画布,参数需要你传入该格式文件所在的路径,所以它的代码可以简单到这样

    view sourceprint?
    1.<?php
    2.    $filename = 'H:\wampserver\wamp\www\html\image\2015.png' // 一个有效的文件路径
    3.    $image = imagecreatefrompng($filename);  // 从现有文件创建图像
    4.    header('Content-Type: image/png');
    5.    imagepng($image);                        // 输出图像到浏览器
    6.    imagedestroy($image);                    // 释放资源

      2. 设置颜色各项参数

      GD库绘图时颜色是被分配(allocate)到画布环境中的,不是你想画个啥,临时给个颜色变量就行,调用的是imagecolorallocate方法,原型是

      int imagecolorallocate ( resource $image , int $red , int $green , int $blue ),第一个参数是前面创建的图像资源变量,后三个一次是红绿蓝色值,采用RGB三原色佳色法原理,绘制真彩色图像,每一个范围是0~255,当RGB=(255, 255, 255),就是白色,很多地方喜欢用十六进制表示,比如CSS中常见#ffffff(大小写均可),所以R、G、B可分别给值0xff、0xff、0xff,每allocate一次分配一种。看看imagecolorallocate函数原型,你会发现它返回的是int型,所以推测它只是对传入的rgb值合成一个颜色后返回一个编号,rgb真彩色是65535种颜色,这样可以每个颜色对应一个数值编号,最好当然还是用变量,凭空写个颜色数值恐怕很难。

      使用imagecreate创建画布时,会将第一种分配的颜色作为画布的背景色(如前),如果是imagecreatetruecolor,则需调用imagefill来填充背景色,方法原型:bool imagefill ( resource $image , int $x , int $y , int $color ),它会将$x和$y附近的点填充为$color颜色,所以使用imagefill的话,基本上要么将背景全部填充为一种颜色,要么不填充(默认黑色)。但是一张画布上作画时,也许你需要背景色,但很可能不会将整张画板都涂上一种背景色,旁边总得留点白纸的地方,所以GD库提供了能将背景填充成各种具体形状的方法,如矩形(imagefilledrectangle)、椭圆(imagefilledecllipse)、圆形(椭圆)或扇形(imagefilledarc)、任意多边形(imagefilledpolygon)等,以椭圆形为例,方法原型:bool imagefilledellipse($image, $cx, $cy, $width, $height, $color),第一个参数资源变量,第二、三个椭圆圆心坐标,四、五设置椭圆宽高度,最后是颜色,简单如此,注意椭圆的宽高度指长轴长度、短轴长度,而非长半轴、短半轴长度

    view sourceprint?
    1.<?php
    2.    $image = imagecreatetruecolor(200, 100);
    3.    $background_color = imagecolorallocate($image, 0x13, 0x71, 0x32);
    4.    // 填充背景为矩形
    5.    imagefilledellipse($image, 100, 50, 200, 100, $background_color);
    6.    header('Content-Type: image/png');
    7.    imagepng($image);
    8.    imagedestroy($image);

          

      3.绘制图像

      实际上第2步中的背景色填充就是在绘制图像,只是默认的黑色背景不好看,所以可以先给它填充个另外的颜色。绘图时也讲究个坐标、宽高的问题。老样子,屏幕坐标原点在左上角,水平往右X值学大,竖直向下Y值越大,以像素为单位。除了imagefill外还有:

        像素点:imagesetpixel  

        直线:imageline

        矩形:imagerectangle

        多边形:imagepolygon

        椭圆:imageellipse

        圆弧:imagearc

      以上的矩形、多边形、椭圆均有对应的填充类型函数,即它们只是画一个简单的形状边线。一段测试代码

    view sourceprint?
    01.<?php
    02.    $width = 200;
    03.    $height = 450;
    04.    // 创建图像,得到一个资源变量
    05.    $img = imagecreatetruecolor($width, $height);
    06.    // 分配颜色
    07.    $orange = imagecolorallocate($img, 0xff, 0x66, 0x33);
    08.    $creamy_white = imagecolorallocate($img, 0xe8, 0xe9, 0xdb);
    09.    $blue = imagecolorallocate($img, 0x1e, 0x90, 0xff);
    10.    $green = imagecolorallocate($img, 0x64, 0xb1, 0x67);
    11.    $red = imagecolorallocate($img, 0xf6, 0x65, 0x78);
    12.    // 填充背景
    13.    imagefill($img, 0, 0, $creamy_white); 
    14.    // 画线
    15.    imageline($img, 10, 10, 100, 60, $orange);   
    16.    // 画一个填充的矩形
    17.    imagefilledrectangle($img, 10, 70, 160, 150, $blue);
    18.    // 画多边形
    19.    $point_coords = array(10, 160, 50, 170, 120, 270, 5, 250);
    20.    imagepolygon($img, $point_coords, count($point_coords)/2, $green);
    21.    //imagefilledpolygon($img, $point_coords, count($point_coords)/2, $green); // 画一个填充多边形
    22.    // 画一段圆弧
    23.    imagearc($img, 80, 310, 80, 80, 0, 240, $orange);
    24.    // 画一个填充的椭圆
    25.    imagefilledellipse($img, 80, 400, 150, 70, $red);
    26.     
    27.    header('Content-Type:image/png');
    28.    imagepng($img);  // 生成图像
    29.    imagedestroy($img);  // 释放资源

      效果

        

      例如,画直线方法原型:bool imageline(resource $image, int $x1, int $y1, int $x2, int $y2, int $color),x1,y1和x2,y2是线的起点和终点坐标,画直线就是从这个点到哪个点。填充矩形方法中,x1,y1和x2,y2分别对应矩形的左上角和右下角坐标。多边形的方法:bool imagepolygon(resource $image, array $points, int $num_points, int $color),第二个参数$points是个一维数组,里边放着多边形各个顶点的坐标值,最好按照顺时针或逆时针围着多边形写,不会遗漏,第三个参数$num_points是顶点个数,所以是第二个坐标值数组的总数除2,这点要注意。画圆弧imagearc这里是画个弧线,也有对应的imagefilledarc可以画一个填充的饼状弧形。对于画椭圆imagefilledellipse(resource $image, int $cx, int $cy, int $width, int $height, int $color),$cx、$cy是椭圆中心坐标,$width、$height是指长轴长(宽)、短轴长(高)。

      4. 绘制文字字符串

      除了画这些图形,gd库允许我们画单个字符和字符串,比如水平画一个字符串方法:bool imagestring(resource $image, int $font, int $x, int $y, string $s, int $col),$image是图像句柄,$font是字体类型,gd内置五种字体(貌似除了大小外都差不多)。用int值标识它们(1至5,值越大字越大),传入其中一个即可,$x、$y是坐标值,指一串字符串的左上角的坐标(参考前面例子)。既然强调了水平画一个字符串,不出意外就有竖直方向的,确实有:imagestringup,对于画单个字符同理:imagechar和imagecharup。绘制字符能干什么,最经典的莫过于验证码了,试着写了个简单的验证码类

    view sourceprint?
    001.<?php
    002.    class Validcode
    003.    {
    004.        private $codeNum = 4;   // 验证码个数
    005.        private $width = 80;    // 图像宽度
    006.        private $height = 20;    // 图像高度
    007.        private $image = false;        // 图像句柄
    008.        private static $colors = array();    // 颜色色值
    009.        private $vcodes = '';        // 验证码字符串
    010.        private static $instance = null;    // 当前实例
    011.        private function __construct($num = 4, $width = 80, $height = 20)
    012.        {
    013.            if(!extension_loaded('gd'))
    014.            {
    015.                exit('fatal error: no gd extension!');
    016.            }
    017.            // 规定字符数为3到5个
    018.            if((int)$num < 2 || (int)$num > 5)
    019.            {
    020.                $num = 4;
    021.            }
    022.            $this->codeNum = (int)$num;
    023.            // 限制宽高
    024.            $min_width = (imagefontwidth(5) * $this->codeNum) + 10;
    025.            $min_height = imagefontheight(5) + 10;
    026.            $width < $min_width && $width = $min_width;
    027.            $height < $min_height && $height = $min_height;
    028.            $this->width = $width;
    029.            $this->height = $height;
    030.        }
    031.        // 获取单例
    032.        public static  function getInstance($num = 4, $width = 80, $height = 20)
    033.        {
    034.            if(self::$instance === null)
    035.            {
    036.                self::$instance = new self($num, $width, $height);
    037.            }
    038.            return self::$instance;
    039.        }
    040.        /**
    041.         * 获取图像句柄
    042.         */
    043.        private function getImage()
    044.        {
    045.            if($this->image === false)
    046.                $this->image = imagecreatetruecolor($this->width, $this->height);
    047.            if(!$this->image)
    048.                exit('can not initialize image resource!');
    049.            // 添加一个默认背景色到数组
    050.            self::$colors['yello_back'] = imagecolorallocate($this->image, 0xf5, 0xf5, 0xdc);
    051.        }
    052.        /**
    053.         * 添加颜色
    054.         * @param color array('colorKey'=>array(r,g,b),)
    055.         * 注意格式参数,array(键名=>array(r值, g值, b值),),可一次添加多个
    056.         */
    057.        public function addColors($colors = array())
    058.        {
    059.            if(!is_array($colors))
    060.            {
    061.                echo 'ERROR: pass array of colors data. LINE:'.__LINE__.'<br/>';
    062.                return false;
    063.            }
    064.            if(!$this->image)
    065.            {   
    066.                echo 'ERROR: uninilitialized image resource. LINE:'.__LINE__.'<br/>';
    067.                return false;
    068.            }
    069.            // 批量添加颜色   
    070.            foreach($colors as $colKey=>$colVal)
    071.            {
    072.                if(!is_array($colVal) || count($colVal) < 3)
    073.                    continue;
    074.                $rgb = array();
    075.                foreach($colVal as $val)
    076.                {
    077.                    $rgb[] = (int)$val;
    078.                }
    079.                self::$colors[$colKey] = imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2]);
    080.            }
    081.            return true;
    082.        }
    083.        /**
    084.         * 设置背景色,请保证$x,$y坐标位于画布内
    085.         * @param colorName string 添加过的颜色对应的名称
    086.         */
    087.        public function fillBackgroundColor($x = 0, $y = 0, $colorName = 'yello_back')
    088.        {
    089.            if($this->image && isset(self::$colors[$colorName]))
    090.            {
    091.                return imagefill($this->image, $x, $y, self::$colors[$colorName]);
    092.            }
    093.            else
    094.            {
    095.                echo 'ERROR: fill background color failed. LINE:'.__LINE__.'<br/>';
    096.                return false;
    097.            }
    098.        }
    099.        /**
    100.         * 创建随机验证码
    101.         */
    102.        private function createVCode()
    103.        {
    104.            $chars = '23456789'.'abcdefghjkmn'.
    105.                     'pqrstuvwxyz'.'ABCDEFG'.
    106.                     'HJKLMNPQRSTUVWXYZ';
    107.            $this->vcodes = '';
    108. 
    109.            for($i = 0; $i < $this->codeNum; $i++)
    110.            {
    111.                $this->vcodes .= $chars[mt_rand(0, strlen($chars)-1)];
    112.            }
    113.            return true;
    114.        }
    115.        /**
    116.         * 在画布上画出验证码
    117.         * 字体的大小、颜色、位置随机变化
    118.         */
    119.        private function drawVCode()
    120.        {
    121.            if($this->image === false)
    122.                return false;
    123.            if($this->vcodes)
    124.            {
    125.                for($i = 0; $i < $this->codeNum; $i++)
    126.                {
    127.                    $font_size = mt_rand(3, 5);
    128.                    $x = $i * floor($this->width / $this->codeNum) + 2;
    129.                    $y = mt_rand(0, $this->height-imagefontheight($font_size));
    130.                    $color = imagecolorallocate($this->image, mt_rand(0, 128), mt_rand(0, 128), mt_rand(0, 128));
    131.                    imagechar($this->image, $font_size, $x, $y, $this->vcodes[$i], $color);
    132.                }
    133.                return true;
    134.            }
    135.            return false;
    136.        }
    137.        /**
    138.         * 绘制图像
    139.         */
    140.        private function generateImage()
    141.        {
    142.            if(!$this->image)
    143.            {
    144.                echo 'ERROR: invalid image resource. LINE: '.__LINE__.'<br/>';
    145.                return false;
    146.            }
    147.            // 获取当前GD库支持的图片类型,绘制图像
    148.            if(imagetypes() & IMG_PNG)
    149.            {
    150.                header('Content-Type: image/png');
    151.                imagepng($this->image);
    152.            }
    153.            else if(imagetypes() & IMG_JPG)
    154.            {
    155.                header('Content-Type: image/jpg');
    156.                imagejpeg($this->image);
    157.            }
    158.            else if(imagetypes() & IMG_GIF)
    159.            {
    160.                header('Content-Type: image/gif');
    161.                imagegif($this->image);
    162.            }
    163.            else if(imagetypes() & IMG_WBMP)
    164.            {
    165.                header('Content-Type: image/vnd.wap.wbmp');
    166.                imagejpeg($this->image);
    167.            }
    168.            else
    169.            {
    170.                exit('this version do not support creating image!');
    171.            }
    172. 
    173.        }
    174.        /**
    175.         * 输出图像
    176.         * @param colorName type string|array('key'=>array(int, int, int),)
    177.         */
    178.        public function outputImage($color = 'yello_back', $x = 0, $y = 0)
    179.        {
    180.            // 初始化图像资源变量
    181.            $this->getImage();
    182.            // 创建验证码字符串    
    183.            $this->createVCode(); 
    184.            // 填充背景色
    185.            if(is_string($color) && isset(self::$colors[$color])) //传入字符串时判断已有颜色数组中是否有
    186.            {
    187.                $this->fillBackgroundColor($x, $y, $color);
    188.            }
    189.            else if(is_array($color) && count($color) == 1 && $this->addColors($color)) // 传入数组进行添加和填充,只能传入一种颜色
    190.            {
    191.                $colorName = array_keys($color);
    192.                $this->fillBackgroundColor($x, $y, $colorName[0]);
    193.            }
    194.            else      // 否则使用默认背景色填充
    195.            {
    196.                $this->fillBackgroundColor($x, $y, 'yello_back');
    197.            }
    198.            // 画验证码字符
    199.            $this->drawVCode();
    200.            // 生成图像
    201.            $this->generateImage();
    202.            return '';
    203.        }
    204.        /**
    205.         * 释放资源
    206.         */
    207.        public function __destruct()
    208.        {
    209.            if($this->image)
    210.                imagedestroy($this->image);
    211.        }
    212.    }
    213.    // test1: 默认4个字符
    214.    $vcodeObj = Validcode::getInstance();
    215.    $vcodeObj->outputImage();*/
    216.    /*
    217.    // test2: 3个字符
    218.    $vcodeObj = Validcode::getInstance(3);
    219.    $vcodeObj->outputImage(); // 3个字符*/
    220.    /*
    221.    // test3: 设置成5个字符,且图片长宽不合理,使用对象内部调节
    222.    $vcodeObj = Validcode::getInstance(5, 1, 1);
    223.    // 输出时传入颜色值,替换背景色
    224.    $vcodeObj->outputImage(array('col'=>array(255, 255, 0)));
    225.    */

      三个测试输出的结果:

            

      效果还行,首先是构造函数,来设置长宽和生成验证码个数,个数定为3到5个,长宽设置最小的话要容得下几个字符的宽度(测试3),否则就有显示不完全了,$codeNum为验证码个数,$weight、$height为图像宽高,$image为图像句柄变量,$colors是一个数组存放可能用到的背景色,$vcodes是验证码字符串。getImage方法获取图像句柄,并添加一个默认的颜色值,作为备用。addColors方法可批量添加颜色,fillBackgroundColor执行填充图像背景色,createVCode创建随机验证码,大小写、数字随机组合,drawVCode在画布上画出验证码,这里穴ky"http://www.it165.net/qq/" target="_blank" class="keylink">qqxo9ak0enWpL751Mi31rK81Nq7rbK8yc+jrMnPz8K437bIy+a7+qOs0dXJq8vmu/qho2dlbmVyYXRlSW1hZ2W4+b7dtbHHsNans9a1xM28xqzA4NDNo6zJ6NbDzbfQxc+io6yyzr+8udnN+MrWsuG1xMq+wP20+sLroaM8L3A+CjxwPqGhoaHX7rrz0ru49m91dHB1dEltYWdlvdO/2srHvavS1MnPt723qNfpus+jrLXa0ru49rLOyv3UytDt1NrK5LP20enWpMLryrHTw7Srtd21xMmr1rW0+szmtbHHsLG408O1xLGzvrDJq6Os0rK/ybSryOvX1rf7tK7D+6Os1Nqxs76wyavW0NGw1dK21NOmyavWtcr91+myoszus+SjrLWxyLthZGRDb2xvcnPKx7mr09C1xL3Tv9qjrNKyv8nPyLX308PL/MztvNPE47XEsbO+sMmr1rWjrNTZtfdmaWxsQmFja2dyb3VuZENvbG9yzO6z5KOs1Nm199PDb3V0cHV0SW1hZ2W0q8jrttTTptHVyau8/MP7vLS/yaGj0OjSqtei0uK1xMrHo6xmaWxsQmFja2dyb3VuZENvbG9yt723qMzus+Sxs76wyavKsaOs1/ix6ta1JHihoiR50ru2qNKqtffV+9Tau62yvMTao6y38dTyzO6z5M7e0KejrNXiwO/Wu8rHvPK1pdHdyr6jrM28xqzOu9Pa5K/AwMb31/PJz73Ho6zL+dLU1rG908rHKDAsMCmjrLfFtb3Ss8PmxuTL+8671sO1xLuw16LS4rzGy+PX+LHqo6zV4sDvyse+ocG/zby88rWlwcuhozwvcD4KPHA+oaGhobK7vfbKx9Hp1qTC68HLo6zNvMasvNPLrtOh0rK/ydLU1eLDtLjJo6zSu7j2tcDA7X48L3A+CjxwPqGhoaHHsMPmyuSz9tOizsTX1rf7tK6686Os19TIu7b4yLujrM7Sw8e+zb/J0tTP67W9xNy38bvm1sbW0M7Eo6zIt8q1v8nS1KGjx7DD5su1wctHRL/i1tDT0Lj2RnJlZVR5cGW1xNfWzOXS/cfmo6y2+HBocMzhuanBy2ltYWdlZnR0ZXh0us1pbWFnZXR0ZsG9uPa3vbeox7DV38rHPC9wPgo8cD4mbmJzcDu9q0ZyZWVUeXBlIDIg19bM5dC0yOvNvM/xo6y689Xfyse9q1RydWVUeXBl19bM5dC0yOvNvM/xo6yy6cHLz8KjrNXiuPZUcnVlVHlwZcvjysdGcmVlVHlwZbXE19OzydSxo6zL+dLUx7DV38v51qez1rXE19bM5b/iuPy24KOs08PL/Lj809Cxo9akoaPKtbzKyc9XaW7Jz8Pm19S0+NPQ19bM5aOs1NpDOlxXaW5kb3dzXEZvbnRzo6hDxczOqrCy17DFzMqxo6nPwsPmo6y6w8/xsrvKx8O/1ta2vMTcxMPAtNPDo6zRocHL0ru49rrazOXN5tK7z8I8L3A+Cgo8cHJlIGNsYXNzPQ=="brush:java;"><?php $width = 300; $heiht = 300; $image = imagecreatetruecolor($width, $heiht); $yellow = imagecolorallocate($image, 0xff, 0xe6, 0xa4); $blue = imagecolorallocate($image, 0x40, 0x99, 0xff); // 填充背景 imagefilledrectangle($image, 0, 0, $width, $heiht, $yellow); // 字体文件 //$fontfile = str_replace('\\', '/', 'C:\Windows\Fonts\simsun.ttc'); $fontfile = str_replace('\\', '/', 'C:\Windows\Fonts\simhei.ttf'); $text = '世界如此美妙,我却如此暴躁'; // 需要转换编码吗? //$text = iconv('ANSI', 'UTF-8', $text); // 画文字,text需要时UTF-8编码 imagettftext($image, 12, 0, 20, 50, $blue, $fontfile, $text); // 输出图像 header('Content-Type:image/png'); imagepng($image); imagedestroy($image);

      效果: 

      在使用字体时,偶发现simsun.ttc这个是简体中文,扩展是.ttc,但是用imagettftext也能用。另,如果你的编辑器编辑的代码不是UTF-8编码,需要使用iconv将文本编码转换过来,特别是文本变量是从数据库中读取时,但是你懂的,什么ANSI、GBK、GB2312等转换为UTF-8时,不出意外会是乱码-_-#。既然能用字体了,就到网上扒了几个免费字体玩了下(比如这个http://www.freefontscenter.com/),这个测试程序前提是需要下载对应字体文件,放到指定目录,注意有的字体扩展是.otf,这个OpenType字体,用imagettftext就不行啦,要用imagefttext ~

    view sourceprint?
    01.<?php
    02.     
    03.    $width = 600; $heiht = 150;
    04.    $image = imagecreatetruecolor($width, $heiht);
    05.    // 添加颜色
    06.    $blue = imagecolorallocate($image, 0x40, 0x99, 0xff); #229cdc
    07.    $green = imagecolorallocate($image, 0x59, 0x98, 0x3b);
    08.    $yellow = imagecolorallocate($image, 0xff, 0xe6, 0xa4);
    09.    // 填充背景
    10.    imagefilledrectangle($image, 0, 0, $width, $heiht, $yellow);
    11. 
    12.    $text = 'lazycat';
    13.    // 1
    14.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\Maiandra_GD.ttf');
    15.    imagefttext($image, 17, 0, 5, 50, $green, $fontfile, $text);
    16.    // 2
    17.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\black_jack.ttf'); 
    18.    imagefttext($image, 17, 0, 85, 50, $green, $fontfile, $text); 
    19.    // 3
    20.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\OpenSans-Italic.ttf'); //
    21.    imagefttext($image, 17, 0, 155, 50, $green, $fontfile, $text);
    22.    // 4
    23.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\Amatic-Bold.ttf');
    24.    imagefttext($image, 17, 0, 235, 50, $green, $fontfile, $text);
    25.    // 5
    26.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\free\Santana-RegularCondensed.ttf');
    27.    imagefttext($image, 17, 0, 290, 50, $green, $fontfile, $text);
    28.    // 6
    29.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\free\veteran_typewriter.ttf');
    30.    imagefttext($image, 17, 0, 345, 50, $green, $fontfile, $text);
    31.    // 7
    32.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\free\LondrinaOutline-Regular.ttf');
    33.    imagefttext($image, 20, 0, 440, 50, $green, $fontfile, $text);
    34.    // 8
    35.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\free\SCRATCHM.ttf');
    36.    imagefttext($image, 17, 0, 5, 100, $green, $fontfile, $text);
    37.    // 9
    38.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\free\tiza.ttf');
    39.    imagefttext($image, 17, 0, 150, 100, $green, $fontfile, $text);
    40.    // 10
    41.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\free\texgyrecursor-regular.otf');
    42.    imagefttext($image, 17, 0, 325, 100, $green, $fontfile, $text);
    43.    // 11
    44.    $fontfile = str_replace('\\', '/', 'G:\wamp\fonts\free\yukarimobil.ttf');
    45.    imagefttext($image, 17, 0, 430, 100, $green, $fontfile, $text);
    46.    // 输出图像
    47.    header('Content-Type:image/png');
    48.    imagepng($image);
    49.    imagedestroy($image);

      效果:

          

      非常炫酷有木有!>3<

转载于:https://www.cnblogs.com/zonglonglong/p/5435786.html

php 图片加水印文字水印相关推荐

  1. SpringBoot html转pdf 支持中文、图片水印+文字水印、页眉页脚 flying-saucer-pdf-itext5 + freemarker

    使用 flying-saucer-pdf-itext5加freemarker生成pdf,支持中文.图片水印+文字水印.页眉页脚. 引入jar包 <!-- freemarker --> &l ...

  2. python图片增加半透明文字水印

    本次使用 python 的 PIL 库来对图像进行处理. 水印效果 代码如下 __author__ = "dengxinyan"from PIL import Image, Ima ...

  3. ImageUtils.java:图片处理工具类[裁剪/图片水印/文字水印/缩放补白/Base64加密解密]

    用到的jar包: commons-beanutils-1.8.0.jar commons-codec-1.10.jar package com.zhenzhigu.commons.util;   im ...

  4. java图片加气泡文字,动态图片加气泡文字 微信动态图片加文字教程

    现在微信聊天少不了表情图片,这越有个性.独特的就越受大众喜爱,每每看到好看的图片时,大家也会忍不住收藏起来用.那你有没有想过自己P图呢?学一下PS图片创作一些独一无二的搞笑表情图,放在微信上秀秀吧,也 ...

  5. java图片加气泡文字_图片加气泡文字

    现在微信聊天少不了表情图片,这越有个性.独特的就越受大众喜爱,每每看到好看的图片时,大家也会忍不住收藏起来用.那你有没有想过自己P图呢?学一下PS图片创作一些独一无二的搞笑表情图,放在微信上秀秀吧,也 ...

  6. ffmpeg学习心得之一键处理视频图片合成加图片水印文字水印裁剪

    学了一个晚上,下面是我写的批处理 window命令行批处理直接拖文件夹或者拖动视频或者拖动音频可一键生成mp4.或者批量生成图片,或者生成gif https://download.csdn.net/d ...

  7. python给图片加半透明水印_图片添加半透明文字水印 Python

    效果 python marker.py -f ./input/test.png -m '添加水印' 功能 使用知名python图片处理库PIL,为图片添加文字水印. 实现 步骤:根据文字生成水印图片: ...

  8. 利用Python脚本给图片批量添加文字水印

    引言:本人从小白自学python,为了测试基础学习效果,增加一定的促进,想通过参加全国计算机等级考试二级python来检验基础学习情况.在学习过程中,会将该过程编写的python小程序题目在此发表,希 ...

  9. 一个巧妙的方法,解决Linux或者Mac环境加中文文字水印时出现小方格的问题![亲测可用]

    问题场景: 笔者所在的SpringCloud项目中有较为常见的需求,那就是用户上传图片时需要生成文字水印,用于标识该图片的出处.项目使用HuTool工具生成文字水印(可选用其他水印生成工具,效果都差不 ...

最新文章

  1. SGML与HTML、XML
  2. linux C语言之called object ‘maze’ is not a function or function pointer printf(“%d\t“, maze(i, j))
  3. java urlencode php_PHP如何使用urlencode()函数进行url编码?(代码示例)
  4. C语言 二分法查找数组元素
  5. python的设计具有很强的可读性_Python是什么?具有怎么样的特点呢?
  6. swf文件数据格式分析
  7. hbase命令snapshot快照使用
  8. bat批处理文件转成exe应用程序安装及乱码解决
  9. 正则表达式判断手机号码
  10. 重温经典,续写传奇,迈巴赫S600改铱银色加铁灰色双拼喷漆
  11. PyQt5 基本语法(一):基类控件
  12. Justinmind使用教程(2)——计算表达式及条件用法
  13. 初识SRC漏洞平台提交漏洞
  14. 实验三 类与对象(zxt)
  15. 微信豆有什么作用?微信豆怎么用?附攻略
  16. python找出列表里大于输出_python找出列表中大于某个阈值的数据段示例
  17. java学习路线规划
  18. 推荐电影 经典美剧
  19. 网站的布局类型有哪些,想知道吗?
  20. 流行的通讯库/消息中间件

热门文章

  1. 按TAB键锁定计算机,一按tab键,电脑就关机了!
  2. wolai一款不错的国产笔记协作平台!可替代notion的协同平台
  3. 网站统计访问次数的方法
  4. android 授予root权限,关于android手机获得ROOT权限问题
  5. how2j学习_第一部分_JAVA基础
  6. 物联lot是什么意思_新一代基于物联网NB-loT技术的智能共享单车解决
  7. 微信小程序云开发之云函数使用
  8. pytorch set seed
  9. 2022-03-02每日刷题打卡
  10. 如何在elementUi动态表格table中翻译字典值。vue通用方案