PHP图像裁剪缩略裁切类源码及使用方法


Posted in PHP onJanuary 07, 2016

最近在做网页拖拽验证码的开源项目,需要在服务端生成图片对应的可移动的色块,但是网上的资源都是做缩略图,对整个图片进行缩放的,所以自己动手,完成了对图片进行裁剪小块的工具

<?php
namespace App\Libs;
/**
* 2016-01-07 15:54:58
* Lixiaoyu
* 
* mode 1 : 强制裁剪,生成图片严格按照需要,不足放大,超过裁剪,图片始终铺满
* mode 2 : 和1类似,但不足的时候 不放大 会产生补白,可以用png消除。
* mode 3 : 只缩放,不裁剪,保留全部图片信息,会产生补白,
* mode 4 : 只缩放,不裁剪,保留全部图片信息,生成图片大小为最终缩放后的图片有效信息的实际大小,不产生补白
* 默认补白为白色,如果要使补白成透明像素,请使用SaveAlpha()方法代替SaveImage()方法
*/
class ImageCrop{
var $sImage;
var $dImage;
var $src_file;
var $dst_file;
var $src_width;
var $src_height;
var $src_ext;
var $src_type;
function __construct($src_file,$dst_file=''){
$this->src_file=$src_file;
$this->dst_file=$dst_file;
$this->LoadImage();
}
function SetSrcFile($src_file){
$this->src_file=$src_file;
}
function SetDstFile($dst_file){
$this->dst_file=$dst_file;
}
function LoadImage(){
list($this->src_width, $this->src_height, $this->src_type) = getimagesize($this->src_file);
switch($this->src_type) {
case IMAGETYPE_JPEG :
$this->sImage=imagecreatefromjpeg($this->src_file);
$this->ext='jpg';
break;
case IMAGETYPE_PNG :
$this->sImage=imagecreatefrompng($this->src_file);
$this->ext='png';
break;
case IMAGETYPE_GIF :
$this->sImage=imagecreatefromgif($this->src_file);
$this->ext='gif';
break;
default:
exit();
}
}
function SaveImage($fileName=''){
$this->dst_file=$fileName ? $fileName : $this->dst_file;
switch($this->src_type) {
case IMAGETYPE_JPEG :
imagejpeg($this->dImage,$this->dst_file,100);
break;
case IMAGETYPE_PNG :
imagepng($this->dImage,$this->dst_file);
break;
case IMAGETYPE_GIF :
imagegif($this->dImage,$this->dst_file);
break;
default:
break;
}
}
function OutImage(){
switch($this->src_type) {
case IMAGETYPE_JPEG :
header('Content-type: image/jpeg');
imagejpeg($this->dImage);
break;
case IMAGETYPE_PNG :
header('Content-type: image/png');
imagepng($this->dImage);
break;
case IMAGETYPE_GIF :
header('Content-type: image/gif');
imagegif($this->dImage);
break;
default:
break;
}
}
function SaveAlpha($fileName=''){
$this->dst_file=$fileName ? $fileName . '.png' : $this->dst_file .'.png';
imagesavealpha($this->dImage, true);
imagepng($this->dImage,$this->dst_file);
}
function OutAlpha(){
imagesavealpha($this->dImage, true);
header('Content-type: image/png');
imagepng($this->dImage);
}
function destory(){
imagedestroy($this->sImage);
imagedestroy($this->dImage);
}
function Crop($dst_width,$dst_height,$mode=1,$dst_file=''){
if($dst_file) $this->dst_file=$dst_file;
$this->dImage = imagecreatetruecolor($dst_width,$dst_height);
$bg = imagecolorallocatealpha($this->dImage,255,255,255,127);
imagefill($this->dImage, 0, 0, $bg);
imagecolortransparent($this->dImage,$bg);
$ratio_w=1.0 * $dst_width / $this->src_width;
$ratio_h=1.0 * $dst_height / $this->src_height;
$ratio=1.0;
switch($mode){
case 1: // always crop
if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)){
$ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($dst_width / $ratio);
$tmp_h = (int)($dst_height / $ratio);
$tmp_img=imagecreatetruecolor($tmp_w , $tmp_h);
$src_x = (int) (($this->src_width-$tmp_w)/2) ;
$src_y = (int) (($this->src_height-$tmp_h)/2) ;
imagecopy($tmp_img, $this->sImage, 0,0,$src_x,$src_y,$tmp_w,$tmp_h);
imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h);
imagedestroy($tmp_img);
}else{
$ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($this->src_width * $ratio);
$tmp_h = (int)($this->src_height * $ratio);
$tmp_img=imagecreatetruecolor($tmp_w ,$tmp_h);
imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
$src_x = (int)($tmp_w - $dst_width) / 2 ;
$src_y = (int)($tmp_h - $dst_height) / 2 ;
imagecopy($this->dImage, $tmp_img, 0,0,$src_x,$src_y,$dst_width,$dst_height);
imagedestroy($tmp_img);
}
break;
case 2: // only small
if($ratio_w < 1 && $ratio_h < 1){
$ratio = $ratio_w < $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($dst_width / $ratio);
$tmp_h = (int)($dst_height / $ratio);
$tmp_img=imagecreatetruecolor($tmp_w , $tmp_h);
$src_x = (int) ($this->src_width-$tmp_w)/2 ;
$src_y = (int) ($this->src_height-$tmp_h)/2 ;
imagecopy($tmp_img, $this->sImage, 0,0,$src_x,$src_y,$tmp_w,$tmp_h);
imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h);
imagedestroy($tmp_img);
}elseif($ratio_w > 1 && $ratio_h > 1){
$dst_x = (int) abs($dst_width - $this->src_width) / 2 ;
$dst_y = (int) abs($dst_height -$this->src_height) / 2;
imagecopy($this->dImage, $this->sImage,$dst_x,$dst_y,0,0,$this->src_width,$this->src_height);
}else{
$src_x=0;$dst_x=0;$src_y=0;$dst_y=0;
if(($dst_width - $this->src_width) < 0){
$src_x = (int) ($this->src_width - $dst_width)/2;
$dst_x =0;
}else{
$src_x =0;
$dst_x = (int) ($dst_width - $this->src_width)/2;
}
if( ($dst_height -$this->src_height) < 0){
$src_y = (int) ($this->src_height - $dst_height)/2;
$dst_y = 0;
}else{
$src_y = 0;
$dst_y = (int) ($dst_height - $this->src_height)/2;
}
imagecopy($this->dImage, $this->sImage,$dst_x,$dst_y,$src_x,$src_y,$this->src_width,$this->src_height);
}
break;
case 3: // keep all image size and create need size
if($ratio_w > 1 && $ratio_h > 1){
$dst_x = (int)(abs($dst_width - $this->src_width )/2) ;
$dst_y = (int)(abs($dst_height- $this->src_height)/2) ;
imagecopy($this->dImage, $this->sImage, $dst_x,$dst_y,0,0,$this->src_width,$this->src_height);
}else{
$ratio = $ratio_w > $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($this->src_width * $ratio);
$tmp_h = (int)($this->src_height * $ratio);
$tmp_img=imagecreatetruecolor($tmp_w ,$tmp_h);
imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
$dst_x = (int)(abs($tmp_w -$dst_width )/2) ;
$dst_y = (int)(abs($tmp_h -$dst_height)/2) ;
imagecopy($this->dImage, $tmp_img, $dst_x,$dst_y,0,0,$tmp_w,$tmp_h);
imagedestroy($tmp_img);
}
break;
case 4: // keep all image but create actually size
if($ratio_w > 1 && $ratio_h > 1){
$this->dImage = imagecreatetruecolor($this->src_width,$this->src_height);
imagecopy($this->dImage, $this->sImage,0,0,0,0,$this->src_width,$this->src_height);
}else{
$ratio = $ratio_w > $ratio_h ? $ratio_h : $ratio_w;
$tmp_w = (int)($this->src_width * $ratio);
$tmp_h = (int)($this->src_height * $ratio);
$this->dImage = imagecreatetruecolor($tmp_w ,$tmp_h);
imagecopyresampled($this->dImage,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height);
}
break;
}
}// end Crop
/**
*
* 裁切方法
* 2016-01-07 15:05:44
* Lixiaoyu
*
* @param $dst_width 目标长
* @param $dst_height 目标高
* @param $dst_x 裁剪部分和原图左侧的距离
* @param $dst_y 裁剪部分和原图右侧的距离
* @param int $mode 模式
* @param string $dst_file 目标文件路径
*/
function Cut($dst_width,$dst_height,$dst_x,$dst_y,$dst_file='')
{
if ($dst_file) $this->dst_file = $dst_file; //设置目标文件位置
$this->dImage = imagecreatetruecolor($dst_width, $dst_height); //创建了目标文件的大小的画布
$bg = imagecolorallocatealpha($this->dImage, 255, 255, 255, 127); //给画布分配颜色
imagefill($this->dImage, 0, 0, $bg); //给图像用颜色进行填充
imagecolortransparent($this->dImage, $bg); //背景定义成透明色
$ratio_w = 1.0 * $dst_width / $this->src_width; //横向缩放的比例
$ratio_h = 1.0 * $dst_height / $this->src_height; //纵向缩放的比例
//var_dump($this);
//不进行缩放,直接对图像进行裁剪
$ratio = 1.0;
$tmp_w = (int)($dst_width / $ratio);
$tmp_h = (int)($dst_height / $ratio);
$tmp_img = imagecreatetruecolor($dst_width, $dst_height); //创建暂时保存的画布
imagecopy($tmp_img, $this->sImage, 0,0,$dst_x,$dst_y,$dst_width,$dst_height); //拷贝出图像的一部分,进行裁切
imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h); //把暂时缓存的图片,放到目标文件里面
imagedestroy($tmp_img);
}
}
?>

