最近需要在图片中画椭圆,但是gd库函数有矩形、圆弧、椭圆……就是没有圆角矩形

然后在网上找的画圆角矩形的方法试了一些,大都不好用

在找的过程中参考了别人的一些实现方法,于是我看着文档实现了一个自己的画圆角矩形

效果图

两个圆角矩形.png

核心代码

/**

* 创建圆角矩形

*

* @param [object] $imageObj [imagecreatefromjpeg() 返回一图像标识符]

* @param [int] $arcRec_SX [圆角矩形开始的X坐标]

* @param [int] $arcRec_SY [圆角矩形开始的Y坐标]

* @param [int] $arcRec_EX [圆角矩形结束的X坐标]

* @param [int] $arcRec_EY [圆角矩形结束的Y坐标]

* @param [int] $redius [圆角矩形的圆角弧度]

* @param [] $color [php gd库里创建的颜色对象]

*

* @return [] [没有返回值]

*/

function arcRec($imageObj, $arcRec_SX, $arcRec_SY, $arcRec_EX, $arcRec_EY, $redius, $color)

{

// $arcRec_SX = 50; //开始点X坐标

// $arcRec_SY = 50; //开始点Y坐标

// $arcRec_EX = 500; //结束点X坐标

// $arcRec_EY = 500; //结束点Y坐标

// $redius = 50; //圆角半径

$arcRec_W = $arcRec_EX - $arcRec_SX;

$arcRec_H = $arcRec_EY - $arcRec_SY;

imagefilledrectangle($imageObj, $arcRec_SX + $redius, $arcRec_SY, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + $redius, $color); //矩形一

imagefilledrectangle($imageObj, $arcRec_SX, $arcRec_SY + $redius, $arcRec_SX + $arcRec_W, $arcRec_SY + ($arcRec_H - ($redius * 1)), $color);//矩形二

imagefilledrectangle($imageObj, $arcRec_SX + $redius, $arcRec_SY + ($arcRec_H - ($redius * 1)), $arcRec_SX + ($arcRec_W - ($redius * 1)), $arcRec_SY + $arcRec_H, $color);//矩形三

imagefilledarc($imageObj, $arcRec_SX + $redius, $arcRec_SY + $redius, $redius * 2, $redius * 2, 180, 270, $color, IMG_ARC_PIE); //四分之一圆 - 左上

imagefilledarc($imageObj, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + $redius, $redius * 2, $redius * 2, 270, 360, $color, IMG_ARC_PIE); //四分之一圆 - 右上

imagefilledarc($imageObj, $arcRec_SX + $redius, $arcRec_SY + ($arcRec_H - $redius), $redius * 2, $redius * 2, 90, 180, $color, IMG_ARC_PIE); //四分之一圆 - 左下

imagefilledarc($imageObj, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + ($arcRec_H - $redius), $redius * 2, $redius * 2, 0, 90, $color, IMG_ARC_PIE); //四分之一圆 - 右下

}

实现原理

如图

用ps临时做的

把一个椭圆拆分为两种图形,这两种图形是gd库函数支持画的

分为矩形和椭圆弧(上下各两个,中间一个大的矩形,四角是椭圆弧)

这样只要我们计算好了每个点的位置和比例,就可以拼出一个圆角矩形了

实战

新建一个index.php文件,把test.jpg文件放到php文件的同级目录下(可以放在其他目录,这里是为了方便讲解),目录结构图大概这样

目录结构图

在index.php中写代码

$imageFile = './test.jpg'; //图片文件路径

$imageObj = imagecreatefromjpeg($imageFile); //创建图像资源,返回标识符

$red = imagecolorallocate($imageObj, 255, 0, 0); //定义颜色(红色

$blue = imagecolorallocate($imageObj, 0, 0, 255); //定义颜色(蓝色

$white_tra = imagecolorallocatealpha($imageObj, 255, 255, 255, 30); //定义颜色(白色)(不透明度:30[不透明度取值范围0 - 127,0:不透明,127:全透明])

代码讲解:

因为我们操作的是jpg图片所以这里用imagecreatefromjpeg打开,如果操作png、bmp、webp可以用对应的函数(我只测试了操作jpg图片,其他的没有测试)

