php GD图像处理

2021-03-19

图片处理函数相当占用内存
支持格式 JPEG,PNG,GIF,XBM,XPM,WBMP,WebP,BMP;XPM只支持读取,其他全部支持读写

注:函数的颜色参数全部需要使用imagecolorallocate/imagecolorallocatealpha获取颜色标识符

  1. 获取图片对象
  2. 创建/销毁图片对象
  3. 获取图片信息
  4. 设置图片颜色
  5. 拷贝图片颜色
  6. 设置图片分辨率
  7. 设置图片抗锯齿
  8. 图片裁剪
  9. 图片旋转
  10. 图片缩放
  11. 设置图像画笔
  12. 绘制椭圆
  13. 绘制多边形
  14. 绘制线段
  15. 加载字体
  16. 获取字体信息
  17. 绘制文字
  18. 绘制填充区域
  19. 图片复制
  20. 图片过滤算法
  21. 输出图片
  22. 转换WBMP格式图片
  23. windwos环境截图
  24. 获取GD库信息

获取图片对象

// 获取GIF格式图像文件$filename的图片资源,失败后返回false
imagecreatefromgif(string $filename):resource

// 获取JPEG格式图像文件$filename的图片资源,失败后返回false
imagecreatefromjpeg(string $filename):resource

// 获取PNG格式图像文件$filename的图片资源,失败后返回false
imagecreatefrompng(string $filename):resource

// 获取WBMP格式图像文件$filename的图片资源,失败后返回false
imagecreatefromwbmp(string $filename):resource

// 获取WebP格式图像文件$filename的图片资源,失败后返回false
imagecreatefromwebp(string $filename):resource

// 获取XBM格式图像文件$filename的图片资源,失败后返回false
imagecreatefromxbm(string $filename):resource

// 获取XPM格式图像文件$filename的图片资源,失败后返回false
imagecreatefromxpm(string $filename):resource

// 获取bmp格式图像文件$filename的图片资源,失败后返回false
imagecreatefrombmp(string $filename):resource

// 获取图像内容$image的图片资源,图像格式自动检测;不支持的图像或数据不是图像格式获取图像损坏返回false
imagecreatefromstring(string $image);

创建/销毁图片对象

// 创建一个宽为$x_size高为$y_size的空白图像,失败后返回false
imagecreate($x_size, $y_size);

// 创建一个宽为$x_size高为$y_size的空白图像的黑色图像,失败后返回false
imagecreatetruecolor($x_size, $y_size);

//销毁图像$image,释放关联的内存
imagedestroy($image):bool

获取图片信息

//取得图像宽度
imagesx(resource $image):int

//取得图像高度
imagesy(resource $image):int

// 返回图片文件$filename(文件地址)的尺寸、文件类型和一个用在<img>标签中的height/width文本字符串的索引数组,不需要GD扩展
getimagesize($filename);

// 返回图片内容$imagedata的尺寸、文件类型和一个用在<img>标签中的height/width文本字符串的索引数组,不需要GD扩展
getimagesizefromstring($imagedata);
[
    0      => '图片宽',
    1      => '图片高',
    2      => 'height/width文本',
    'mime' => '文件类型',
];

设置图片颜色

// 返回一个指定$red、$green、$blue的颜色标识符,初次调用会为imagecreate()建立的图像资源$image填充背景
// $red、$green、$blue是0-255(10进制)或0x00到0xFF(16进制)
imagecolorallocate($image, $red, $green, $blue);

// 与imagecolorallocate()相同,多个参数透明度$alpha(0不透明 2完全透明)
imagecolorallocatealpha($image, $red, $green, $blue, $alpha);

// 取消图像$image先前由imagecolorallocate()或imagecolorallocatealpha()分配的颜色标识符$color
imagecolordeallocate($image, $color);

// 将image图像中的颜色标识符$color设定为透明色
imagecolortransparent($image, $color = ?);

拷贝图片颜色

//从 source 图像把调色板拷贝到 destination 图像
imagepalettecopy(resource $destination , resource $source):void

设置图片分辨率

// 获取图像$image的分辨率DPI数组
imageresolution($image);

// 以DPI(每英寸点数)设置图像$image的分辨率,$res_y为空时默认等于$res_x
imageresolution($image, $res_x, $res_y = $res_x);

