jQuery+PHP实现上传裁剪图片

本文是一个简单的jquery图片预览+裁剪的例子,原理是在前端获取要裁剪的信息,如宽高比、裁剪坐标,上传图片之后在后端php进行切割

jquery代码(必须在最后面引入)

function showCutImg(showImg){
      var showImg = $(showImg);
      var changeInput = showImg.parents('.showImgDiv').siblings('.CutImage');
      var size = changeInput.siblings('.imgCoord').attr('ratio').split('*');
      var needWidth = size[0];
      var needHeight = size[1];
      var ratio = parseInt(needWidth)/parseInt(needHeight);
      ratio = parseFloat(ratio.toFixed(2));
      var thisFullDiv = showImg.parent();
      var coordArr = changeInput.siblings('.imgCoord').val().split(',');

      thisCutImgWidth = showImg.width();
      thisCutImgHeight = showImg.height()

      thisFullDiv.css('width',thisCutImgWidth);
      thisFullDiv.css('height',thisCutImgHeight);

      if((thisCutImgWidth/thisCutImgHeight)>=ratio){
        var thisCutDivHeight = thisCutImgHeight;
        var thisCutDivWidth = thisCutDivHeight*ratio;
      }else{
        var thisCutDivWidth = thisCutImgWidth;
        var thisCutDivHeight = thisCutDivWidth/ratio;
      }

      var hideWidth = (thisFullDiv.width()-thisCutDivWidth)/2;

      showImg.siblings('.hideImgLeft').width(hideWidth);
      showImg.siblings('.hideImgRight').width(hideWidth);

      var hideHeight = (thisFullDiv.height()-thisCutDivHeight)/2;

      showImg.siblings('.hideImgTop').width(thisCutDivWidth);
      showImg.siblings('.hideImgBottom').width(thisCutDivWidth);

      showImg.siblings('.hideImgTop').height(hideHeight);
      showImg.siblings('.hideImgBottom').height(hideHeight);

      if(hideWidth>0){
        var cutRatioX = thisCutImgWidth/hideWidth;
      }else{
        var cutRatioX = 0
      }

      if(hideHeight>0){
        var cutRatioY = thisCutImgHeight/hideHeight;
      }else{
        var cutRatioY = 0;
      }

      var coord = needWidth+'#'+needHeight+'#'+(cutRatioX)+'#'+(cutRatioY);

      if(coordArr!=''){
        coordArr.push(coord);
      }else{
        coordArr = [coord];
      }

      changeInput.siblings('.imgCoord').val(coordArr);
      $('.fullDiv').on('mousedown',function(e){
        var me = $(this);

        var changeInput = me.parent().siblings('.CutImage');

        var index = me.attr('index');

        var oldx = e.pageX;
        var oldy = e.pageY;

        var imgleft = me.children('.cutImg').position().left;
        var imgtop = me.children('.cutImg').position().top;

        var maxw = me.children('.hideImgLeft').width();
        var maxh = me.children('.hideImgTop').height();

        var goordArr = changeInput.siblings('.imgCoord').val().split(',');

        var cutDivSize = goordArr[index].split('#');

        $(document).mousemove(function(e){
          var newx = e.pageX;
          var newy = e.pageY;

          var movex = newx - oldx;
          var movey = newy - oldy;

          var x = movex + imgleft;
          var y = movey + imgtop;

          if(Math.abs(x)>maxw){
            if(x>0) x = maxw;
            if(x<0) x = -maxw;
          }

          if(Math.abs(y)>maxh){
            if(y>0) y = maxh;
            if(y<0) y = -maxh;
          }

          me.children('.cutImg').css('left',x+'px');
          me.children('.cutImg').css('top',y+'px');

          if(parseInt(maxw - x)>0){
            var cutRatioX = me.children('.cutImg').width()/parseInt(maxw - x);
          }else{
            var cutRatioX = 0;
          }

          if(parseInt(maxh - y)>0){
            var cutRatioY = me.children('.cutImg').height()/parseInt(maxh - y)
          }else{
            var cutRatioY = 0;
          }

          var cutImgPo = (cutRatioX) +'#'+ (cutRatioY);

          var coordVal = cutDivSize[0]+'#'+cutDivSize[1]+'#'+cutImgPo;

          goordArr[index] = coordVal;

          changeInput.siblings('.imgCoord').val(goordArr);

        });
      });

      $(document).on('mouseup',function(e){
        $(document).unbind('mousemove');
      });
    }

    $(".CutImage").change(function(){

      $(this).siblings('.imgCoord').val('');

      if($(this).prop('multiple')!=true){    //判断是否多文件上传
        var objUrl = getObjectURL1(this.files[0]) ;

        var showImgWidth = $(this).siblings('.showImgDiv').attr('showImgWidth');

        if(!showImgWidth)
        {
          showImgWidth = '150';
        }

        if (objUrl) {
            html = '';
            html += '<div style="border:1px solid #000;position:relative;z-index:2;overflow:hidden;cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;" index="0" class="fullDiv">';
            html += '<div style="position:absolute;background:#ccc;top:0;z-index:4;opacity:0.95;left:0;right:0;margin:auto;" class="hideImgTop"></div>';
            html += '<div style="position:absolute;background:#ccc;bottom:0;z-index:4;opacity:0.95;left:0;right:0;margin:auto;" class="hideImgBottom"></div>';
            html += '<div style="position:absolute;height:100%;background:#ccc;left:0;z-index:4;opacity:0.95;" class="hideImgLeft"></div><div style="position:absolute;z-index:3;left:0;right:0;top:0;bottom:0;margin:auto;" class="cutDiv"></div>';
            html += '<div style="position:absolute;height:100%;background:#ccc;right:0;z-index:4;opacity:0.95;" class="hideImgRight"></div>';
            html += '<img style="position:absolute;z-index:1;width:'+showImgWidth+'px" onload="showCutImg(this)" class="cutImg" class="imgshover" src="'+objUrl+'" alt="图片加载失败" />';
            html += '</div>';                    

            $(this).siblings('.showImgDiv').html(html);
        }

      }else{
        var objUrl = getObjectURL2($(this).get(0).files);
        if (objUrl) {

          var showImgWidth = $(this).siblings('.showImgDiv').attr('showImgWidth');

          if(!showImgWidth)
          {
            showImgWidth = '150';
          }

          var html = '';
          for(var i=0;i<objUrl.length;i++)
          {
            html += '<div style="margin-bottom:5px;border:1px solid #000;position:relative;z-index:2;overflow:hidden;cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;" index="'+i+'" class="fullDiv">';
            html += '<div style="position:absolute;background:#ccc;top:0;z-index:4;opacity:0.95;left:0;right:0;margin:auto;" class="hideImgTop"></div>';
            html += '<div style="position:absolute;background:#ccc;bottom:0;z-index:4;opacity:0.95;left:0;right:0;margin:auto;" class="hideImgBottom"></div>';
            html += '<div style="position:absolute;height:100%;background:#ccc;left:0;z-index:4;opacity:0.95;" class="hideImgLeft"></div><div style="position:absolute;z-index:3;left:0;right:0;top:0;bottom:0;margin:auto;" class="cutDiv"></div>';
            html += '<div style="position:absolute;height:100%;background:#ccc;right:0;z-index:4;opacity:0.95;" class="hideImgRight"></div>';
            html += '<img style="position:absolute;z-index:1;width:'+showImgWidth+'px" onload="showCutImg(this)" class="cutImg" class="imgshover" src="'+objUrl[i]+'" alt="图片加载失败" />';
            html += '</div>';                    //修改img标签的width样式可改变预览图大小

          }

          $(this).siblings('.showImgDiv').html(html);

        }

        //$('.fullDiv').css('float','left');
      }

    }) ;

    //建立一個可存取到該file的url
    function getObjectURL1(file) {
      var url = null ;
      if (window.createObjectURL!=undefined) { // basic
        url = window.createObjectURL(file) ;
      } else if (window.URL!=undefined) { // mozilla(firefox)
        url = window.URL.createObjectURL(file) ;
      } else if (window.webkitURL!=undefined) { // webkit or chrome
        url = window.webkitURL.createObjectURL(file) ;
      }
      return url ;
    }

    //建立一個可存取到該file的url
    function getObjectURL2(file) {
      var url = new Array();
      if (window.createObjectURL!=undefined) { // basic
        for(var i=0;i<file.length;i++)
        {
          url[i] = window.createObjectURL(file[i]) ;
        }
      } else if (window.URL!=undefined) { // mozilla(firefox)
        for(var i=0;i<file.length;i++)
        {
          url[i] = window.URL.createObjectURL(file[i]) ;
        }
      } else if (window.webkitURL!=undefined) { // webkit or chrome
        for(var i=0;i<file.length;i++)
        {
          url[i] = window.webkitURL.createObjectURL(file[i]) ;
        }
      }
      return url ;
    }

