PHP图像系统

PHP 并不仅限于创建 HTML 输出, 它也可以创建和处理包括 GIF, PNG, JPEG, WBMP 以及 XPM 在内的多种格式的图像。 更加方便的是,PHP 可以直接将图像数据流输出到浏览器。 要想在 PHP 中使用图像处理功能,你需要连带 GD 库一起来编译 PHP。 GD 库和 PHP 可能需要其他的库, 这取决于你要处理的图像格式。

创建画布

imagecreatetruecolor ( int $width , int $height ) : resource
  • 传入的两个参数分别为画布的宽和高,在绘制时超出的宽高的部分将不予显示,且此尺寸即为生成图片文件时的尺寸。
  • 返回值为资源类型。

设置颜色

imagecolorallocate ( resource $image , int $red , int $green , int $blue ) : int
  • 颜色从属于某个图像资源而存在。
  • 颜色实际上是一个整型数字。
  • 颜色的后三个参数需要传入的值范围是0~255。
imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha ) : int
  • 这个方法可以设置颜色透明度。
  • 透明度:介于0到127之间的值。 0表示完全不透明,而127表示完全透明。

填充颜色

imagefill ( resource $image , int $x , int $y , int $color ) : bool
  • x和y表示从哪个点坐标点开始填充。
  • 如果不设置默认为黑色。

输出图像

输出不同格式的图像用不同的方法:

  • function imagegif ($image, $filename = null) {}
    • $filename:将文件保存到的路径。如果未设置或null;,则原始图像流将直接输出。
  • function imagejpeg ($image, $filename = null, $quality = null) {}
    • $filename:和上面的方法一样。
    • $quality:可选的,范围从0(最差质量,较小的文件)到100(最佳质量,最大文件)。 默认值是默认的IJG质量值(大约75)。
  • function imagepng ($image, $filename = null, $quality = null, $filters = null) {}
    • $filename:和上面的方法一样。
    • $quality:压缩级别:从0(无压缩)到9。
    • $filters:允许减小png文件的大小。它是一个位掩码字段,可以将其设置为png_filter_xxx常量的任意组合。 png_no_filter或png_all_filters也可以分别用于禁用或激活所有过滤器。
  • function imagebmp ($image, $to = null, $compressed = true) {}
    • $to:将文件保存到的路径或开放流资源(此函数返回后将自动关闭)。如果未设置或NULL,则原始图像流将直接输出。
    • $compressed:是否应使用游程长度编码(RLE)压缩BMP。
  • function imagewebp ($image, $to = null, $quality = 80) {}
    • $to:将文件保存到的路径。如果未设置或null ;,则原始图像流将直接输出。
    • $quality:质量范围从0(质量最差,文件较小)到100(质量最好,文件最大)。
imagegif ( resource $image [, mixed $to = NULL ] ) : bool
imagejpeg ( resource $image [, mixed $to = NULL [, int $quality = -1 ]] ) : bool
imagepng ( resource $image [, mixed $to = NULL [, int $quality = -1 [, int $filters = -1 ]]] ) : bool
imagebmp ( resource $image [, mixed $to = NULL [, bool $compressed = TRUE ]] ) : bool
imagewebp ( resource $image [, mixed $to = NULL [, int $quality = 80 ]] ) : bool

释放图像

imagedestroy ( resource $image ) : bool
  • 图像输出完毕及时释放资源,把内存空间留给更需要的程序。

输出一个背景为红色的png图片

header('Content-Type:image/png');
$res = imagecreatetruecolor(500, 500);
$color = imagecolorAllocate($res, 255, 0, 0);
imagefill($res, 0, 0, $color);
imagepng($res);
imagedestroy($res);

绘制矩形

绘制空心矩形。

imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) : bool
  • x1和y1为开始坐标点。
  • x2和y2为结束坐标点。

绘制实心矩形。

imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) : bool
  • 参数都和上方一样

绘制圆形

绘制空心矩形。

imageellipse ( resource $image , int $cx , int $cy , int $width , int $height , int $color ) : bool
  • cx和cy为圆心的坐标,width和height为宽高。

绘制实心圆形

imagefilledellipse ( resource $image , int $cx , int $cy , int $width , int $height , int $color ) : bool
  • 参数和上方一样。

绘制线条

下方的方法一定要放在**imageline()**方法上。

imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ) : bool
  • x1和y1为开始坐标点。
  • x2和y2为结束坐标点。

绘制线条样式

设置宽度

imagesetthickness ( resource $image , int $thickness ) : bool
  • 宽度: 单位为像素。

设置样式

imagesetstyle ( resource $image , array $style ) : bool
  • 设置画线的样式。
  • 设置也是后,线条要使用常用IMG_COLOR_STYLED声明。

绘制像素点

imagesetpixel ( resource $image , int $x , int $y , int $color ) : bool
  • x和y为坐标点。

输入文本

imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text ) : array
  • 参数说明:图像资源,字体尺寸,角度,第一个字符的基本点(大概是字符的左下角),Y 坐标(字体基线的位置),颜色 ,字体文件,文本字符串(UTF-8 编码)
header('Content-Type:image/png');
$res = imagecreatetruecolor(500, 500);
$yellow = imagecolorAllocate($res, 255, 255, 0);
$font = realpath("NotoSansSC-Bold.otf");
imagettftext($res, 50, 0, 0, 50, $yellow, $font, "Hello World");
imagepng($res);
imageDestroy($res);

取得使用 TrueType 字体的文本的范围

imagettfbbox ( float $size , float $angle , string $fontfile , string $text ) : array
  • 文本范围的盒子大小,可以方便控制文本输出位置
  • 返回一个含有 8 个单元的数组表示了文本外框的四个角:
变量位置
0左下角 X 位置
1左下角 Y 位置
2右下角 X 位置
3右下角 Y 位置
4右上角 X 位置
5右上角 Y 位置
6左上角 X 位置
7左上角 Y 位置

文字在画布右上角显示

$font = realpath("NotoSansSC-Bold.otf");
$text = 'Hello World';
$size = 16;
$box = imagettfbbox($size, 0, $font, $text);
$width  = $box[2] - $box[0];
$height = $box[0] - $box[7];
imagettftext($res, $size, 0, 500 - $width, $height, $green, $font, $text);

文字在画布中间显示

$font = realpath("NotoSansSC-Bold.otf");
$text = 'Hello World';
$size = 16;
$box = imagettfbbox($size, 0, $font, $text);
$width  = $box[2] - $box[0];
$height = $box[0] - $box[7];
imagettftext($res, $size, 0, 250 - $width / 2, 250 - $height / 2, $green, $font, $text);

插入图像

imagecreatefromgif ( string $filename ) : resource
imagecreatefromjpeg ( string $filename ) : resource
imagecreatefrompng ( string $filename ) : resource
imagecreatefrombmp ( string $filename ) : resource
imagecreatefromwebp ( string $filename ) : resource

演示:

header('Content-Type: image/png');
$img = imagecreatefrompng('image.png');
imagepng($img);
imagedestroy($img);

获取图像信息

获取宽度
imagesx ( resource $image ) : int
获取高度
imagesy ( resource $image ) : int
获取大小
getimagesize ( string $filename [, array &$imageinfo ] ) : array

图像复制

拷贝图像的一部分。

imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h ) : bool

拷贝并合并图像的一部分。

imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct ) : 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 ) : bool