1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > PHP Uploadify图片上传裁剪

PHP Uploadify图片上传裁剪

时间:2020-05-04 13:58:54

相关推荐

PHP Uploadify图片上传裁剪

php教程|php手册

PHP,Uploadify,图片,上传,裁剪,网站,需要,一

php教程-php手册

手机版查询网站源码,vscode的图像域,Ubuntu下载cpp,tomcat性能如何设置,量化工具是什么意思sqlite,蚂蚁爬虫,php信息录入系统,黄石服装seo推广价格,如何编辑网站php源代码,通达oa打印模板lzw

在网站中需要一个图片上传裁剪的功能,借鉴这篇文章Ajax+PHP+jQuery图片截图上传的指点,找到了jquery.imgAreaSelect这个不错插件,能对图片进行自定义区域选择并给出坐标,类似微博等同类网站上传头像要求按比例裁剪的功能,正合适就自己做了个。 文件上传

教育网址导航源码下载,vscode运行c语言文件,安装ubuntu麒麟,tomcat 授权,sqlite 3.7,一套精致的响应式网页设计模版psd下载,怎么在数据库中建立 磁盘,哪家服务器租用号,jquery软键盘插件,前端框架antt,术语爬虫,php 网络编程,双鸭山SEO,springboot写脚本,jquery 自动生成标签,b2b网站模板整站源码,网页扎金花源码,网站模板抓取工具,织梦后台登陆不显示验证码,手机问卷调查页面,php留言统一管理系统,程序界面皮肤素材lzw

php 源码 手机,vscode中文怎么下,ubuntu安装webp,配置tomcat步骤,sqlite管理工具登录,湖州市有没有爬虫店,php培训出来,广州seo服务怎么收费,交友网站自带会员,html励志网页模板免费下载,dedecms蓝色企业网站模板免费下载lzw

在网站中需要一个图片上传裁剪的功能,借鉴这篇文章 Ajax+PHP+jQuery图片截图上传 的指点,找到了jquery.imgAreaSelect这个不错插件,能对图片进行自定义区域选择并给出坐标,类似微博等同类网站上传头像要求按比例裁剪的功能,正合适就自己做了个。

文件上传类经常使用到一个叫uploadify的插件,上面提到的文章也结合了uploadify插件的使用,只是现在版本的uploadify一些配置和方法已经改变了(3.2.1版本)。包括jquery.imgareaselect的一些API也有新的变化,在做的过程中通过查询文档才确认了一些功能和配置的用法。

下面是两个插件的地址

uploadify: / ( 有 uploadifive(HTML5) 版本和 Flash 版本,顾及不支持HTML5的浏览器,目前建议选择Flash版本 )

jquery.imgareaselect: /projects/imgareaselect ( 需先有 jQuery )

具体的流程都相似,客户端uploadify替代表单接收原图,异步上传到服务器,服务器端接收后存储并返回图片文件名,取得文件名后可在浏览器显示出原图,这时在图片元素上配置imgareaselect使其可划定裁剪区域,划定结束后坐标传回服务器,PHP脚本接收换算后的坐标对原图进行裁剪。上面提到的文章中有详细的流程图,作者非常细心。

下面说说我写的过程

上细节:首先是前端的配置

demo.php:

[javascript] view plaincopy