html代码(这些代码要放在同一级)

<!-- 文件上传标签,添加class属性CutImage -->
<input class="CutImage" type="file" name="img" />

<!-- 传送图片裁剪比例等参数,要添加class属性imgCoord,ratio为裁剪后要保存的宽高width*height -->
<input ratio="100*100" type="hidden" class="imgCoord" name="imgCoord">

<!-- 图片预览,要添加class属性showImgDiv,showImgWidth表示预览时的宽度 -->
<div showImgWidth="100" class="showImgDiv"></div>

php代码

/*图片上传代码略 下面直接进行图片裁剪*/

/**
 * [cut_img 图片裁剪函数]
 * Author: 程威明
 * @param array $imgs     图片路径数组
 * @param array $info     裁剪信息數組,包括裁剪后要保存的宽高、图片大小与裁剪开始坐标之比
 * @param bool $cover     是否覆盖原图,默认不覆盖
 * @return array        若覆盖原图返回裁剪数量,不覆盖返回图片路径组成的数组
 */
function cut_img($imgs=array(),$infoarr=null,$cover=false)
{
  if($infoarr==null) return $imgs;

  //判断是否为数组(必须是一个以图片路径组成的数组)
  $imgs = is_array($imgs)?$imgs:array($imgs);

  //把多个裁剪信息切成单个信息组成的数组
  $infoarr = explode(',', $infoarr);

  $save_file = array();

  $i=0;
  foreach($imgs as $file){

    //如果不覆盖原图,可重新定义图片保存路径
    if(false==$cover){
      $file = $file;
    }

    //把裁剪信息切割成数组,第一个为要保存的宽第二个为要保存的高,第三和第四个为图片宽高与裁剪起点的比例
    $info = explode('#', $infoarr[$i]);

    //裁剪宽高比
    $ratio = $info[0]/$info[1];

    //判断图片是否存在
    if(!file_exists($file)) continue;

    //获取图片信息
    $imgize = getimagesize($file);

    //图片宽度
    $width = $imgize[0];
    //图片高度
    $height = $imgize[1];

    //图片裁剪起点坐标
    $x = $info[2]==0?0:$imgize[0]/$info[2];
    $y = $info[3]==0?0:$imgize[1]/$info[3];

    //判断图片原宽高比与裁剪宽高比的大小
    if($width/$height>=$ratio){
      $width = $height*$ratio;//如大于即为裁剪宽度
    }else{
      $height = $width/$ratio;//如小于即为裁剪高度
    }

    //裁剪的寬高不能超出圖片大小
    if(($width+$x)>$imgize[0]){
      $width = $width-($width+$x-$imgize[0]);
    }

    if(($height+$y)>$imgize[1]){
      $height = $height-($height+$y-$imgize[1]);
    }

    //创建源图的实例
    $src = imagecreatefromstring(file_get_contents($file));

    //創建一個圖像
    $new_image = imagecreatetruecolor($info[0], $info[1]);

    //分配颜色
    $color = imagecolorallocate($new_image,255,255,255);
    //定义为透明色
    imagecolortransparent($new_image,$color);
    //填充图片
    imagefill($new_image,0,0,$color);

    //拷贝图片并保存成指定大小
    imagecopyresized($new_image, $src, 0, 0, $x, $y, $info[0], $info[1], $width, $height);

    //保存

    if(false==$cover){
      $file = rtrim(dirname($file),'/').'/c_'.basename($file);
      $save_file[] = $file;
    }

    imagejpeg($new_image,$file);

    imagedestroy($new_image);
    imagedestroy($src);

    $i++;
  }

  if(false==$cover){
    return $save_file;
  }else{
    return $i;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • jQuery实现图片上传和裁剪插件Croppie

    在很多应用需要上传本地图片然后再按尺寸适当裁剪以符合网站对图片尺寸的要求.最常见的就是各用户系统要求用户上传和裁剪头像的应用.今天我给大家介绍的是一款基于HTML5和jQuery的图片上传和裁剪插件,它叫Croppie. 运行效果图: HTML 首先我们将相关js和css文件载入head中. <script src="jquery.min.js"></script> <script src="croppie.min.js"><

  • jquery.Jcrop结合JAVA后台实现图片裁剪上传实例

    本文介绍了头像裁剪上传功能,用到的技术有  jQuery,springmvc,裁剪插件用的是jcrop(中间遇到很多坑,最终跨越). 图片上传步骤: 1.用户选择图片 2.将图片传入后台:用户选择图片的时候选择的是各种各样的,但是我们的网页显示图片大小是有限的,所以我们就要在用户选择图片之后将图片添加到后台进行压缩,压缩成我们想要的大小,之后再显示到页面才好 3.利用jcrop裁剪工具对图片进行裁剪并且实时预览 4.点击确定按钮将裁剪用到的参数传入后台,后台图片进行剪切,之后缩放成我们需要的格式

  • jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享

    网页端 裁剪图片,不需要经过服务器. 这个是用 https://github.com/mailru/FileAPI 框架实现的.配合jcrop. 高级浏览器 使用 canvas 裁剪,ie6 7 8使用 flash过度. 核心代码: var el = $('input').get(0); seajs.use(['gallery/jcrop/0.9.12/jcrop.css','gallery/jcrop/0.9.12/jcrop.js'] ,function(){ FileAPI.event.o

  • struts2+jsp+jquery+Jcrop实现图片裁剪并上传实例

    今天有业务需要制作用户头像的需求,在网上找了个可以裁剪大图制作自己希望大小的图片的方法(基于Struts2).特此记录一下. 不废话,具体的步骤如下: <1> 使用html标签上传需要裁剪的大图. <2> 在页面呈现大图,使用Jcrop(Jquery)对大图进行裁剪,并且可以进行预览. <3> 选择好截取部分之后发送数据给Action,在服务器端使用 Java API 对大图进行裁剪. <4> 保存大图裁剪好的头像到指定目录,完成业务. 下面一步一步做: 第

  • 利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)

    这个应用的关键: 1.让左边选择区域和右边显示的图像信息保持一至. 2.根据左边选择区域的大小,来让右边有一个对局部放大或缩小的效果.  3.后台上传功能. 那么这一次,只谈[放大]或[缩小].[位置]和[上传]问题,下次,我再写下(因为那个插件代码太多,我也没看完,正在学习研究当中). ["区域":是宽*高,也就是面积:] ["放大或缩小":是一个比例值,通常我们说放大或缩小,都说放大或缩小百分之多少,或者说放大或缩小多少倍数] 一.怎么能放大或者缩小图片的局部?

  • jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一

    上一节随笔中,我们已经知道了关于jQuery插件ImgAreaSelect基本的知识:那么现在看一下实例: 首先,要知道我们应该实现什么功能? (1)图片能够实现上传预览功能 (2)拖拽裁剪图片,使其能够显示裁剪后的区域 (3)显示要裁剪区域的坐标 其次,该如何引用该插件呢? 那就具体看一下吧! 第一步:先将样式和文件包引入(根据你自己的位置引入) <!--引入imgareaselect的css样式--> <link rel="stylesheet" type=&qu

  • 利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)

    <body> <div class="container demo"> <div class="big"> <p class="instructions">大图预览</p> <div class="bigframe"> <img width="300" height="300" src="images

  • jQuery+PHP实现上传裁剪图片

    本文是一个简单的jquery图片预览+裁剪的例子,原理是在前端获取要裁剪的信息,如宽高比.裁剪坐标,上传图片之后在后端php进行切割 jquery代码(必须在最后面引入) function showCutImg(showImg){ var showImg = $(showImg); var changeInput = showImg.parents('.showImgDiv').siblings('.CutImage'); var size = changeInput.siblings('.im

  • 利用imgareaselect辅助后台实现图片上传裁剪

    因为项目当中用到图片裁剪,本来可以不用到后台进行裁剪的,但是要兼容万恶的IE浏览器,所以不得不使用后台进行裁剪. 这次使用到imgareaselect插件获取需要裁剪区域的坐标,再由后台进行裁剪操作.先上个效果图再说 但是这里有一个坑就是上传的图片过大,可能会造成裁剪的区域跟插件中显示的不一样,所以得现在后台对云图片进行压缩在裁剪. /** * 等比例压缩算法: * 算法思想:根据压缩基数和压缩比来压缩原图,生产一张图片效果最接近原图的缩略图 * @param srcURL 原图地址 * @pa

  • jquery.uploadifive插件怎么解决上传限制图片或文件大小问题

    jQuery.uploadifive插件可以很好的解决上传限制图片或文件大小问题,具体方法如下所示: 插件是可以用  但遇到问题如何提示是否超过限制呢 没办法研究插件js   发现网上给的提示这个插件里竟然没有没有没有.... 好吧  我就把onError拿出来看返回值 呵呵了 对了 使用该插件要引用 <script src="js/jquery-1.11.0.min.js"></script> <script src="../bootstrap

  • PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例

    本文实例讲述了PHP结合jquery ajax实现上传多张图片,并限制图片大小操作.分享给大家供大家参考,具体如下: php用jquery-ajax上传多张图片限制图片大小 /** * 上传图片,默认大小限制为3M * @param String $fileInputName * @param number $size */ public function processUpload($fileInputName,$size=3145728) { $result = array('status'

  • jQuery简单验证上传文件大小及类型的方法

    本文实例讲述了jQuery简单验证上传文件大小及类型的方法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="jquery1.8/jquery-1.8.0.js" type="

  • ajax图片上传,图片异步上传,更新实例

    最近在研究ajax图片上传,图片异步上传,更新,留作参考. 直接上源码吧: js源码: /// <reference path="jquery-1.8.3.js" /> /// <reference path="ajaxForm/jquery.form.js" /> /*! * jQuery upload * 用于上传单个文件,上传成功后,返回文件路径. * 本插件依赖jQuery,jquery.form 请在使用时引入依赖的文件 * * D

  • jsp fckeditor 上传中文图片乱码问题的解决方法

    经过我修改ConnectorServlet.java和SimpleUploaderServlet.java两个文件,重新生成fckeditor-java-2.3.jar包,要解决所有的乱码问题,有3部要修改1.修改Web容器的字符编码,如果Web容器用的是Tomcat,则修改conf/server.xml文件,在两个Connector中添加"URIEncoding="utf-8"",我这里用的是utf-8编码,所以修改成utf-8,若项目是gb2312编码,则设置为

  • PHP在Windows IIS上传的图片无法访问的解决方法

    PHP在Windows IIS上传的图片无法访问的解决方法 首先登录到网站后台进行了测试发现上传的图片在确实浏览器打不开且出现了无法访问的错误信息:" 401 - 未 授权: 由于凭据无效,访问被拒绝." 然后又测试了该服务器上其他几个php项目发现也出现了一样的错误: 图片上传成功,但浏览器没有权限访问. 因为测试的几个php系统是不一样的,有thinkphp,wordpress,百度ueditor编辑器. 所以这几个系统同时出现问题的概率实在是太小了,所以基本上排除了程序的bug,

随机推荐