设置图片抗锯齿

// 对线段和多边形$image启用$enabled(true)关闭$enabled(false)快速画图抗锯齿方法。不支持alpha部分
imageantialias($image, $enabled);

图片裁剪

// 将图像$image以数组$rect = ['x' => '', 'y' => '', 'width' => '', 'height' => '']指定的区域进行裁剪并返回裁剪后的图像,失败后返回false
imagecrop($image, $rect);

图片旋转

// 将图像$image旋转$angle度,旋转后空白位置覆盖$bgd_color背景色;$ignore_transparent为0时保留透明色,否则忽略透明色;返回新图像,失败返回false
imagerotate($image, $angle, $bgd_color, $ignore_transparent = 0);

$modes = [
        IMG_FLIP_HORIZONTAL, // 水平翻转图像。
		IMG_FLIP_VERTICAL,   // 垂直翻转图像。
		IMG_FLIP_BOTH,       // 水平和垂直翻转图像。
];
// 将原图像$image以指定模式$mode翻转,成功返回true,失败时返回false
imageflip($image, $mode);

图片缩放

// 将图像$image已指定宽度$new_width高度$new_height进行缩放,$new_height为-1时根据宽度等比缩放,失败是返回false
imagescale($image, $new_width, $new_height = -1);

设置图像画笔

// 将图像$image的画线函数的画笔图像设置为图像$brush,成功返回true,失败返回false
imagesetbrush($image, $brush);

// 将图像$image的图像绘画函数的画笔线宽设置为$thickness像素,成功返回true,失败返回false
imagesetthickness($image, $thickness);

// 将图像$image的填充贴图设置为图像$tile,当填充函数使用特殊颜色IMG_COLOR_TILED时将使用贴图
imagesettile($image, $tile);

绘制椭圆

// 在图像$image上绘制一个圆心为$cx,$cy宽为$w高为$h起点为$s度终点为$e度颜色为$color的椭圆弧;0°位于三点钟位置,失败时返回 false
imagearc($image, $cx, $cy, $w, $h, $s, $e, $color);

// 在图像$image上绘制一个圆心为$cx,$cy宽为$w高为$h起点为$s度终点为$e度的椭圆弧,使用颜色$color填充;失败时返回 false
$styles = [ // 多个参数可以使用|连接一起使用
    IMG_ARC_PIE,    // 产生圆形边界,不能与IMG_ARC_CHORD一起使用
    IMG_ARC_CHORD,  // 用直线连接了起始和结束点
    IMG_ARC_NOFILL, // 指明弧或弦只有轮廓,不填充
    IMG_ARC_EDGED,  // 用直线将起始和结束点与中心点相连,和IMG_ARC_NOFILL一起使用是画饼状图轮廓的好方法。
];
imagefilledarc($image, $cx, $cy, $w, $h, $s, $e, $color, $style);

// 在图像$image上绘制一个圆心为$cx,$cy宽为$w高为$h颜色为$color的椭圆,失败时返回 false
imageellipse($image, $cx, $cy, $w, $h, $color);

// 在图像$image上绘制一个圆心为$cx,$cy宽为$w高为$h的椭圆,使用颜色$color填充,失败时返回 false
imagefilledellipse($image, $cx, $cy, $w, $h, $color);

绘制多边形

// 在图像$image上绘制一个多边形,多边形的各顶点在数组$points中,$num_points为顶点数量,必须大于3,线条颜色为$color,失败时返回 false
// $points是一维数组,顶点值一对一对出现[1, 2, 3, 4, 5, 6]
imagepolygon($image, $points, $num_points, $color);

// 在图像$image上绘制一个多边形,多边形的各顶点在数组$points中,$num_points为顶点数量,必须大于3,填充颜色$color,失败时返回 false
// $points是一维数组,顶点值一对一对出现[1, 2, 3, 4, 5, 6]
imagefilledpolygon($image, $points, $num_points, $color);

// 类似于imagepolygon()多边形是开放的,最后一点和第一个点之间没有画线,失败时返回 false,PHP8以上不需要参数$num_points
imageopenpolygon($image, $points, $num_points, $color);

