`
lgzbj2006
  • 浏览: 27994 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Uploadify & jQuery.imgAreaSelect 插件实现图片上

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



QQ截图20130914160306



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

下面是两个插件的地址

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

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

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

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

$field = $("input[type='file']"); 
$field.uploadify({//配置uploadify 
    'buttonText': '选择图片',  //选择按钮显示的字符 
    'swf'       : '/uploadify/uploadify.swf', //swf文件的位置 
    'uploader'  : '/receivePic.php', //上传的接收者 
    'cancelImg' : '/uploadify/uploadify-cancel.png', 
    'folder'    : '/picture',//上传图片的存放地址 
    'auto'      : false,    //选择图片后是否自动上传 
    'multi'     : false,   //是否允许同时选择多个(false一次只允许选中一张图片) 
    'method'    : 'post', 
    'queueSizeLimit' : 1,//最多能选择加入的文件数量 
    'fileTypeExts': '*.gif; *.jpg; *.png', //允许的后缀 
    '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; 
  
//实时调整预览图预览裁剪后效果,可参见http://odyniec.net/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方法回传数据:

$("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

//上传文件处理代码与往常相同,此处省去.. 
  
$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:

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(); //返回新图地址 


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



QQ截图20130914160306



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

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

  本文链接:http://www.cnblogs.com/oooweb/p/uploadify-jquery-image-cropper.html
分享到:
评论

相关推荐

    jquery.uploadify-v2.1.4[修正版]

    在Web开发中,上传功能是不可或缺的一部分,而jQuery.uploadify插件以其强大的功能和易用性深受开发者喜爱。这个"jquery.uploadify-v2.1.4[修正版]"正是基于官方的v2.1.4版本进行了一次关键的优化,特别针对中文支持...

    jquery文件上传插件 jquery.uploadify.js

    《jQuery文件上传插件jQuery.uploadify.js:跨越浏览器限制的智能解决方案》 在Web开发中,文件上传功能是一项常见的需求,而jQuery.uploadify.js是一款高效且用户友好的文件上传插件,尤其对于需要兼容多种浏览器...

    jquery.uploadify-3.1.min.js

    jquery.uploadify-3.1.min.js 修改了SWFUpload.prototype.getFlashHTML ()方法,解决了在ie9在点击上传按钮后,不能弹出浏览文件的对话框问题。

    jquery.uploadify.v2.1.0.js 上传

    jquery.uploadify.v2.1.0.js 上传

    jquery.uploadify.js 3.2.1

    uploadfiy这个插件是基于js里面的jquery库写的。结合了ajax和flash,实现了这个多线程上传的功能。

    jquery.uploadify-v2.1.0.rar

    《jQuery.uploadify:一款强大的图片上传插件》 在网页开发中,图片上传功能是必不可少的一部分,尤其是在社交媒体、电子商务和内容管理系统等领域。jQuery.uploadify是一款非常实用的jQuery插件,专为实现用户友好...

    jquery uploadify资源

    总结来说,jQuery Uploadify是一个功能强大、易于集成的文件上传插件,它的资源包括了JavaScript、CSS、Flash和图像文件,覆盖了从界面设计到实际上传的各个环节。理解并掌握这些资源的用途,将有助于开发者在项目中...

    jquery.uploadify.js 兼容IE9

    解决 jquery.uploadify.js 在ie9 下 二次打开失效问题等问题

    jquery 上传插件Uploadify-v3.0.0.zip

    jQuery Uploadify是一款广泛使用的文件上传插件,它极大地简化了在Web应用中实现多文件上传的功能。这个插件的主要版本是v3.0.0,它提供了丰富的自定义选项和良好的用户体验。在本文中,我们将深入探讨Uploadify的...

    Uploadify HTML5 版 / Jquery上传插件 全JS

    为了使用这个插件,你需要将这些文件包含到你的项目中,然后在页面中引用jQuery和Uploadify的JavaScript文件,最后按照插件文档配置选项并初始化插件。 总的来说,Uploadify HTML5版是一个强大的上传解决方案,它...

    jquery插件uploadify

    `jQuery Uploadify` 是一个基于 jQuery 的前端文件上传插件,它允许用户通过浏览器实现多文件选择、上传进度显示、上传失败重试等高级功能。这个插件在Web开发中非常流行,因为它提供了丰富的自定义选项和良好的用户...

    jquery文件上传插件 jquery.uploadify.js 不支持IE10现在经过修改

    在IT行业中,jQuery Uploadify.js是一款非常流行的前端文件上传插件,它允许用户通过异步方式上传文件到服务器,提供了一种友好的用户体验。然而,随着浏览器版本的更新,一些较旧的插件可能不再兼容新的浏览器,...

    上传控件jquery.uploadify-v2.1.4的示例源码

    这个插件极大地简化了前端开发人员的工作,使得在网页上实现批量上传变得更加容易。 `jQuery.uploadify`插件的核心特性包括: 1. **多文件上传**:用户可以一次性选择多个文件进行上传,提高了用户交互性和效率。 ...

    jquery.uploadifyv2.1.4

    Web上传文件是一个很常用的功能,试用过不少上传组件,要么是每次只能选择一个文件,要么是选择了文件后不能取消...总之仅仅是依靠JavaScript的实现不太好用,Flash+JavaScript的方式似乎对于这种上传需求满足得更好。

    jquery.uploadify-v2.1.4.zip

    jQuery Uploadify是基于jQuery的异步文件上传插件,它通过Flash技术实现了多文件同时上传的功能,提供了丰富的自定义选项和事件处理机制。该插件以其简洁的API和良好的用户体验,被广泛应用在各种Web项目中。 在...

    分享校jquery.uploadify-v2.1.0上传插件用法

    Uploadify是一款基于jQuery的文件上传插件,它通过Flash技术实现了多文件选择和异步上传的功能,极大地提升了用户体验。在v2.1.0版本中,Uploadify提供了一套完善的参数配置和事件处理机制,使得开发者可以根据需求...

    jquery.uploadify.js修复IE9 IE10浏览按钮点击无效的bug

    jQuery Uploadify.js 是一个非常流行的JavaScript插件,它为网站提供了优雅的多文件上传解决方案。这个插件使得文件上传变得更加简单,用户可以方便地选择并上传多个文件,同时提供进度条显示等交互效果。 然而,...

    jquery.uploadify-v2.0.2.rar

    《jQuery Uploadify插件详解与应用实践》 jQuery Uploadify是一款基于jQuery和Flash技术的文件上传组件,其在Web开发中被广泛应用于批量上传、大文件分片上传等场景。在jQuery.uploadify-v2.0.2这个版本中,我们...

    Asp.net 上传 Jquery.Uploadify 实例

    在本文中,我们将深入探讨如何在Asp.net环境中利用Jquery.Uploadify插件实现文件的批量上传功能。Asp.net是一种强大的Web应用程序框架,而Jquery.Uploadify是jQuery库的一个扩展,专门用于处理文件上传,它允许用户...

    HTML5 PHP jquery uploadify上传文件

    HTML5 PHP jquery uploadify上传文件,带进度条,author:吕大豹。仿照uploadify写的,www.codesc.net已做过修正,本例的配置参数均与uploadify官网一致,参照官网的api就可以了,直接把文件夹上传到支持php的服务器...

Global site tag (gtag.js) - Google Analytics