Use

裁剪图像

$ic=new ImageCrop($pathToFile,'./pic/afterCrop'.time().'.jpg');
$ic->Cut(40,30,120,130);
$ic->SaveImage();
//$ic->SaveAlpha();将补白变成透明像素保存
$ic->destory();

实现效果

原图

PHP图像裁剪缩略裁切类源码及使用方法

裁剪之后的图

PHP图像裁剪缩略裁切类源码及使用方法

缩放图像

原图

PHP图像裁剪缩略裁切类源码及使用方法

缩略图

PHP图像裁剪缩略裁切类源码及使用方法

本文重点在于使用图像处理函数 imagecopy 和 imagecopyresampled

bool imagecopy ( resource dstim,resourcesrc_im , int dstx,intdst_y , int srcx,intsrc_y , int srcw,intsrc_h )
将 src_im 图像中坐标从 src_x,src_y 开始,宽度为 src_w,高度为 src_h 的一部分拷贝到 dst_im 图像中坐标为 dst_x 和 dst_y 的位置上。

PHP 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
深入PHP curl参数的详解
Jun 17 PHP
PHP实现PDO的mysql数据库操作类
Dec 12 PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 PHP
php中JSON的使用方法
Apr 30 PHP
Symfony2联合查询实现方法
Mar 18 PHP
php结合ajax实现手机发红包的案例
Oct 13 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
详解PHP如何更好的利用PHPstorm的自动提示
Aug 18 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 #PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 #PHP
详解WordPress开发中wp_title()函数的用法
Jan 07 #PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 #PHP
PHP编程基本语法快速入门手册
Jan 07 #PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
Jan 07 #PHP
WordPress开发中用于标题显示的相关函数使用解析
Jan 07 #PHP
You might like
建站常用13种PHP开源CMS比较
2009/08/23 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
python中pass语句用法实例分析
2015/04/30 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
毕业生找工作推荐信
2013/11/21 职场文书
二年级体育教学反思
2014/01/15 职场文书
个性婚礼策划方案
2014/05/17 职场文书
植物生产学专业求职信
2014/08/08 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
房租涨价通知
2015/04/23 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
创业计划书之校园超市
2019/09/12 职场文书