imagecolorallocate和imagecolorallocatealpha在文档中的解释是为图像分配颜色,并返回一个标识符

imagecolorallocatealpha是支持调整不透明度的

函数文档

imagecreatefromjpeg

imagecolorallocate

imagecolorallocatealpha

把核心代码放进来并调用

arcRec($imageObj, $arcRec_SX, $arcRec_SY, $arcRec_EX, $arcRec_EY, $redius, $color);

imageobj 这是在第二步中由imagecreatefromjpeg返回的标识符

arcRec_SX 这是圆角矩形左上角的X坐标

arcRec_SY 这是圆角矩形左上角的Y坐标

arcRec_EX 这是圆角矩形右下角X坐标

arcRec_EY 这是圆角矩形右下角的Y坐标

redius 这是圆角矩形的不透明度(取值范围 0 - 127,0:不透明 127:全透明)

color 这是第二步中用imagecolorallocate或者imagecolorallocatealpha创建图像颜色返回的标识符

最后把图像输出

imagepng($imageObj, 'uaivg.png');

最终的index.php文件的代码为

$imageFile = './test.jpg'; //图片文件路径

$imageObj = imagecreatefromjpeg($imageFile); //创建图像资源,返回标识符

$red = imagecolorallocate($imageObj, 255, 0, 0); //定义颜色(红色

$blue = imagecolorallocate($imageObj, 0, 0, 255); //定义颜色(蓝色

$white_tra = imagecolorallocatealpha($imageObj, 255, 255, 255, 30); //定义颜色(白色)(不透明度:30[不透明度取值范围0 - 127,0:不透明,127:全透明])

imagepng($imageObj, 'uaivg.png');

arcRec($imageObj, 100, 100, 150, 150, 5, $red);

arcRec($imageObj, 200, 200, 450, 350, 50, $blue);

imagepng($imageObj, 'uaivg.png');

/**

* 创建圆角矩形

*

* @param [object] $imageObj [imagecreatefromjpeg() 返回一图像标识符]

* @param [int] $arcRec_SX [圆角矩形开始的X坐标]

* @param [int] $arcRec_SY [圆角矩形开始的Y坐标]

* @param [int] $arcRec_EX [圆角矩形结束的X坐标]

* @param [int] $arcRec_EY [圆角矩形结束的Y坐标]

* @param [int] $redius [圆角矩形的圆角弧度]

* @param [] $color [php gd库里创建的颜色对象]

*

* @return [] [没有返回值]

*/

function arcRec($imageObj, $arcRec_SX, $arcRec_SY, $arcRec_EX, $arcRec_EY, $redius, $color)

{

// $arcRec_SX = 50; //开始点X坐标

// $arcRec_SY = 50; //开始点Y坐标

// $arcRec_EX = 500; //结束点X坐标

// $arcRec_EY = 500; //结束点Y坐标

// $redius = 50; //圆角半径

$arcRec_W = $arcRec_EX - $arcRec_SX;

$arcRec_H = $arcRec_EY - $arcRec_SY;

imagefilledrectangle($imageObj, $arcRec_SX + $redius, $arcRec_SY, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + $redius, $color); //矩形一

imagefilledrectangle($imageObj, $arcRec_SX, $arcRec_SY + $redius, $arcRec_SX + $arcRec_W, $arcRec_SY + ($arcRec_H - ($redius * 1)), $color);//矩形二

imagefilledrectangle($imageObj, $arcRec_SX + $redius, $arcRec_SY + ($arcRec_H - ($redius * 1)), $arcRec_SX + ($arcRec_W - ($redius * 1)), $arcRec_SY + $arcRec_H, $color);//矩形三

imagefilledarc($imageObj, $arcRec_SX + $redius, $arcRec_SY + $redius, $redius * 2, $redius * 2, 180, 270, $color, IMG_ARC_PIE); //四分之一圆 - 左上

imagefilledarc($imageObj, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + $redius, $redius * 2, $redius * 2, 270, 360, $color, IMG_ARC_PIE); //四分之一圆 - 右上

imagefilledarc($imageObj, $arcRec_SX + $redius, $arcRec_SY + ($arcRec_H - $redius), $redius * 2, $redius * 2, 90, 180, $color, IMG_ARC_PIE); //四分之一圆 - 左下

imagefilledarc($imageObj, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + ($arcRec_H - $redius), $redius * 2, $redius * 2, 0, 90, $color, IMG_ARC_PIE); //四分之一圆 - 右下

}

