PHP将图片处理成圆角

小追兵专栏

文章摘要:

上一篇文章,我说了关于php把文字画在图片上的换行方法,这篇说说项目中图片圆角的处理

我们可能在很多项目中,需要对图片进行圆角处理,例如HTML5中,例如Android中;

这里我们说说用PHP对图片进行圆角处理的方法;

圆角处理的方法有很多,这里我就只说说我的项目中是怎么对处理圆角的;

效果图如下:

乐萌汉字卡片
乐萌汉字卡片

如图可见,不论是插图,还是文字这背景,我们都做了圆角处理,下面我看看在PHP中,我们是怎么实现的吧。

这里我先说说实现的思路,我们是先画出直角的图,然后再用一个圆角去覆盖在直角上面,这样看起来就是一个圆角了。

一、背景图圆角处理

方法调用:
//整个图,也就是白色背景
$im = imagecreatetruecolor(750, 3000);
$bgcolor = imagecolorallocate($im, 255, 255, 255);
imagefill($im, 0, 0, $bgcolor);

//生成汉字的背景矩形
$image_width = 694;//圆角淡色背景的宽694px
$image_height = 368;//圆角淡色背景的高368px
//矩形上面加圆角
$radius = 10;//圆角的像素,值越大越圆
$dst_x = 28;//距离白色大背景左边的距离
$y = 40;//距离白色大背景顶端的距离

//这里调用函数,绘制淡色的圆角背景,
imagebackgroundmycard($im, $dst_x, $y, $image_width, $image_height, $radius);

以上是调用函数的说明,下面我们给出函数方法:

方法实现:
    
/**
 * 画一个带圆角的背景图
 * @param $im  底图
 * @param $dst_x 画出的图的(0,0)位于底图的x轴位置
 * @param $dst_y 画出的图的(0,0)位于底图的y轴位置
 * @param $image_w 画的图的宽
 * @param $image_h 画的图的高
 * @param $radius 圆角的值
 */
function imagebackgroundmycard($im, $dst_x, $dst_y, $image_w, $image_h, $radius)
{
    $resource = imagecreatetruecolor($image_w, $image_h);
    $bgcolor = imagecolorallocate($resource, 0xef, 0xef, 0xe1);//该图的背景色

    imagefill($resource, 0, 0, $bgcolor);
    $lt_corner = get_lt_rounder_corner($radius, 255, 255, 255);//圆角的背景色

    // lt(左上角)
    imagecopymerge($resource, $lt_corner, 0, 0, 0, 0, $radius, $radius, 100);
    // lb(左下角)
    $lb_corner = imagerotate($lt_corner, 90, 0);
    imagecopymerge($resource, $lb_corner, 0, $image_h - $radius, 0, 0, $radius, $radius, 100);
    // rb(右上角)
    $rb_corner = imagerotate($lt_corner, 180, 0);
    imagecopymerge($resource, $rb_corner, $image_w - $radius, $image_h - $radius, 0, 0, $radius, $radius, 100);
    // rt(右下角)
    $rt_corner = imagerotate($lt_corner, 270, 0);
    imagecopymerge($resource, $rt_corner, $image_w - $radius, 0, 0, 0, $radius, $radius, 100);

    imagecopy($im, $resource, $dst_x, $dst_y, 0, 0, $image_w, $image_h);
}

上面函数方法依赖的函数:


/** 画圆角
 * @param $radius 圆角位置
 * @param $color_r 色值0-255
 * @param $color_g 色值0-255
 * @param $color_b 色值0-255
 * @return resource 返回圆角
 */
