当前位置:编程学习 > php >>

php用GD实现图片圆角处理

php 裁剪图片类
<?php
/*
*说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形
* 参数说明:输入 需要处理图片的 文件名,生成新图片的保存文件名,生成新图片的宽,生成新图片的高
* written by smallchicken
* time 2008-12-18
*/
// 获得任意大小图像,不足地方拉伸,不产生变形,不留下空白
function my_image_resize($src_file, $dst_file , $new_width , $new_height) {
if($new_width <1 || $new_height <1) {
echo "params width or height error !";
exit();
}
if(!file_exists($src_file)) {
echo $src_file . " is not exists !";
exit();
}
// 图像类型
$type=exif_imagetype($src_file);
$support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
if(!in_array($type, $support_type,true)) {
echo "this type of image does not support! only support jpg , gif or png";
exit();
}
//Load image
switch($type) {
case IMAGETYPE_JPEG :
$src_img=imagecreatefromjpeg($src_file);
break;
case IMAGETYPE_PNG :
$src_img=imagecreatefrompng($src_file);
break;
case IMAGETYPE_GIF :
$src_img=imagecreatefromgif($src_file);
break;
default:
echo "Load image error!";
exit();
}
$w=imagesx($src_img);
$h=imagesy($src_img);
$ratio_w=1.0 * $new_width / $w;
$ratio_h=1.0 * $new_height / $h;
$ratio=1.0;
// 生成的图像的高宽比原来的都小,或都大 ,原则是 取大比例放大,取大比例缩小(缩小的比例就比较小了)
if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
if($ratio_w < $ratio_h) {
$ratio = $ratio_h ; // 情况一,宽度的比例比高度方向的小,按照高度的比例标准来裁剪或放大
}else {
$ratio = $ratio_w ;
}
// 定义一个中间的临时图像,该图像的宽高比 正好满足目标要求
$inter_w=(int)($new_width / $ratio);
$inter_h=(int) ($new_height / $ratio);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
// 生成一个以最大边长度为大小的是目标图像$ratio比例的临时图像
// 定义一个新的图像
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
switch($type) {
case IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // 存储图像
break;
case IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
break;
case IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
break;
default:
break;
}
} // end if 1
// 2 目标图像 的一个边大于原图,一个边小于原图 ,先放大平普图像,然后裁剪
// =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
else{
$ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //取比例大的那个值
// 定义一个中间的大图像,该图像的高或宽和目标图像相等,然后对原图放大
$inter_w=(int)($w * $ratio);
$inter_h=(int) ($h * $ratio);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
//将原图缩放比例后裁剪
imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
// 定义一个新的图像
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
switch($type) {
case IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // 存储图像
break;
case IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
break;
case IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
break;
default:
break;
}
}// if3
}// end function
?>
复制代码
第二个方法:

