博客已转移:PHP上传裁切
发现经常有人在技术群里问要PHP图片上传裁切并且预览的例子。今天正好有时间,就亲自做了一个,同时把方法公布出来,让大家可以理解,学会如何用ThinkPHP+jcrop做这个例子。首先先下来jcrop,网址:http://deepliquid.com/content/Jcrop_Download.html
下载完成后,里面有js,demo,css等文件夹.demo里是例子,建议大家先看一下源代码.剩下的,跟我一起来做这个例子:
1.下载ThinkPHP,然后新建项目,生成项目目录
2.在Tpl中新建Index/index.html
代码如下
上传图片
这是一个上传,在点击上传图片以后,会弹出一个窗口,专门用来上传图片裁切。在Tpl/Index/下新建upimg.html
代码如下:
上传图片
我没有用TP自带的文件上传类,如果大家需要,可以改下,以上主要就是弹出一个上传文件的窗口,在这个窗口中会完成文件上传,裁切等操作。点击提交到Index/uploadf
Index/uploadf代码如下:
$path = "uploadfiles/"; //图片上传地址 if (! file_exists ( $path )) { mkdir ( "$path", 0700 ); } $tp = array ( "image/gif", "image/jpeg", "image/png", "image/jpg" ); if (! in_array ( $_FILES ["filename"] ["type"], $tp )) { echo "格式不对"; exit (); } // END IF if ($_FILES ["filename"] ["name"]) { $file1 = $_FILES ["filename"] ["name"]; $file2 = $path . time () . $file1; $flag = 1; } if ($flag) $result = move_uploaded_file ( $_FILES ["filename"] ["tmp_name"], $file2 ); if ($result) { $this->assign('filename',$file2); $this->display(); }
上传完成以后会直接跳转到uploadf.html
Insert title here ![]()
![]()
这里的代码比较长,慢慢解释吧,我直接复制的jcrop demo里的tutorial3.html,加载他自己需要的js,css。其中
#preview-pane .preview-container { width: 170px; height: 250px; overflow: hidden; }
这部分CSS会影响到出来的裁切框的比例。以及预览处的大小。
$('#target').Jcrop({ onChange : updatePreview, onSelect : updatePreview, aspectRatio : xsize / ysize }, function() { var bounds = this.getBounds(); boundx = bounds[0]; boundy = bounds[1]; jcrop_api = this; $preview.appendTo(jcrop_api.ui.holder); });
onChange和onSelect处的意思是裁切的时候要执行的js代码,说实话,我js和jq的水平很垃圾。所以不管了。
function updatePreview(c) { if (parseInt(c.w) > 0) { var rx = xsize / c.w; var ry = ysize / c.h; $pimg.css({ width : Math.round(rx * boundx) + 'px', height : Math.round(ry * boundy) + 'px', marginLeft : '-' + Math.round(rx * c.x) + 'px', marginTop : '-' + Math.round(ry * c.y) + 'px' }); $('#x').val(c.x); $('#y').val(c.y); $('#w').val(c.w); $('#h').val(c.h); } } ;
这个后面我自己加了一个赋值,赋值给form表单中。然后在提交到php完成裁切工作
点击提交到uploadf中,可以自己先写一个图片裁切的类:
filename = $filename; $pathinfo = pathinfo ( $filename ); $this->ext = $pathinfo ['extension']; } else { $e = new Exception ( 'the file is not exists!', 1050 ); throw $e; } $this->x = $x; $this->y = $y; $this->x1 = $x1; $this->y1 = $y1; } /** * 生成截图 * 根据图片的格式,生成不同的截图 */ public function generate_shot() { switch ($this->ext) { case 'jpg' : return $this->generate_jpg (); break; case 'png' : return $this->generate_png (); break; case 'gif' : return $this->generate_gif (); break; default : return false; } } /** * 得到生成的截图的文件名 */ private function get_shot_name() { $pathinfo = pathinfo ( $this->filename ); $fileinfo = explode ( '.', $pathinfo ['basename'] ); $filename = $fileinfo [0] . '_small.' . $this->ext; return 'uploadfiles/'.$filename; } /** * 生成jpg格式的图片 */ private function generate_jpg() { $shot_name = $this->get_shot_name (); $img_r = imagecreatefromjpeg ( $this->filename ); $dst_r = ImageCreateTrueColor ( $this->width, $this->height ); imagecopyresampled ( $dst_r, $img_r, 0, 0, $this->x, $this->y, $this->width, $this->height, $this->x1, $this->y1 ); imagejpeg ( $dst_r, $shot_name, $this->jpeg_quality ); return $shot_name; } /** * 生成gif格式的图片 */ private function generate_gif() { $shot_name = $this->get_shot_name (); $img_r = imagecreatefromgif ( $this->filename ); $dst_r = ImageCreateTrueColor ( $this->width, $this->height ); imagecopyresampled ( $dst_r, $img_r, 0, 0, $this->x, $this->y, $this->width, $this->height, $this->x1, $this->y1 ); imagegif ( $dst_r, $shot_name ); return $shot_name; } /** * 生成png格式的图片 */ private function generate_png() { $shot_name = $this->get_shot_name (); $img_r = imagecreatefrompng ( $this->filename ); $dst_r = ImageCreateTrueColor ( $this->width, $this->height ); imagecopyresampled ( $dst_r, $img_r, 0, 0, $this->x, $this->y, $this->width, $this->height, $this->x1, $this->y1 ); imagepng ( $dst_r, $shot_name ); return $shot_name; } } ?>
这个是我在网上down的.~没自己写,自己可以根据需求扩展一下.
裁切操作:
$filename=$this->cut(); echo ""; echo (""); echo ''; //裁切的方法 function cut(){ import('ORG.Net.Imgshot'); $imgshot=new Imgshot(); $imgshot->initialize(SITE_PATH.'/'.$_REQUEST['filename'], $_REQUEST['x'], $_REQUEST['y'], $_REQUEST['x']+$_REQUEST['w'], $_REQUEST['y']+$_REQUEST['h']); $filename=$imgshot->generate_shot(); return $filename; }
完成以后会直接echo出最后裁切的图片,并且还有一个确定按钮,点击确定以后,则会把裁切后图像的地址返回到最一开始的input[type="text"]。整个例子我还没有完善,大家可以根据需要自己去理解和完善。好了,如果不会的朋友可以加群:252799167问我。整个例子我已经发布到ThinkPHP的官网,大家可以下载。
http://www.thinkphp.cn/topic/9154.html