// 在图像$image绘制一个左上角坐标为$x1,$y1,右下角坐标为$x2,$y2的矩形,填充颜色$color,失败时返回 false
imagefilledrectangle($image, $x1, $y1, $x2, $y2, $color);

// 在图像$image绘制一个左上角坐标为$x1,$y1,右下角坐标为$x2,$y2线条颜色为$color的矩形,失败时返回 false
imagerectangle($image, $x1, $y1, $x2, $y2, $color);

绘制线段

// 在图像$image绘制一个起点坐标为$x1,$y1,终点坐标为$x2,$y2的线段,线段颜色为$color,失败时返回 false
imageline($image, $x1, $y1, $x2, $y2, $color);

加载字体

// 加载字体$file(字体文件路径),返回字体标识符,失败返回flase;不能加载.font和.ttf文件,.gdf文件可以
imageloadfont($file);

获取字体信息

// 返回指定字体标识符的一个字符高度(像素值)
imagefontheight($font);

// 返回指定字体标识符的一个字符宽度(像素值)
imagefontwidth($font);

绘制文字

// 在图像$image的坐标$x,$y处水平写上字体为$font颜色为$color的一个字符串$c;$font为1-5时使用内置的字体,其他字体为imageloadfont载入的返回值,中文需要使用中文字体,失败时返回 false
imagechar($image, $font, $x, $y, $c, $color);

// 在图像$image的坐标$x,$y处垂直写上字体为$font颜色为$color的一个字符串$c;$font为1-5时使用内置的字体,其他字体为imageloadfont载入的返回值,中文需要使用中文字体,失败时返回 false
imagecharup($image, $font, $x, $y, $c, $color);

// 在图像$image的坐标$x,$y处水平写上字体为$font颜色为$color的一行字符串$s;$font为1-5时使用内置的字体,其他字体为imageloadfont载入的返回值,中文需要使用中文字体,失败时返回 false
imagestring($image, $font, $x, $y, $s, $color);

// 在图像$image的坐标$x,$y处垂直写上字体为$font颜色为$color的一行字符串$s;$font为1-5时使用内置的字体,其他字体为imageloadfont载入的返回值,中文需要使用中文字体,失败时返回 false
imagestringup($image, $font, $x, $y, $s, $color);

// 返回指定字体$fontfile像素$size角度$angle的字符串$text所占据的像素边界框,返回8个元素的数组,元素两两一组,分别代表左下角、右下角、右上角、左上角
// $fontfile可以时字体文件名/url
// 90度表示从下向上读的文本
imagettfbbox($size, $angle, $fontfile, $text);

// 用FreeType字体在图像$image的$x,$y坐标绘制颜色为$color,大小为$size磅角度为$angle字体路径为$fontfile的字符串$text
// 返回8个元素的数组,元素两两一组,分别代表左下角、右下角、右上角、左上角,代表字符串占据的像素框大小
// 90度表示从下向上读的文本
imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);

// 返回指定字体$fontfile像素$size角度$angle的字符串$text所占据的freettype2形式的像素边界框,返回8个元素的数组,元素两两一组,分别代表左下角、右下角、右上角、左上角
// $fontfile可以时字体文件名/url
// 90度表示从下向上读的文本
imageftbbox($size, $angle, $fontfile, $text);

// 用FreeType 2字体在图像$image的$x,$y坐标绘制颜色为$color,大小为$size磅角度为$angle字体路径为$fontfile的字符串$text
// 返回8个元素的数组,元素两两一组,分别代表左下角、右下角、右上角、左上角,代表字符串占据的像素框大小
// 90度表示从下向上读的文本
imagefttext($image, $size, $angle, $x, $y, $color, $fontfile, $text);

绘制填充区域

// 在图像$image的$x,$y坐标及其周围1像素的点用$color颜色填充,成功返回true,失败返回false;使用时需要填充多个点效果才明显
imagefill($image, $x, $y, $color);

// 在图像$image的$x,$y坐标开始填充颜色$color,直到到达颜色为$border的边界,成功返回true,失败返回false
imagefilltoborder($image, $x, $y, $border, $color);

图片复制

// 将图像$src_im的坐标$src_x,$src_y开始宽为$src_w高为$src_h的部分复制到图像$dst_im上,从坐标$dst_x,$dst_y开始(对应$src_x,$src_y)
imagecopy($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h);

