使用坐标裁剪图像

14

我正在尝试裁剪图像并将裁剪后的数据发送到服务器端。我正在使用imgareaselect插件。我获取所选区域的坐标,但无法裁剪图像。互联网上提供的所有解决方案都是使用css预览裁剪后的图像。但是我如何获取裁剪后的数据呢?无需预览裁剪后的图像。我的代码如下:

cropw = $('#cropimg').imgAreaSelect({
             maxWidth: 300, maxHeight: 300,
            aspectRatio: '1:1',
            instance: true,
            handles: true,
            onSelectEnd: function (img, selection) {                
            x1 = selection.x1;
            y1 = selection.y1;
            x2 = selection.x2;
            y2 = selection.y2;
    }
});

我曾经遇到过同样的问题,我使用了 Cropper.js,它很容易使用并且有很好的文档。https://github.com/fengyuanchen/cropper. 然后请参考这个链接上传图片 - https://dev59.com/eVsW5IYBdhLWcg3wXmO5 - Siddhartha Chowdhury
他们的回调看起来一样。如果您已经实现了这个,请提供给我代码。在这里,我得到了base64图像字符串。 - Shahbaz Hashmi
你可以使用我的插件 https://github.com/akshaygoyal88/jquery-img-cropper 来实现这个功能。它会将图片设置为背景,然后您可以设置所需的高度和宽度。 - akshay
3个回答

37

嘿@ Shahbaz,我正在尝试使用cropper.js为您提供解决方案。

这是您可以做的

从这里下载cropper.js

//link the  js files
<head>
  <script src="jquery.js"></script> // optional
  <link  href="cropper.min.css" rel="stylesheet">
  <script src="cropper.min.js"></script>
</head>

正文

<input type="file" name="image" id="image" onchange="readURL(this);"/>
<div class="image_container">
    <img id="blah" src="#" alt="your image" />
</div>
<div id="cropped_result"></div>        // Cropped image to display (only if u want)
<button id="crop_button">Crop</button> // Will trigger crop event

Javascript

->

Javascript

<script type="text/javascript" defer>
    function readURL(input) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
                $('#blah').attr('src', e.target.result)
            };
            reader.readAsDataURL(input.files[0]);
            setTimeout(initCropper, 1000);
        }
    }
    function initCropper(){
        var image = document.getElementById('blah');
        var cropper = new Cropper(image, {
          aspectRatio: 1 / 1,
          crop: function(e) {
            console.log(e.detail.x);
            console.log(e.detail.y);
          }
        });

        // On crop button clicked
        document.getElementById('crop_button').addEventListener('click', function(){
            var imgurl =  cropper.getCroppedCanvas().toDataURL();
            var img = document.createElement("img");
            img.src = imgurl;
            document.getElementById("cropped_result").appendChild(img);

            /* ---------------- SEND IMAGE TO THE SERVER-------------------------

                cropper.getCroppedCanvas().toBlob(function (blob) {
                      var formData = new FormData();
                      formData.append('croppedImage', blob);
                      // Use `jQuery.ajax` method
                      $.ajax('/path/to/upload', {
                        method: "POST",
                        data: formData,
                        processData: false,
                        contentType: false,
                        success: function () {
                          console.log('Upload success');
                        },
                        error: function () {
                          console.log('Upload error');
                        }
                      });
                });
            ----------------------------------------------------*/
        })
    }
</script>

希望这能有所帮助。谢谢。


谢谢@Siddhartha,它正在工作。我已经点赞你的答案了。但是我仍然想知道如何使用坐标剪裁图像。因为我已经尝试了许多方法。 - Shahbaz Hashmi
@siddhartha,你的演示非常完美,我一直在使用v3,但是您的版本是0.8,所以我降级后它运行得非常完美,您能帮我解决v3的问题吗? - Akshay Shrivastav
我想裁剪成420*100,如何设置? - Akshay Shrivastav
“settimeout” 的用途是什么?它对我来说有点神奇。这是因为我们需要等待某些操作完成吗?如果是的话,我们不能挂钩到相应的事件来完成吗? - allan.simon
请注意:截至2019年,toBlob方法在Microsoft Edge浏览器中默认情况下无法正常工作。您需要使用polyfill:https://dev59.com/questions/iVYN5IYBdhLWcg3wZ3hm - Max

2

根据被接受的答案,我添加了这个。如果有人正在使用cropper的jquery包装器,则需要注意。

