javascript - 使用cropper js将 Canvas 转换为blob

标签 javascript jquery html image canvas

我已经使用 cropper.js 创建了一个应用程序 用于裁剪图像。应用程序正在运行并且正在裁剪图像,之后我尝试将裁剪后的图像作为 blob 发送到服务器端进行存储,

根据 cropper.js 文档,我们可以使用 canvas.toDataURL 获取数据 URL,或使用 canvas.toBlob 获取 blob 并使用 FormData 将其上传到服务器。当我尝试 canvas.toDataURL() 时,我得到了 base64 字符串,但实际上我需要将文件作为 blob 发送,所以我尝试使用 canvas.toBlob() 但我我得到 Uncaught TypeError: canvas.toBlob is not a function 在 chrome 和 TypeError: Not enough arguments to HTMLCanvasElement.toBlob. 在 Firefox

谁能告诉我一些解决办法

我的代码是这样的

var canvas = $image.cropper("getCroppedCanvas", undefined);
var formData = new FormData();
formData.append('mainImage', $("#inputImage")[0].files[0]);
formData.append('croppedImage', canvas.toBlob());

最佳答案

toBlob 方法是异步的,需要两个参数,回调函数和图像类型(还有可选的第三个质量参数):

void canvas.toBlob(callback, type, encoderOptions);

示例

if (typeof canvas.toBlob !== "undefined") {
  canvas.toBlob(function(blob) {
      // send the blob to server etc.
      ...
  }, "image/jpeg", 0.75);
}
else if (typeof canvas.msToBlob !== "undefined") {
  var blob = canvas.msToBlob()
  // send blob
}
else {
  // manually convert Data-URI to Blob (if no polyfill)
}

并非所有浏览器都支持它(IE 需要前缀、msToBlob,并且它的工作方式与标准不同)并且 Chrome 需要 polyfill .

更新 ( to OP's edit, now removed ) 裁剪后的图片变大的主要原因是原图是JPEG,新的是PNG。您可以使用 toDataURL 更改此设置:

var uri = canvas.toDataURL("image/jpeg", 0.7);  // last=quality

在将其传递给 Blob 的手动数据 uri 之前。我建议使用 polyfill,就好像浏览器支持 toBlob() 一样,与编码 data-uri 相比,它会快很多倍并且使用更少的内存开销。

关于javascript - 使用cropper js将 Canvas 转换为blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29814895/

相关文章:

html - 水平对齐的图片随窗口大小调整大小

javascript - 如何使用当前的 Form API 将父组件的 FormGroup 传递给其子组件

javascript - 在隐藏的溢出中隐藏零件 View 文本

javascript - 使用 css 创建网页布局时遇到问题

php - 如何保护我的输入类型免受 firebug 和其他调试工具的影响

javascript - 在 jquery 的父级中间添加 html

html - 向上翻译该 div 时,如何去除该 div 下方的空白?

javascript - 模块化/对象化 JQuery

javascript - 如果要从中推送的数组未定义,则将字符串推送到数组

javascript - Modernizr 检查 css3d 转换和 flexbox 包括 ie10