// 将图像$src_im的坐标$src_x,$src_y开始宽为$src_w高为$src_h的部分复制到图像$dst_im上,从坐标$dst_x,$dst_y开始(对应$src_x,$src_y)
// $pct为透明度,为0时复制的图像显示不出来,100与imagecopy相同
// 合并时通过在拷贝操作前将目标像素转换为灰度级来保留了原色度
imagecopymergegray($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct);

// 将图像$src_im的坐标$src_x,$src_y开始宽为$src_w高为$src_h的部分复制到图像$dst_im上,从坐标$dst_x,$dst_y开始(对应$src_x,$src_y)复制到宽为$dst_w高为$dst_h的区域内
// $src_im和$dst_im图像的宽高不同时,图像会自动收缩拉伸
// 函数会平滑地插入像素值,因此减小了图像的大小仍然可以保持极大的清晰度。
imagecopyresampled($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h);

图片过滤

$filtertypes = [
        IMG_FILTER_NEGATE,         // 反转图像所有颜色
		IMG_FILTER_GRAYSCALE,      // 转换图像颜色为灰度
		IMG_FILTER_BRIGHTNESS,     // 将图像亮度调整为$arg1
		IMG_FILTER_CONTRAST,       // 将图像对比度调整为$arg1
		IMG_FILTER_COLORIZE,       // 转换图像颜色为$arg1,$arg2,$arg3指定的rgb颜色,并且可指定透明度$arg4
		IMG_FILTER_EDGEDETECT,     // 使用边缘检测突出图像边缘
		IMG_FILTER_EMBOSS,         // 使图像浮雕化
		IMG_FILTER_GAUSSIAN_BLUR,  // 使用用高斯算法模糊图像。
		IMG_FILTER_SELECTIVE_BLUR, // 模糊图像。
		IMG_FILTER_MEAN_REMOVAL,   // 用平均移除法来达到轮廓效果
		IMG_FILTER_SMOOTH,         //  将图像柔滑度调整为$arg1
];
// 在$src_im图像上使用$filtertype过滤器,$arg1, $arg2, $arg3根据需要传递参数,可不传
imagefilter($src_im, $filtertype, $arg1, $arg2, $arg3);

输出图片

// 指定$filename时将$image保存为$filename,否则将直接输出图像流,成功返回true。失败返回flase

// 输出GD图像
imagegd($image, $filename);

// 输出gif图像
imagegif($image, $filename);

// 输出jpeg图像,$quality为图片质量(0-100)默认75,100最佳质量
imagejpeg($image, $filename, $quality);

// 输出PNG图像
imagepng($image, $filename);

// 输出WBMP图像
imagewbmp($image, $filename);

// 输出WebP图像,$quality为图片质量(0-100)默认75,100最佳质量
imagewebp($image, $filename, $quality);

// 输出XBM图像,$foreground为前景色,默认黑色
imagexbm($image, $filename, $foreground);

// 输出BMP图像,$compressed为是否使用游程编码(RLE)压缩BMP
imagebmp($image, $filename, $compressed);

// 输出GD2图像
imagegd2($image, $filename);

转换WBMP格式图片

// 将JPEG图像文件$jpegname转换为宽$dest_width高$dest_height的WBMP图像文件$wbmpname,$threshold为0-8的阈值;成功返回true,失败返回flase
jpeg2wbmp($jpegname, $wbmpname, $dest_height, $dest_width, $threshold);

// 将PNG图像文件$jpegname转换为宽$dest_width高$dest_height的WBMP图像文件$wbmpname,$threshold为0-8的阈值;成功返回true,失败返回flase
png2wbmp($pngname, $wbmpname, $dest_height, $dest_width, $threshold);

windwos环境截图

// 截图当前屏幕,返回截图的图片对象,失败时返回false
imagegrabscreen();

// 截图指定窗口$handle,返回截图的图片对象,失败时返回false;$handle为COM实例中的HWND属性
$browser = new COM('InternetExplorer.Application');
$handle = $browser->HWND;
$browser->Visible = true;
$im = imagegrabwindow($handle);
$browser->Quit();
imagepng($im, 'iesnap.png');
imagedestroy($im);

获取GD库信息

// 获取GD库的版本和功能的信息数组
gd_info()

 

{/if}