$field = $(“input[type=’file’]”); $field.uploadify({//配置uploadify‘buttonText’: ‘选择图片’, //选择按钮显示的字符‘swf’ : ‘/uploadify/uploadify.swf’, //swf文件的位置‘uploader’ : ‘/receivePic.php’, //上传的接收者‘cancelImg’ : ‘/uploadify/uploadify-cancel.jpg’,‘folder’ : ‘/picture’,//上传图片的存放地址‘auto’: false, //选择图片后是否自动上传‘multi’: false, //是否允许同时选择多个(false一次只允许选中一张图片)‘method’ : ‘post’,‘queueSizeLimit’ : 1,//最多能选择加入的文件数量‘fileTypeExts’: ‘*.jpg; *.jpg; *.jpg’, //允许的后缀‘fileTypeDesc’: ‘Image Files’, //允许的格式,详见文档 ‘onSelect’: function(file) {//选择文件后的触发事件$(“a.xtPicSubmit”).show().click(function(){//自定义的按钮,显示点击执行上传 $field.uploadify(‘upload’,’*’);//此处触发上传});$wrap.find(“p.picInfo span”).text(file.name);//file.name为选中的图片名称}, ‘onUploadSuccess’ : function(file, data, response) { //上传成功后的触发事件$field.uploadify(‘disable’, true); //(上传成功后)’disable’禁止再选择图片data = JSON.parse(data); //data为接收方(receivePic.php)返回的数据,稍后描述//此时开始对取回的数据处理出需要的图片名,宽高,并计算出原图比例尺,开始设定裁剪需要的计算量 var orignW = data.width,//存储原图的宽高,用于计算 orignH = data.height, aspectRatio = JSON.parse(picFormat)[index].width/JSON.parse(picFormat)[index].height,//提前设定的裁剪宽高比,规定随后裁剪的宽高比例 frameW = 260, //原图的缩略图固定宽度,作为一个画布,限定宽度,高度自适应,保证了原图比例 frameH = 0, prevFrameW = 140, //预览图容器的高宽,宽度固定,高为需要裁剪的宽高比决定 prevFrameH = 140/aspectRatio, rangeX = 1, //初始缩放比例 rangeY = 1, prevImgW = prevFrameW, //初始裁剪预览图宽高 prevImgH = prevFrameW; $imgTar = $wrap.find(“img.pic”), //画布$imgCut = $cut.find(“img.cutImg”);//预览图 $imgTar.attr(“src”,”/Picture/”+data.filename);//显示已上传的图片,此时图片已在服务器上frameH = Math.round(frameW*orignH/orignW);//根据原图宽高比和画布固定宽计算画布高,即$imgTar加载上传图后的高。此处不能简单用.height()获取,有DOM加载的延迟$cut.find(“.preview”).css(‘height’,Math.round(prevFrameH)+”px”);//设置裁剪后的预览图的容器高,注意此时的高度应由裁剪宽高比决定,而非原图宽高比//准备存放图片数据的变量,便于传回裁剪坐标CutJson.name = data.filename;CutJson.position = {};//准备好数据后,开始配置imgAreaSelect使得图片可选区var imgArea = $imgTar.imgAreaSelect({ //配置imgAreaSelect instance: true, //配置为一个实例,使得绑定的imgAreaSelect对象可通过imgArea来设置 handles: true, //选区样式,四边上8个方框,设为corners 4个 fadeSpeed: 300, //选区阴影建立和消失的渐变 aspectRatio:’1:’+(1/aspectRatio), //比例尺 onSelectChange: function(img,selection){//选区改变时的触发事件 /*selection包括x1,y1,x2,y2,width,height几个量,分别为选区的偏移和高宽。*/ rangeX = selection.width/frameW; //依据选取高宽和画布高宽换算出缩放比例 rangeY = selection.height/frameH; prevImgW = prevFrameW/rangeX; //根据缩放比例和预览图容器高宽得出预览图的高宽 prevImgH = prevFrameH/rangeY;//实时调整预览图预览裁剪后效果,可参见/projects/imgareaselect/ 的Live Example $imgCut.css({‘width’ : Math.round(prevImgW)+”px”,‘height’ : Math.round(prevImgH)+”px”,‘margin-left’:”-“+Math.round((prevFrameW/selection.width)*selection.x1)+”px”,‘margin-top’ :”-“+Math.round((prevFrameH/selection.height)*selection.y1)+”px”}); }, onSelectEnd: function(img,selection){//放开选区后的触发事件 //计算实际对于原图的裁剪坐标 CutJson.position.x1 = Math.round(orignW*selection.x1/frameW); CutJson.position.y1 = Math.round(orignH*selection.y1/frameH); CutJson.position.width = Math.round(rangeX*orignW); CutJson.position.height = Math.round(rangeY*orignH); }});} });

此时已经取得了裁剪的坐标,只需将坐标传回服务器交给脚本处理

使用jQuery的ajax方法回传数据:

[javascript] view plaincopy

$(“a.getCut”).click(function(){$.ajax({type: “POST”,url : “cutPic.php”,data: { name:data.filename,position:JSON.stringify(CutJson.position) },success: function(data){$imgTar.attr(‘src’,”/picture/cut/”+data); //裁剪成功传回生成的新图文件名,将结果图显示到页面}}); });

至此前端的处理就基本完成了(代码省去了一些状态显示,元素变化的处理细节),下面是后端的两个脚本:

首先是接收上传图片的脚本,接收并存储图片后返回图片数据:

receivePic.php

[php] view plaincopy

//上传文件处理代码与往常相同,此处省去..$arr = getimagesize(‘/picture/’.$file[‘name’]); $strarr = explode(“\””,$arr[3]);//分析图片宽高 $data = array( ‘filename’=>$file[‘name’], ‘width’=>$strarr[1], ‘height’=>$strarr[3] ); echo json_encode($data);

接下来是裁剪,其中也用到了PIPHP_ImageCrop裁剪函数

cutPic.php:

[php] view plaincopy

function PIPHP_ImageCrop($image, $x, $y, $w, $h){$tw = imagesx($image);$th = imagesy($image); if ($x > $tw || $y > $th || $w > $tw || $h > $th) return FALSE; $temp = imagecreatetruecolor($w, $h);imagecopyresampled($temp, $image, 0, 0, $x, $y, $w, $h, $w, $h);return $temp; }$pic = ‘/picture/’.$_POST[‘name’]; $cutPosition = json_decode($_POST[‘position’]); //取得上传的数据 $x1 = $cutPosition->x1; $y1 = $cutPosition->y1; $width = $cutPosition->width; $height = $cutPosition->height;$type=exif_imagetype($pic); //判断文件类型 $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(); } switch($type) { case IMAGETYPE_JPEG : $image = imagecreatefromjpeg($pic); break; case IMAGETYPE_PNG : $image = imagecreatefrompng($pic); break; case IMAGETYPE_GIF : $image = imagecreatefromgif($pic); break; default: echo “Load image error!”; exit(); }$copy = PIPHP_ImageCrop($image, $x1, $y1, $width, $height);//裁剪$targetPic = ‘/picture/cut/’.$_POST[‘name’];imagejpeg($copy, $targetPic); //输出新图@unlink($pic);//删除原图节省空间echo $_POST[‘pic’].’?’.time(); //返回新图地址

整个过程就完成了。上个效果图:

开始的部分很多参考了Ajax+PHP+jQuery图片截图上传 此篇详细的文章,这里再次说明。

后端的交互很轻松,任务主要在于前端两个插件之间的搭建和使用,我的代码写的比较仓促,应该需要更加结构化一点。另外上传文件的各方面控制也是一个风险(类型,大小等),值得更多的考虑。

/as66t/article/details/11688217

———————————————————————————————————————-

A、功能分析

用户直接上传图片,点击”上传”按钮之后,在图片预览图内可预览图片,然后进行图片的裁剪前预览,当点击”裁剪”按钮时确定裁剪图片,并在”裁剪结果”区域显示裁剪后的效果。

(说明:我是将上传文件保存在”/uploads”文件夹中,而截图结果放在”/avatar”文件夹里)

实现效果预览:

B、解决方案

1、插件的选择

jQuery:这个是必备的一个插件可以到官网上下载

/Downloading_jQuery

imgAreSselect:这个是实现客户端上图片区域选择的

/projects/imgareaselect/

uploadify:实现文件的上传的功能,支持多文件上传,且可定制性非常强。

/download/

上面的插件是用在客户端上,其实在我这个程序里写PHP时也用了一些插件。其实我之所以写”图像剪裁上传”的起源是因为我看了《PHP快速开发工具箱》想自己练习一下的。该书是有一个网址(/),里面有整本书的代码,而且每个插件都相应的demo,非常不错。下面是用到的PHP插件:

PIPHP_UploadFile.php:这是一个文件上传功能的php文件

/plug-in11.php

PIPHP_ImageCrop.php:这个php文件是具有对图片进行裁剪的功能

/plug-in15.php

2、客户端与服务器之间的交互图

为了便于理解,我先把交互图放在这里。其中绿色部分是客户端的主要步骤、粉红色是服务器端的主要步骤,服务器与客户端之间的交互通过AJAX完成。可以发现,大部分的操作在客户端进行,服务器端与客户端之间的交流只是简单的JSON数据,因此这样给用户的体验是非常高的。

截图 1客户端与服务器之间交互图

3、客户端文件

展示给用户的是html页面,为了学习并巩固CSS知识,就和DIV+CSS搭建了下面这样一个前台页面,见截图 2。

截图 2前台页面

跟客户端有关的文件主要是一个index.html,而在这个文件里面会引用其他的插件文件,因此可以说,客户端方面只有一个html文件。

另外,由于这里主要讨论客户端与浏览器之间的交互,因此略过CSS方面的内容。这里只列出HTML的代码,首先是部分:

图片剪切上传

可以看得出来主要是引用一些插件的文件。上面的文件(包括CSS文件与js文件)都可以从我给的链接里下载到,只是样式表layout.css是我自己写的样式表,大家可以根据自己的CSS知识写出。

接下来是body部分,也许这么看代码比较乱,推荐使用一些带有高亮显示的工具来查看这些代码,比如DreamWeaver等IDE,实在不行,也可以用火狐的”查看源代码”来看。(火狐不仅是一个好浏览器,更是一个极棒的调试器!)

为了方便起见,我去掉诸如”导航条”、页脚版权声明等点缀部分,只给出必要的html代码。

图片预览

裁剪结果:

裁剪预览:

<div id=”preview”>

上面我用颜色区分开主要DIV区,这三块分别代表”上传图片区”、”大图展示区”、”截图结果区”与”选择预览区”。其中三个粗体部分是带有ID属性的空DIV,用来放图片用的。(到时时候动态加载图片到这些DIV中),因此这段代码形成的HTML框架如截图 2所示。(蓝色线条是block元素边界,此效果较是由火狐的插件制作而成):

截图 3 页面大体框架

基本的准备工作已经完成,待会儿再继续在这个框架上添加代码。咱们先介绍一下服务器上的PHP是怎么个情况。

4、服务器文件

服务器上主要用到两个PHP文件,一个用来处理上传图片的process.php,另外一个则是处理图片截图用的crop.php。不过,process.php文件包括插件PIPHP_UploadFile.php,而crop.php中包括PIPHP_ImageCrop.php插件。(这些插件的地址我在上面已经给出了)

=======

process.php主要接收上传图片,设置限制(比如文件的大小与格式),处理一些上传错误等,最后返回给客户端JSON,里面包含了所上传文件的一些信息(比如路径、大小等);当在客户端点击”上传”按钮的时候,会用异步(AJAX)的方式调用这个php文件。

=======

crop.php主要负责真正裁剪上传的图片,当在客户端返回裁剪的位置后(点击”裁剪”按钮后),以异步方式将数据以JSON的方式传递给服务器,crop.php真正裁剪图片后,将图片另存到网络的目录下,同时返回此图片的存储路径,然后再让客户端显示图片即可

C、用到的技术摘要

现在根据上面的交互图继续完善代码。因此我这节会交叉地完善html、js与php代码,并不会单独分开完善,这样在逻辑上会更好理解。

声明:新增的代码部分用粗体表示

1、uploadify上传

$(document).ready(function(){

//uploadify设置

$(‘#pic_upload’).uploadify({

‘uploader’ : ‘/uploadify/uploadify.swf’,

‘script’ : ‘process.php’,

‘cancelImg’ : ‘/uploadify/cancel.jpg’,

});

}

上面的代码只是uploadify这一个插件的配置项而已。为了增强用户体验可以详细配置其他选项,这参考这个插件的官方文档:/documentation/。上面的’script’选项就是选择服务器的处理脚本,我们这里就使用process.php了。上传文件到服务器后会让服务器自动调用这个程序。那么客户端怎么知道服务器的process.php调用完了呢?如何获取process.php反馈回来的信息呢?——其实uploadify它提供了一个”触发”选项onComplete,就是用来处理服务器的反馈信息的,我们稍后再写这个选项的内容,先看看process.php是返回哪些内容的呢。

2、process.php反馈上传信息

process.php的任务就是给浏览器返回JSON数据(至于什么是JSON请参考其它教学,把JSON想像成”键/值”对就可以了,它很方便数据的传输与读取)。在PHP里,一般是先把数据整理成数组的形式,然后使用json_encode()把数据转换成JSON。那process.php应该给浏览器返回什么样的数据呢?

文件是否成功上传 -> message

文件的上传状态代码 -> code

文件上传的存放路径 -> path

图片的宽度-> width

图片的高度 -> height

图片的缩放比例 -> scale

图片的名称-> name

其中之所以设置图片的缩放比例scale,是因为如果用户上传的图片尺寸太大(比如800x800),浏览器中的DIV会被”撑开”,布局会被打乱。因此我们限定在浏览器显示图片的时候任何一边长不能超过400px,否则在显示的时候以等比例缩放。(比如上面的800×800的图上会显示成400×400的,然后浏览器同时设置scale为0.5)。

另外,这个php文件是调用了PIPHP_UploadFile.php这个插件,用来将上传的文件进行”鉴别”与”搬移”。

下面是process.php的程序:

<?php

require_once(dirname(__FILE__).”/../PIPHP_UploadFile.php”);

$response=array(

‘message’=>’未知上传错误’,

‘path’=>”,

‘code’=>-4, //上传结果代码,0表示成功,-1表示失败

‘width’=>100,

‘height’=>100,

‘scale’=>1, //比例尺

‘name’=>”

);

if (!empty($_FILES))

{

$name=’picture’;

$uploadFile=’uploads/’;

$maxLen=9*1024*1024;

$result=PIPHP_UploadFile($name,$uploadFile,$maxLen);

$response[‘code’]=$result[0];

//简单汇报成功情况

if($result[0]==0)

{

$response[‘message’]=’上传成功!’;

//$response[‘message’]=$result[2];

$response[‘path’]=$result[1];

$response[‘name’]=$result[2];

//获取图像的高度与宽度

$fileName=iconv(“utf-8″,”gb2312”,$result[2]);

list($width,$height)=getimagesize($_SERVER[‘DOCUMENT_ROOT’].$uploadFile.$fileName);

$response[‘width’]=$width;

$response[‘height’]=$height;

}

else

{

switch($result[0])

{

case -1: $response[‘message’]=”上传失败”; break;

case -2: $response[‘message’]=”文件类型错误”;break;

case -3: $response[‘message’]=”文件大小超过限制”;break;

default: $response[‘message’]=”错误代码:$result[0]”;

}

}

}

else{

$response[‘message’]=”上传文件出现错误!”.”

“;

}

$json_str=json_encode($response);

echo $json_str;

?>

其实这个程序因为有了if判断语句而显示有点大,其实逻辑还是挺简单的。无论如何,这个程序返回的我上面说的有关图片的上传信息(放在$json_str这变量里了)

3、继续改进uplodify的配置

从上面知道,process.php返回的是一个$json_str变量,它里面有图像的路径,这样我们就可以在浏览器中显示图片啦!(注意此时显示的图片已经是在服务器上了)

现在添加uploadify的’onComplete’选项,它告诉浏览器当process.php返回数据时应该怎么做。

$(‘#pic_upload’).uploadify({

‘uploader’ : ‘/uploadify/uploadify.swf’,

‘script’ : ‘process.php’,

‘cancelImg’ : ‘/uploadify/cancel.jpg’,

‘onComplete’: function(event, ID, fileObj, response, data) {

json_str=JSON.parse(response);

var maxSize=400;

var width=json_str.width;

var height=json_str.height;

var scale=json_str.scale;

if(json_str.code == 0)

{

$(‘#uploadInfo’).html(json_str.message+’

平均上传速度:’+ data.speed.toFixed(2) + ‘Kb/s’);

//对图像进行缩放

if(json_str.width > maxSize || json_str.height >maxSize){

if( json_str.width > json_str.height)

{

width = maxSize;

height = maxSize / json_str.width * json_str.height;

json_str.scale = maxSize / json_str.width;

}

else

{

height = maxSize;

width = maxSize / json_str.height * json_str.width;

json_str.scale = maxSize / json_str.height;

}

}

$(‘#oriImage’).html(‘

这里我使用了

元素,其实没有必要,可以是任何元素,因为我们使用的是强大的jQuery的ajax()方法。

当用户确定要裁剪时,按下此按钮就会调用ajax()方法。我们将处理程序写在head部分的元素中:

//加载裁剪框

$(‘#initCrop’).click(function(e){

});

//裁剪动作,将数据传给服务器,同时ajax返回图片

$(“#crop”).click(function(e){

if(!(typeof json_str == ‘undefined’))

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。