输入文件在 JCrop 中显示实时选择的图像

Posted

技术标签:

【中文标题】输入文件在 JCrop 中显示实时选择的图像【英文标题】:Input file show live selected image in JCrop 【发布时间】:2013-10-01 14:58:51 【问题描述】:

我正在使用 JCrop 来调整和裁剪图像。

我想添加一个功能,以便用户可以:

-选择一个图像文件

-使用jcrop进行编辑

-上传 无需更改页面

我可以单独做所有这些,但是当我混合这些时会出现错误。

            $('#target').attr('src', e.target.result);
            $('#target2').attr('src', e.target.result);

现在的问题是,当我更改 id "target" 主图像的 src 位置时,它不会显示我的新图像。但是当我在 id "target2" 预览图像上执行此操作时,它会显示我的新图像并且我可以对其进行处理。(但是当我按下裁剪时不会裁剪新图像)

    <script src="jquery.min.js"></script>
<script src="jquery.Jcrop.js"></script>
<script>
function dudecmon()
  jQuery(function($)

    // Create variables (in this scope) to hold the API and image size
    var jcrop_api,
        boundx,
        boundy,

        // Grab some information about the preview pane
        $preview = $('#preview-pane'),
        $pcnt = $('#preview-pane .preview-container'),
        $pimg = $('#preview-pane .preview-container img'),

        xsize = $pcnt.width(),
        ysize = $pcnt.height();

    console.log('init',[xsize,ysize]);
    $('#target').Jcrop(
      onChange: updatePreview,
      onSelect: updatePreview,
      onSelect: updateCoords,
      aspectRatio: xsize / ysize
    ,function()
      // Use the API to get the real image size
      var bounds = this.getBounds();
      boundx = bounds[0];
      boundy = bounds[1];
      // Store the API in the jcrop_api variable
      jcrop_api = this;

      // Move the preview into the jcrop container for css positioning
      $preview.appendTo(jcrop_api.ui.holder);
    );

    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'
        );
      
    ;

  );
;
</script>

<script>

  function updateCoords(c)
  
    $('#x').val(c.x);
    $('#y').val(c.y);
    $('#w').val(c.w);
    $('#h').val(c.h);
  ;

  function checkCoords()
  
    if (parseInt($('#w').val())) return true;
    alert('Please select a crop region then press submit.');
    return false;
  ;

</script>

<script>
function readURL(input) 
        if (input.files && input.files[0]) 
            var reader = new FileReader();

            reader.onload = function (e) 
                //jcrop_api.setImage(e.target.result);
                $('#target').attr('src', e.target.result);
                $('#target2').attr('src', e.target.result);
            ;
            reader.readAsDataURL(input.files[0]);
            dudecmon();
        
    

</script>



<link rel="stylesheet" href="jquery.Jcrop.css" type="text/css" />
<style type="text/css">

/* Apply these styles only when #preview-pane has
   been placed within the Jcrop widget */
.jcrop-holder #preview-pane 
  display: block;
  position: absolute;
  z-index: 2000;
  top: 10px;
  right: -280px;
  padding: 6px;
  border: 1px rgba(0,0,0,.4) solid;
  background-color: white;

  -webkit-border-radius: 6px;
  -moz-border-radius: 6px;
  border-radius: 6px;

  -webkit-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
  -moz-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);
  box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2);


/* The javascript code will set the aspect ratio of the crop
   area based on the size of the thumbnail preview,
   specified here */
#preview-pane .preview-container 
  width: 250px;
  height: 175px;
  overflow: hidden;

</style>


<img src="sago.jpg" id="target"  />

<div id="preview-pane">
    <div class="preview-container">
      <img src="sago.jpg" id="target2" class="jcrop-preview"  />
    </div>
</div>

<form action="image.php" enctype="multipart/form-data" method="post" onsubmit="return checkCoords();">
    <input type="file" name="file" name="imageinput" size="30" onchange="readURL(this);" />
    <input type="hidden" id="x" name="x" />
    <input type="hidden" id="y" name="y" />
    <input type="hidden" id="w" name="w" />
    <input type="hidden" id="h" name="h" />
    <input type="submit" value="Crop Image" class="btn btn-large btn-inverse" />
</form>

【问题讨论】:

你能把你的链接显示在你使用该功能的地方吗 deepliquid.com/content/Jcrop.html 不知道你问了什么,但这里是 api? 【参考方案1】:

你可以使用:

 jcrop_api.setImage('/crop/demo_files/'+$("#btn_change").val());

换图片的缺点是这样,不能正确预览图片。

<script type="text/javascript">
  jQuery(function($)
    var jcrop_api;
      $('#btn_change').change(function()
         $("#fielname").val($("#btn_change").val());
          jcrop_api.setImage('/crop/demo_files/'+$("#btn_change").val());

      )

     $('#croppic').click(function()

      if(checkCoords())
       var data =   x: $('#x').val(), y: $('#y').val(),w: $('#w').val(), h: $('#h').val(),fielname:$("#fielname").val() ;

        $.post("http://localhost/crop/index.php/welcome/croppic",data,
        function(backdata)
          if(backdata=="success")
                jcrop_api.release();
                $('#cropmessage').html("<font color=red>thumb pic made please select another one</font>").delay(1000).fadeOut();;
            
            else
            
                $('#cropmessage').html("<font color=black>error in process </font>");
            
        );
        

      );
      // Create variables (in this scope) to hold the API and image size
    var jcrop_api,
        boundx,
        boundy;

    $('#target').Jcrop(
      onSelect: updateCoords,
      aspectRatio: xsize / ysize
    ,function()
      // Use the API to get the real image size
      var bounds = this.getBounds();
      boundx = bounds[0];
      boundy = bounds[1];
      // Store the API in the jcrop_api variable
      jcrop_api = this;


    );


   function updateCoords(c)
  
    $('#x').val(c.x);
    $('#y').val(c.y);
    $('#w').val(c.w);
    $('#h').val(c.h);
  ;


    function checkCoords()
    
        if (parseInt($('#w').val())) return true;
        alert('Please select a crop region then press submit.');
        return false;
    ;



  );

</script>

【讨论】:

以上是关于输入文件在 JCrop 中显示实时选择的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在临时图像上使用 jCrop?

使用 jcrop 裁剪带有预览的图像

JCrop 在我的 JavaScript 代码中不起作用

裁剪刚刚添加了一张图片

Jcrop 图像在预览中无法正确显示

Jcrop on video - 视频仅在裁剪选择中显示