优秀的编程知识分享平台

网站首页 > 技术文章 正文

php配合前端实现图片裁剪(php图片处理)

nanyue 2024-08-26 17:56:13 技术文章 6 ℃

使用php对图片进行放大缩进并裁剪

/*
图片地址
$obj->url 
图片的宽,比如放大或缩小后的图片,如果图片宽本来是100,你把他放大到200,那这里就填200
$obj->largeWidth 
图片的高,同上
$obj->largeHeight 
新图的宽,比如你把图片从100放大到200,且只要其中的150,那这里就填150
$obj->newWidth 
新图的高,同上
$obj->newHeight 
新图相对于原图的的水平偏移,注意,这里的原图是指放大或缩小之后的图片,
就拿上面的讲,你的图片是100*200,当是你放大到 200*400, 现在你只要 150*150,
而且你要最中心的位置,即在 200*400 的大小中 在最中间的位置 裁剪 150*150 
这时候 $obj->x 就应该是 (200-150)/2 = 25 , $obj->y 就应该是 (400-150)/2 = 125
$obj->x 
$obj->x
*/
<?php
function clipping($obj){ //输出裁剪图片
 
 $info=getimagesize($obj->url);
 
 $w=$info[0];
 $h=$info[1];
 
 switch($info[2]){
 case 1:
 $largeImage=imagecreatefromgif($obj->url);
 break;
 case 2:
 $largeImage=imagecreatefromjpeg($obj->url);
 break;
 case 3:
 $largeImage=imagecreatefrompng($obj->url);
 break;
 }
 
 //创建一张临时图片,图片的width和height是放大或缩小之后的
 $tempImage=imagecreatetruecolor($obj->largeWidth,$obj->largeHeight);
 
 //把即将要裁剪的图片放进这张临时图片
 imagecopyresampled($tempImage,$largeImage,0,0,0,0,$obj->largeWidth,$obj->largeHeight,$w,$h);
 
 //销毁原图,因为现在已经有一张临时图片了
 imagedestroy($largeImage);
 
 //创建一张新图,这张新图就是就要裁剪的大小
 $newImage = imagecreatetruecolor($obj->newWidth,$obj->newHeight);
 // 把临时图片放进裁剪图片,参数已在上面说明了
 imagecopyresampled($newImage,$tempImage,0,0,$obj->x,$obj->y,$obj->newWidth,$obj->newHeight,$obj->newWidth,$obj->newHeight);
 
 //销毁临时图片
 imagedestroy($tempImage);
 
 //直接在浏览器输出图片,输出前先执行 ob_clean();不然可能出现输出失败
 ob_clean();
 switch($info[2]){
 case 1:
 header('Content-Type:image/gif');
 imagegif($newImage); 
 break;
 case 2:
 header('Content-Type:image/jpeg');
 imagejpeg($newImage);
 break;
 case 3:
 header('Content-Type:image/png');
 imagepng($newImage);
 break;
 }
 //在浏览器输出之后就可以销毁了
 imagedestroy($newImage);
 }
?>

效果图,配合前端

点击确定后,前端像后端发送一组数据

这个url可能有点奇怪,但我的后台有特殊功能所以这个URL是正常的,你们测试改为正常的本地路径即可,注意,这组数据可不是对应上面的动态图,你们测试的时候呢可以找一张100*200的图,然后largeWidth=200,largeHeight=400,这样就相当于把这张图片放大两倍,接着裁剪100*200,这个时候裁剪100*200就是一半,因为你已经放大两倍了嘛,裁剪最中间的位置,x=50,y=100。注意,我的数据是对象类型,你们可以自行改为数组,方法里面也要改,当然最好传一个对象这样方法里面就不用改了。

<?php
 //后端测试 
 $obj=new stdClass();
 $obj->largeWidth=200;
 $obj->largeHeight=400;
 $obj->newWidth=100;
 $obj->newHeight=200;
 $obj->x=50;
 $obj->y=100;
 $obj->url='地址'; //找一张 100*200 的图像效果最好或者找 1:2 的
 clipping($obj); //把对象传进行即可
 ?>
 

如果你想保存到本地那就在 imagegif 和 imagejpeg 和 imagepng 方法里面加上第二个参数,把要保存的地址放进去,地址是完整的包含文件名的地址。

Tags:

最近发表
标签列表