let ICropper = (function($) {
  let $cropperCanvasImage = $('#cropper-canvas-image');
  return {
    readUrl,
    cropImage
  }


  function readUrl(input) {
    if (input.files && input.files[0]) {
      let reader = new FileReader();
      reader.onload = function(e) {
        $cropperCanvasImage.attr('src', e.target.result)
      };
      reader.readAsDataURL(input.files[0]);
      setTimeout(initCropper, 1000);
    }
  }

  function initCropper() {
    $cropperCanvasImage.cropper({
      aspectRatio: 1 / 1
    });
  }

  function cropImage() {
    let imgUrl = $cropperCanvasImage.data('cropper').getCroppedCanvas().toDataURL();
    let img = document.createElement("img");
    img.src = imgUrl;
    $("#cropped-result").append(img);
  }
})(jQuery)
<script src="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.4.1/cropper.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script name="jquery-croper-script">
!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(require("jquery"),require("cropperjs")):"function"==typeof define&&define.amd?define(["jquery","cropperjs"],r):r(e.jQuery,e.Cropper)}(this,function(c,s){"use strict";if(c=c&&c.hasOwnProperty("default")?c.default:c,s=s&&s.hasOwnProperty("default")?s.default:s,c.fn){var e=c.fn.cropper,d="cropper";c.fn.cropper=function(p){for(var e=arguments.length,a=Array(1<e?e-1:0),r=1;r<e;r++)a[r-1]=arguments[r];var u=void 0;return this.each(function(e,r){var t=c(r),n="destroy"===p,o=t.data(d);if(!o){if(n)return;var f=c.extend({},t.data(),c.isPlainObject(p)&&p);o=new s(r,f),t.data(d,o)}if("string"==typeof p){var i=o[p];c.isFunction(i)&&((u=i.apply(o,a))===o&&(u=void 0),n&&t.removeData(d))}}),void 0!==u?u:this},c.fn.cropper.Constructor=s,c.fn.cropper.setDefaults=s.setDefaults,c.fn.cropper.noConflict=function(){return c.fn.cropper=e,this}}});
</script>

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.4.1/cropper.min.css" />


<input type="file" name="source-image" id="sourceImage" onchange="ICropper.readUrl(this);" />
<div class="image-container">
  <img id="cropper-canvas-image" src="#" alt="your image" />
</div>
<div id="cropped-result"></div>
<button onclick="ICropper.cropImage(this)">Crop</button>


0

你尝试过使用Jquery的裁剪插件吗,比如:

https://fengyuanchen.github.io/cropper/

你需要在页面中导入脚本:

    <?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
    $targ_w = $targ_h = 150;
    $jpeg_quality = 90;

    $src = 'demo_files/pool.jpg';
    $img_r = imagecreatefromjpeg($src);
    $dst_r = ImageCreateTrueColor( $targ_w, $targ_h );

    imagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'],
    $targ_w,$targ_h,$_POST['w'],$_POST['h']);

    header('Content-type: image/jpeg');
    imagejpeg($dst_r,null,$jpeg_quality);

    exit;
}


?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>

        <script src="http://deepliquid.com/Jcrop/js/jquery.Jcrop.min.js"></script>
        <script src="../js/jquery.Jcrop.js"></script>
        <link rel="stylesheet" href="../css/jquery.Jcrop.css" type="text/css" />
        <link rel="stylesheet" href="demo_files/demos.css" type="text/css" />

        <script language="Javascript">

            $(function(){

                $('#cropbox').Jcrop({
                    aspectRatio: 1,
                    onSelect: updateCoords
                });

            });

            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('Selecione a área para recorte.');
                return false;
            };

        </script>

    </head>

    <body>

    <div id="outer">
    <div class="jcExample">
    <div class="article">

        <h1>Crop jQuery</h1>


        <img src="demo_files/pool.jpg" id="cropbox" />


        <form action="crop.php" method="post" onsubmit="return checkCoords();">
            <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" />
        </form>

    </div>
    </div>
    </div>
    </body>

</html>

你的 updateCoords 函数是用于获取坐标的。我正在寻找裁剪后的数据。 - Shahbaz Hashmi
我可以从哪里获取数据?你定义的函数是否有返回值? - Shahbaz Hashmi
你说得对,让我们放完整的核心代码。我用PHP举了个例子,就像文档中一样,但可以用于任何语言。希望这对你有用。 - Sergio Lopes
Sergio@ 我的问题是如何获取裁剪后的数据并发送到服务器,而不是在服务器端进行裁剪。假设我只想使用小图像(例如300 x 300)作为个人资料照片,那么将整个图像发送到服务器是否是一个好的方法? - Shahbaz Hashmi
但是您不能将图像发送到裁剪并在返回发送到服务器进行存储吗? - Sergio Lopes
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接