TIPS

核心代码中注释的代码是测试的时候写的

这篇文章中讲解的调用方法中的参数是传圆角矩形左上角和右下角的坐标

改一改代码可以改成传圆角矩形左上角的坐标和圆角矩形的宽高来进行绘制

19.3.21晚更新 改好了

/**

* 创建圆角矩形

*

* @param [object] $imageObj [imagecreatefromjpeg() 返回一图像标识符]

* @param [int] $arcRec_SX [圆角矩形开始的X坐标]

* @param [int] $arcRec_SY [圆角矩形开始的Y坐标]

* @param [int] $arcRec_W [圆角矩形的宽度]

* @param [int] $arcRec_H [圆角矩形的高度]

* @param [int] $redius [圆角矩形的圆角弧度]

* @param [] $color [php gd库里创建的颜色对象]

*

* @return [] [没有返回值]

*/

function arcRec($imageObj, $arcRec_SX, $arcRec_SY, $arcRec_W, $arcRec_H, $redius, $color)

{

// $arcRec_SX = 50; //开始点X坐标

// $arcRec_SY = 50; //开始点Y坐标

// $arcRec_EX = 500; //结束点X坐标

// $arcRec_EY = 500; //结束点Y坐标

// $redius = 50; //圆角半径

//$arcRec_W = $arcRec_EX - $arcRec_SX;

//$arcRec_H = $arcRec_EY - $arcRec_SY;

$arcRec_EX = $arcRec_SX + $arcRec_W;

$arcRec_EY = $arcRec_SY + $arcRec_H;

imagefilledrectangle($imageObj, $arcRec_SX + $redius, $arcRec_SY, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + $redius, $color); //矩形一

imagefilledrectangle($imageObj, $arcRec_SX, $arcRec_SY + $redius, $arcRec_SX + $arcRec_W, $arcRec_SY + ($arcRec_H - ($redius * 1)), $color);//矩形二

imagefilledrectangle($imageObj, $arcRec_SX + $redius, $arcRec_SY + ($arcRec_H - ($redius * 1)), $arcRec_SX + ($arcRec_W - ($redius * 1)), $arcRec_SY + $arcRec_H, $color);//矩形三

imagefilledarc($imageObj, $arcRec_SX + $redius, $arcRec_SY + $redius, $redius * 2, $redius * 2, 180, 270, $color, IMG_ARC_PIE); //四分之一圆 - 左上

imagefilledarc($imageObj, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + $redius, $redius * 2, $redius * 2, 270, 360, $color, IMG_ARC_PIE); //四分之一圆 - 右上

imagefilledarc($imageObj, $arcRec_SX + $redius, $arcRec_SY + ($arcRec_H - $redius), $redius * 2, $redius * 2, 90, 180, $color, IMG_ARC_PIE); //四分之一圆 - 左下

imagefilledarc($imageObj, $arcRec_SX + ($arcRec_W - $redius), $arcRec_SY + ($arcRec_H - $redius), $redius * 2, $redius * 2, 0, 90, $color, IMG_ARC_PIE); //四分之一圆 - 右下

}

