• PHP图像处理(GD库)


    一、图像处理概述

    1、开启GD2图像扩展库

    PHP不仅限于只产生HTML的输出,还可以创建与操作多种不同格式的图像文件。PHP提供了一些内置的图像处理函数,也可以使用GD函数库创建新图像或处理已有的图像。目前GD2库支持JPEG、PNG和WBMP格式。
    ②GD扩展用于动态创建图片,使用C语言编写,开放源代码,现在的版本是2.0,所以称为GD2。

    ③开启GD2扩展库:将php.ini中extension=php_gd2.dll选项前的分号去掉,重启。图片.png

    图片.png

    2、查看图像拓展库GD2是否开启

    图片.png

    图片.png

    图片.png

    图片.png

    3、创建图像的大致步骤

    ①创建画布:创建一个画布,以后的操作都基于此画布操作;
    ②绘制图形:在画布上绘制图像轮廓或输入文本;
    ③输出图像:也可以另存为;

    ④释放资源:释放图像占用的内存资源。图片.png

    图片.png

    4、画布坐标系说明

    下图说明了画布的坐标系。坐标原点位于画布左上角,以像素为单位。图片.png

    图片.png

    二、创建图像和销毁图像

    1、创建基于已有图像的图像imagecreatefromjpeg()

    1)描述:由文件或 URL 创建一个新图象。
    2)语法:resource imagecreatefrompng ( string $filename )

    3)参数:$filename为图像的完整路径。
    4)返回:成功后返回图象资源,失败后返回 FALSE 。
    5)提示:imagecreatefrompng()imagecreatefromgif()语法与该函数一样。
    示例:

    1.  
      //从已知背景上来创建画布
    2.  
      //成功返回图片资源型数据,失败返回false
    3.  
      $filename="./abc.jpg";
    4.  
      $img=imagecreatefromjpeg($filename);
    5.  
      //告诉浏览器以图像数据来显示
    6.  
      header("content-type:image/jpeg");
    7.  
      //输出图像
    8.  
      imagejpeg($img);
    9.  
      //关闭图像释放资源
    10.  
      imagedestroy($img);

    图片.png

    图片.png

    2、创建空画布图像imagecreatetruecolor()

    1)描述:新建一个真彩色图像,支持24位色,即RGB(256,256,256)。
    2)语法:resource imagecreatetruecolor ( int $width , int $height )
    3)参数:$width图像宽度;$height图像高度;
    4)返回:成功后返回图象资源,失败后返回 FALSE 。
    示例:

    1.  
      //创建一个空画布
    2.  
      $img=imagecreatetruecolor(300,300);
    3.  
      //告诉浏览器以图像数据来显示
    4.  
      header("content-type:image/jpeg");
    5.  
      //输出图像
    6.  
      imagejpeg($img);
    7.  
      //关闭图像释放资源
    8.  
      imagedestroy($img);

    图片.png

    图片.png

    3、销毁图像资源imagedestroy()

    1)描述:销毁一图像。释放与 image图像标识符关联的内存。
    2)语法:bool imagedestroy ( resource $image )

    3)参数:$image为由imagecreatetruecolor()创建的图像标识符。

    三、图像操作

    1、为图像分配颜色imagecolorallocate()

    1)语法:int imagecolorallocate(resource $image,int $red,int $green,int $blue)
    2)参数:$image图像资源标识符;
    3)提示:第一次对 imagecolorallocate()的调用会给图像填充背景色。

    图片.png

    图片.png

    2、输出图像到浏览器或保存文件imagejpeg()

    1)描述:以 JPG/GIF/PNG 格式将图像输出到浏览器或文件
    2)语法:bool imagejpeg ( resource $image [, string $filename [, int $quality ]] )

    3)参数:
    a、$filename,将创建的图像保存到文件;如果省略,则直接在浏览器输出。
    b、如果要省略这个参数而提供 quality 参数,使用NULL。
    c、quality 为可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认的质量值(大约 75)。
    4)提示:imagegif()、imagepng(),与imagejpeg()格式一样,但没有第3个参数。
    示例:

    1.  
      //创建一个空画布
    2.  
      $img=imagecreatetruecolor(300,300);
    3.  
       
    4.  
      //给画布分配颜色
    5.  
      //十进制表示方法
    6.  
      $color=imagecolorallocate($img,255,255,0);
    7.  
       
    8.  
      //绘制带填充的矩形
    9.  
      imagefilledrectangle($img,30,30,100,80,$color);
    10.  
       
    11.  
      //保存图像,如果文件夹内有重名文件会覆盖
    12.  
      //注意:质量只针对jpg格式图片有效
    13.  
      imagejpeg($img,'./fuben/fuben.jpeg',100);
    14.  
      imagegif($img,'./fuben/fuben.gif');
    15.  
      imagepng($img,'./fuben/fuben.png');
    16.  
       
    17.  
      //关闭图像释放资源
    18.  
      imagedestroy($img);

    指定文件夹内产生如下文件:图片.png

    图片.png

    3、水平地画一行字符串imagestring()

    1)语法:bool imagestring(resource $img,int $font,int $x,int $y,string $s,int $col)
    2)参数:

    1.  
      a、$img 图像资源;
    2.  
       
    3.  
      b、$font字体大小,取值12345,使用内置字体;
    4.  
       
    5.  
      c、$x,$y绘制字符串的开始坐标,一般在字符串左上角;
    6.  
       
    7.  
      d、$s 代表要绘制的一行字符串;
    8.  
       
    9.  
      e、$col 代表文本颜色。
    10.  
       
    11.  
      f、$s,代表一行字符串;$col,代表文本颜色;

    4、获取画布的宽度和高度

    1)宽度:int imagesx ( resource $image )
    2)高度:int imagesy ( resource $image )

    5、获取内置字体的宽度和高度

    1)描述:返回指定字体一个字符宽度或高度的像素值。
    2)字体宽度:int imagefontwidth ( int $font )
    3)字体高度:int imagefontheight ( int $font )
    4)提示:$font为字体大小,取值1-5,最大为5。

    6、画一矩形并填充

    1)语法:bool imagefilledrectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
    2)参数:

    1.  
      a、$x1 , $y1 左上角坐标;
    2.  
      b、$x2 , $y2 右上角坐标;
    3.  
      c、$color 填充背景色。

    综合示例:在画布上居中显示字符串

    1.  
      //创建一个空画布
    2.  
      $width=300;
    3.  
      $height=200;
    4.  
      $img=imagecreatetruecolor($width,$height);
    5.  
      //给画布分配颜色
    6.  
      $color1=imagecolorallocate($img,200,200,200);
    7.  
      $color2=imagecolorallocate($img,200,0,0);
    8.  
      //绘制带填充的矩形
    9.  
      imagefilledrectangle($img,0,0,$width,$height,$color1);
    10.  
      //往画布上写一行居中的字符串
    11.  
      $font=5;
    12.  
      $str='Hello world!';
    13.  
      $fontwidth=imagefontwidth($font);
    14.  
      $fontheight=imagefontheight($font);
    15.  
      $x=($width-$fontwidth*strlen($str))/2;
    16.  
      $y=($height-$fontheight)/2;
    17.  
       
    18.  
      imagestring($img,$font,$x,$y,$str,$color2);
    19.  
       
    20.  
      //声明网页内容类型为图像
    21.  
      header("content-type:image/png");
    22.  
      //输出图像
    23.  
      //此处细节,用png更清楚,如果用jpeg格式文字周边会稍有模糊
    24.  
      imagepng($img);
    25.  
      //销毁图像
    26.  
      imagedestroy($img);

    结果如下:图片.png

    图片.png

    7、画一个单一像素

    1)描述:画一个单一像素
    2)语法:bool imagesetpixel ( resource $image , int $x , int $y , int $color )
    3)说明:imagesetpixel() 在 image图像中用 color颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。

    8、用 TrueType 字体向图像写入文本

    1)语法:array imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
    2)参数:

    1.  
      a、$size,字号大小,自定义,同word字号一样;
    2.  
      b、$angle,旋转角度(0~360);
    3.  
      c、$x和$y,定义了第一个字符的基本点(大概是字符的左下角)。
    4.  
      d、$fontfile,是想要使用的 TrueType 字体的绝对路径;
    5.  
      e、$text,UTF-8 编码的文本字符串(其它编码要进行转换)。

    9、为图像分配透明颜色imagecolorallocatealpha()

    1)语法:int imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha )
    2)说明:imagecolorallocatealpha() 的行为和 imagecolorallocate() 相同,但多了一个额外的透明度参数 alpha,其值从 0 到 127。0表示完全不透明,127 表示完全透明。

    示例:水印制作

    1.  
      //创建画布
    2.  
      $img=imagecreatetruecolor(300,200);
    3.  
      $color=imagecolorallocate($img,200,200,200);
    4.  
      //设置透明颜色
    5.  
      $color_alpha=imagecolorallocatealpha($img,0,0,255,100);
    6.  
      //设置画布背景色
    7.  
      imagefilledrectangle($img,0,0,300,200,$color);
    8.  
      //设置水印文字
    9.  
      imagettftext($img,30,0,130,170,$color_alpha,'./font/ygy.ttf','图片水印');
    10.  
      //输出画布图像
    11.  
      header("content-type:image/png");
    12.  
      imagepng($img);
    13.  
      imagedestroy($img);

    结果如下:


    图片.png

    图片.png

    10、生成图像缩略图

    1)描述:将一幅图像中的一块正方形区域拷贝到另一个图像中,平滑地插入像素值,因此,尤其是,减小了图像的大小而仍然保持了极大的清晰度。
    2)语法:bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
    3)参数:

    1.  
      a、$dst_image,目标图像;
    2.  
      b、$src_image,源像图;
    3.  
      c、$dst_x和$dst_y,目标图像x、y坐标;
    4.  
      d、$src_x和$src_y,源图像x、y坐标;
    5.  
      e、$dst_w和$dst_h,目标图像的宽度和高度;
    6.  
      f、$src_w和$src_h,源图像的宽度和高度;

    4)提示:如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。
    示例:

    1.  
      //从已知背景上来创建画布
    2.  
      $img_src = imagecreatefromjpeg('./img/abc.jpg');
    3.  
      $src_w = imagesx($img_src);
    4.  
      $src_h = imagesy($img_src);
    5.  
      //创建缩略画布
    6.  
      $dst_w = $src_w*0.5;
    7.  
      $dst_h = $src_h*0.5;
    8.  
      $img_dst = imagecreatetruecolor($dst_w,$dst_h);
    9.  
      //复制原图像素并插入到缩略图中
    10.  
      imagecopyresampled($img_dst,$img_src,0,0,0,0,$dst_w,$dst_h,$src_w,$src_h);
    11.  
      //保存并关闭图像释放资源
    12.  
      imagejpeg($img_dst,'./img/abc_dst.jpg');
    13.  
      imagedestroy($img_src);
    14.  
      imagedestroy($img_dst);

    结果如下:图片.png

    图片.png

  • 相关阅读:
    深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis
    深入理解Spring Redis的使用 (二)、RedisTemplate事务支持、序列化
    Elasticsearch 评分score计算中的Boost 和 queryNorm
    Docker 镜像构建的时候,应该小心的坑
    怎么给kibana加上权限?
    网站异常了,日志要怎么看?
    使用 Gradle 配置java项目
    Cassandra 类型转换限制
    Elasticsearch 排序插件的开发
    ElasticSearch 2.0以后的改动导致旧的资料和书籍需要订正的部分
  • 原文地址:https://www.cnblogs.com/zst062102/p/10524732.html
Copyright © 2020-2023  润新知