在客户端裁剪和上传图像而不涉及服务器端代码

时间:2013-07-01 11:04:13

标签: javascript client-side crop parse-platform

正如标题所说。要求是能够在将裁剪后的图像上传到服务器之前裁剪图像。所有工作都应该在客户端完成。 我听说过在服务器上裁剪图像并完全保存的方法。

但是我使用Parse.com服务。服务器端不支持图像处理,因此我需要在本地处理它并将完成的图像直接上传到Parse.com服务。

示例代码非常有用。 感谢。

3 个答案:

答案 0 :(得分:10)

我使用的解决方案:

首先,我使用第三方javascript库来选择像jCrop这样的裁剪区域。 一旦我得到坐标(x1,x2,y1,y2),我就会将一个图像副本绘制到画布上。

          var canvas = document.getElementById('drawcanvas'); 
          var context = canvas.getContext('2d');
          canvas.width = canvas.width; // clear canvas
          var imageObj = new Image();
          imageObj.onload = function() {
            // draw cropped image
            // ...

            context.drawImage(imageObj, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, sourceWidth, sourceHeight);

            var dataURL = canvas.toDataURL();
          };
          imageObj.src = // image url

在绘制画布后,我将画布转换为基本64格式的DataURL。 一旦我有了DataURL,我就可以使用这个从互联网上找到的函数,它将DataURL转换为原始二进制数据。

DataURLConverter: function(data) {
        // convert base64 to raw binary data held in a string
        // doesn't handle URLEncoded DataURIs
        var byteString = atob(data.split(',')[1]);

        // separate out the mime component
        var mimeString = data.split(',')[0].split(':')[1].split(';')[0]

        // write the bytes of the string to an ArrayBuffer
        var ab = new ArrayBuffer(byteString.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < byteString.length; i++) {
            ia[i] = byteString.charCodeAt(i);
        }
            return ia;
}

当我们获得二进制数据时,我们会将其直接上传到Parse.com。 上传以使用'ia'作为数据进行解析

 var serverUrl = 'https://api.parse.com/1/files/' + fileName;
      $.ajax({
        type: "POST",
        beforeSend: function(request) {
          request.setRequestHeader("X-Parse-Application-Id", "App id");
          request.setRequestHeader("X-Parse-REST-API-Key", "API Key");
          request.setRequestHeader("Content-Type", "File type");
        },
        url: serverUrl,
        data: ia,
        processData: false,
        contentType: false,
        success: function(data) {

        },
        error: function(data) {

        }
      });

答案 1 :(得分:3)

好的,我终于成功了!搜索了一整天!!即使现在解析建议服务器端裁剪,客户端调整大小仍然很有趣。

检查一下: HTML5 Pre-resize images before uploading

Justin Levene的修正效果非常好! 但要与Parse.com合作,您需要使用

new Parse.File(name, {base64: somebase64string});

这些代码适用于我(例如,我上传了一张2M照片,重新调整大小的照片就像150k):

var dataurl = canvas.toDataURL("image/jpeg");

            var name = "image.jpg";
            var parseFile = new Parse.File(name, {base64: dataurl.substring(23)});

            parseFile.save().then(function() { ....

“23”是真正的base64字符串之前的所有字母。 dataurl的结果是“data:image / jpeg; base64,/ 9j / 4AAQSkZJRgABAQAAAQABAAD / 2 ......”,我们只需要以“/ 9j /”开头的部分

祝你好运!

答案 2 :(得分:1)

这可能是一个老帖子但是如果你找到了这个答案(比如我),你可能想知道Parse现在可以裁剪服务器端的图像。

有关最新代码,请参阅他们的文档:https://www.parse.com/docs/cloud_modules_guide#images

Parse Image Object(来自Parse文档):

var Image = require("parse-image");

Parse.Cloud.httpRequest({
  url: object.get("profilePhoto").url(),
  success: function(response) {
    // The file contents are in response.buffer.
    var image = new Image();
    return image.setData(response.buffer, {
      success: function() {
        console.log("Image is " + image.width() + "x" + image.height() + ".");
      },
      error: function(error) {
        // The image data was invalid.
      }
    })
  },
  error: function(error) {
    // The networking request failed.
  }
});

裁剪图像(来自Parse文档):

// Crop the image to the rectangle from (10, 10) to (30, 20).
image.crop({
  left: 10,
  top: 10,
  right: 30,
  bottom: 20,
  success: function(image) {
    // The image was cropped.
  },
  error: function(error) {
    // The image could not be cropped.
  }
});

您还可以缩放,更改图像格式和创建缩略图。