php gd 圆角,php使用gd库在图片中画圆角矩形相关推荐

  1. php的gd不支持jpeg,gd库不支持jpeg的解决方法

    杜工就不在这里啰嗦怎么遇到这个问题的了,如果你确实安装了的gd库,却发现无法支持jpeg格式的图片,可从下面找到答案. 原因是在编译gd库前,配置时未声明jpeg库路径.解决方法如下: 32位系统: ...

  2. gd动态曲线 php_PHP GD库动态生成折线图的实例代码

    array_push ($p_x, $zuo+$i*$jiange); array_push ($p_y, $shang+round(($img_gao-$shang-$xia)*(1-$shuju[ ...

  3. php gd测试代码,PHP: GD - Manual

    gd_info - 取得当前安装的 GD 库的信息 image_type_to_mime_type - 取得 getimagesize,exif_read_data,exif_thumbnail,ex ...

  4. linux卸载gd,linux下 安装GD

    安? GD 前需要安? jpeg-6b, libpng, zlib, freetype.以下是下载网址: http://www.libgd.org/Downloads GD下载 ftp://ftp.u ...

  5. linux安装gd,linux下 安装GD

    安裝 GD 前需要安裝 jpeg-6b, libpng, zlib, freetype.以下是下载网址: 1.安装zlib tar zxvf zlib-1.2.3.tar.gz cd zlib-1.2 ...

  6. php添加gd扩展,PHP7安装gd扩展的方法

    PHP7安装gd扩展的方法 发布时间:2020-09-08 11:06:22 来源:亿速云 阅读:92 作者:小新 这篇文章将为大家详细讲解有关PHP7安装gd扩展的方法,小编觉得挺实用的,因此分享给 ...

  7. 一般源码安装添加的GD库 是不支持 jpeg 格式的图片的

    一般源码安装添加的GD库 是不支持 jpeg 格式的图片的,只支持如下格式 GD Support enabled  GD Version bundled (2.0.34 compatible)  GI ...

  8. php+gd库的源码安装

    PHP+GD安装 一.下载软件 gd-2.0.35.tar.gz http://www.boutell.com/gd/ jpegsrc.v6b.tar.gz        http://www.ijg ...

  9. mac php gd库,mac下安装GD库FreeType

    MacBook Pro安装的新系统10.10.3,PHP环境也是默认就有的,GD库在默认情况下也安装过了,但在使用验证码的时候,提示GD库不支持FreeType,这里我们手动安装一下. 法一: 安装 ...

最新文章

  1. 关于might_sleep的一点说明【转】
  2. java 获取_java获取类的信息
  3. QCom MSM MDP显示驱动一些点的简记
  4. springboot分页展示功能_springboot+vue实现分页功能
  5. 【ES6基础】Object的新方法
  6. 生成下拉框的几种方法总结——数据来源:枚举
  7. bat循环执行带参数_C++:main处理命令行选项/main函数的参数
  8. 获取zabbix监控数据
  9. 格密码教程(试读):向量空间,基等介绍
  10. RTT时钟管理篇——软硬定时器理解(二)
  11. 帧起始定界符_帧详解 - web黄金矿工 - 博客园
  12. 凯撒密码中有数字怎么办_古典密码
  13. 随书光盘资源下载/提取码(二)
  14. CASS删除分幅后图框内部十字丝
  15. 证件照处理工具,软件虽小,但是功能强大!(证件照工具,都用得上)
  16. Mysql数据库的分离和附加
  17. 数据库(笔记)——关系代数以及相关运算
  18. SP服务商Java短信平台的软件模型和实现(吴宏杰,赵雷,杨季文,苏州大学计算机科学和技术学院)...
  19. Thymeleaf 表单回填
  20. hpm1216nfh驱动程序_M1216nfh 驱动-HP 惠普 LaserJet Pro M1216nfh多功能一体机驱动下载4.0官方版-东坡下载...

热门文章

  1. C语言C4996错误简单解决方法
  2. C++编写一个关于圆形的程序,要求定义一个圆形类Circle
  3. 计算机辅助技术的英文,计算机辅助技术,computer aided technology,音标,读音,翻译,英文例句,英语词典...
  4. 遥想公瑾当年 —— 赤壁之变
  5. CSS3的新单位vw、vh、vmin、vmax
  6. 【程序源代码】驾校模拟考试系统
  7. 【有道专辑】-【时尚の音乐五周年贺】美国新世纪钢琴家: Painted Echoes - (画的回声) Tim Glemser 蒂姆.葛兰森(2011)
  8. 卷积神经网络学习路线(十七) | Google CVPR 2017 MobileNet V1
  9. 我在养一个很牛逼的大单!
  10. 传统艺术碰撞未来科技,让 NFT 圈内玩家告诉你 | 设计大时髦 01