复制代码
<?php
/*
    图片处理类:缩略,裁剪,圆角,倾斜
*/
class resizeimage
{
   //图片类型
   var $type;
   //实际宽度
   var $width;
   //实际高度
   var $height;
   //改变后的宽度
   var $resize_width;
   //改变后的高度
   var $resize_height;
   //是否裁图
   var $cut;
   //源图象
   var $srcimg;
   //目标图象地址
   var $dstimg;
   //圆角源
   var $corner;
   var $im;

function resizeimage($img, $corner, $wid, $hei,$c, $corner_radius, $angle)
   {
       $this->srcimg = $img;
       $this->corner = $corner;
       $this->resize_width = $wid;
       $this->resize_height = $hei;
       $this->cut = $c;
       $this->corner_radius = $corner_radius;
       $this->angle = $angle;
       //图片的类型
       $this->type = substr(strrchr($this->srcimg,"."),1);
       //初始化图象
       $this->initi_img();
       //目标图象地址
       $this -> dst_img();
       //--
       $this->width = imagesx($this->im);
       $this->height = imagesy($this->im);
       //生成图象
       $this->newimg();
       ImageDestroy ($this->im);
   }
   function newimg()
   {
       //改变后的图象的比例
       $resize_ratio = ($this->resize_width)/($this->resize_height);
       //实际图象的比例
       $ratio = ($this->width)/($this->height);
       if(($this->cut)=="1")
       //裁图
       {
           if($ratio>=$resize_ratio)
           //高度优先
           {
               $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
               imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width,$this->resize_height, (($this->height)*$resize_ratio), $this->height);
               $tmp = $this->rounded_corner($newimg,$this->resize_width);
               imagepng ($tmp,$this->dstimg);
           }
           if($ratio<$resize_ratio)
           //宽度优先
           {
               $newimg = imagecreatetruecolor($this->resize_width,$this->resize_height);
               imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, $this->resize_height, $this->width, (($this->width)/$resize_ratio));
               $tmp = $this->rounded_corner($newimg);
               imagepng ($tmp,$this->dstimg);
           }
       }
       else
       //不裁图
       {
           if($ratio>=$resize_ratio)
           {
               $newimg = imagecreatetruecolor($this->resize_width,($this->resize_width)/$ratio);
               imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, $this->resize_width, ($this->resize_width)/$ratio, $this->width, $this->height);
               ImageJpeg ($newimg,$this->dstimg);
           }
           if($ratio<$resize_ratio)
           {
               $newimg = imagecreatetruecolor(($this->resize_height)*$ratio,$this->resize_height);
               imagecopyresampled($newimg, $this->im, 0, 0, 0, 0, ($this->resize_height)*$ratio, $this->resize_height, $this->width, $this->height);
               ImageJpeg ($newimg,$this->dstimg);
           }
       }
   }
   //初始化图象
   function initi_img()
   {
       if($this->type=="jpg")
       {
           $this->im = imagecreatefromjpeg($this->srcimg);
       }
       if($this->type=="gif")
       {
           $this->im = imagecreatefromgif($this->srcimg);
       }
       if($this->type=="png")
       {
           $this->im = imagecreatefrompng($this->srcimg);
       }
   }

   //处理圆角
   function rounded_corner($image,$size)
   {
        $this->angle = 0;
        $topleft = true;
        $bottomleft = true;
        $bottomright = true;
        $topright = true;
        $corner_source = imagecreatefrompng('rounded_corner.png');
        $corner_width = imagesx($corner_source);  
        $corner_height = imagesy($corner_source);  
        $corner_resized = ImageCreateTrueColor($this->corner_radius, $this->corner_radius);
        ImageCopyResampled($corner_resized, $corner_source, 0, 0, 0, 0, $this->corner_radius, $this->corner_radius, $corner_width, $corner_height);
        $corner_width = imagesx($corner_resized);  
        $corner_height = imagesy($corner_resized);  
        $white = ImageColorAllocate($image,255,255,255);
        $black = ImageColorAllocate($image,0,0,0);

        //顶部左圆角
        if ($topleft == true) {
            $dest_x = 0;  
            $dest_y = 0;  
            imagecolortransparent($corner_resized, $black); 
            imagecopymerge($image, $corner_resized, $dest_x, $dest_y, 0, 0, $corner_width, $corner_height, 100);
        } 

        //下部左圆角
        if ($bottomleft == true) {
            $dest_x = 0;  
            $dest_y = $size - $corner_height; 
            $rotated = imagerotate($corner_resized, 90, 0);
            imagecolortransparent($rotated, $black); 
            imagecopymerge($image, $rotated, $dest_x, $dest_y, 0, 0, $corner_width, $corner_height, 100);  
        }

        //下部右圆角
        if ($bottomright == true) {
            $dest_x = $size - $corner_width;  
            $dest_y = $size - $corner_height;  
            $rotated = imagerotate($corner_resized, 180, 0);
            imagecolortransparent($rotated, $black); 
            imagecopymerge($image, $rotated, $dest_x, $dest_y, 0, 0, $corner_width, $corner_height, 100);  
        }

        //顶部右圆角
        if ($topright == true) {
            $dest_x = $size - $corner_width;  
            $dest_y = 0;
            $rotated = imagerotate($corner_resized, 270, 0);
            imagecolortransparent($rotated, $black); 
            imagecopymerge($image, $rotated, $dest_x, $dest_y, 0, 0, $corner_width, $corner_height, 100);  
        }
        $image = imagerotate($image, $this->angle, $white);
        return $image; 
   }

   //图象目标地址
   function dst_img()
   {
       $full_length = strlen($this->srcimg);
       $type_length = strlen($this->type);
       $name_length = $full_length-$type_length;
       $name         = substr($this->srcimg,0,$name_length-1);
       $this->dstimg = $name."_small.png";
   }
}

//resizeimage("图片地址", "处理后的宽度", "处理后的高度", "是否裁剪", "圆角度数", "倾斜度");
$img_file = 'Sunset.jpg';
$corner = 'rounded_corner.png';
$resizeimage = new resizeimage($img_file, $corner, "80", "80", "1", "6", "0");
?>
<img src="Sunset_small.png" border="0">
一、背景图圆角处理,无弹窗阅读网 zhaoxi35.com

方法调用:

//整个图,也就是白色背景
$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);
}
是不是觉得下面这个代码已经写过了呢?是的,上面有一样的代码。

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

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,