function get_lt_rounder_corner($radius, $color_r, $color_g, $color_b)
{
    // 创建一个正方形的图像
    $img = imagecreatetruecolor($radius, $radius);
    // 图像的背景
    $bgcolor = imagecolorallocate($img, $color_r, $color_g, $color_b);
    $fgcolor = imagecolorallocate($img, 0, 0, 0);
    imagefill($img, 0, 0, $bgcolor);
    // $radius,$radius:以图像的右下角开始画弧
    // $radius*2, $radius*2:已宽度、高度画弧
    // 180, 270:指定了角度的起始和结束点
    // fgcolor:指定颜色
    imagefilledarc($img, $radius, $radius, $radius * 2, $radius * 2, 180, 270, $fgcolor, IMG_ARC_PIE);
    // 将弧角图片的颜色设置为透明
    imagecolortransparent($img, $fgcolor);
    return $img;
}
最后输出图片:

讲浅色背景圆角处理的已经完成了,如果你想看看最后的效果,只要做下面一部,把图片输出就可以了。

//生成图片
imagepng($im, "test.png");
imagedestroy($im);

二、插图圆角处理:

和上面背景圆角处理完全相同的思路:就是对插图的直角进行覆盖,我就不多说了,下面附上插图圆角处理的的代码。

//这里我们吧准备好的插图画到背景图上,此时还是直角的
$filename="img/test_1.png"//图片资源目录
$img = imagecreatefrompng($filename);
//第一个参数是上面已经用过的大的背景图,也就我们的画板,
//第二个参数:上面这个目录拿到的capy用的资源文件了
//第三个单数距离大卡片左边的距离
//第三个单数距离大卡片上边的距离
//第三第四是资源图片开始拷贝的位置,这里我是从左上角开始copy的,所以是0和0;
//第五第六个参数是图片拷过去的大小
imagecopy($im, $img, 100, $y, 0, 0, 560, 288);

//画圆角
$lt_corner = get_lt_rounder_corner($radius, 0xef, 0xef, 0xe1);
//圆角的背景色
myradus($im, 100, $y, $lt_corner, $radius, 288, 560);

上面是调用的方法,这里的get_lt_rounder_corner 是一个自定义的函数,上面背景处理中已经列出该函数的具体实现,这里不再重复,下面给出myradus函数的具体实现:

/**
 * @param $im  大的背景图,也是我们的画板
 * @param $lt_corner 我们画的圆角
 * @param $radius  圆角的程度
 * @param $image_h 图片的高
 * @param $image_w 图片的宽
 */
function myradus($im, $lift, $top, $lt_corner, $radius, $image_h, $image_w)
{
/// lt(左上角)
    imagecopymerge($im, $lt_corner, $lift, $top, 0, 0, $radius, $radius, 100);
// lb(左下角)
    $lb_corner = imagerotate($lt_corner, 90, 0);
    imagecopymerge($im, $lb_corner, $lift, $image_h - $radius + $top, 0, 0, $radius, $radius, 100);
// rb(右上角)
    $rb_corner = imagerotate($lt_corner, 180, 0);
    imagecopymerge($im, $rb_corner, $image_w + $lift - $radius, $image_h + $top - $radius, 0, 0, $radius, $radius, 100);
// rt(右下角)
    $rt_corner = imagerotate($lt_corner, 270, 0);
    imagecopymerge($im, $rt_corner, $image_w - $radius + $lift, $top, 0, 0, $radius, $radius, 100);
}

是不是觉得下面这个代码已经写过了呢?是的,上面有一样的代码。

这样我们就实现的背景的圆角处理,也实现了图片的圆角处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 转载注明出处:http://www.jianshu.com/p/818e1284158d 1. 概述 Androi...
    王三的猫阿德阅读 10,312评论 10 49
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,388评论 25 707
  • 万恶的国内设计,都喜欢偏向于ios的扁平化风格,这里涉及到很多原因,国内的网路环境导致大家无法使用国外的优秀app...
    super_shanks阅读 2,204评论 4 8
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 小系统的概念 这几天永澄老师在他的公众号中提到一个概念:建立自己的小系统一开始听到这个词的时候,我是有点懵的 我之...
    米斯特左脑阅读 645评论 0 1