【发布时间】:2016-05-29 13:56:51
【问题描述】:
我想将图像数据上传到服务器上的 php 脚本。我有一个图像源的 URL(PNG,图像可能位于不同的服务器上)。我将其加载到 Javascript 图像中,将其绘制到画布中并使用 canvas.toBlob() 方法(或主要不支持的 polyfill)生成包含图像数据的 blob。这很好用,但我认识到生成的 blob 大小比原始图像数据大得多。 相反,如果我使用 HTML 文件输入并让用户在客户端选择图像,则生成的 blob 与原始图像具有相同的大小。我可以从画布中获取与原始图像大小相同的图像数据吗?
我猜原因是我在使用 canvas.toBlob() polyfill 时丢失了 PNG(或任何图像压缩):
value: function (callback, type, quality) {
var binStr = atob(this.toDataURL(type, quality).split(',')[1]),
len = binStr.length,
arr = new Uint8Array(len);
for (var i=0; i<len; i++ ) {
arr[i] = binStr.charCodeAt(i);
}
callback(new Blob([arr], {type: type || 'image/png'}));
}
我对通过图像、画布、blob 进行如此多的转换步骤感到困惑 - 所以也许有一种替代方法可以从给定的 URL 获取图像数据,最后将其附加到 FormData 以将其发送到服务器?
【问题讨论】:
-
服务器是否在操作图像数据?如果您只想将图像以 blob 格式存储,请在数据库中指定一个 blob 类型列并插入客户端提交的
context.toDataURL。 -
根据我的经验,当您将字节从图像转换为 blob/dataUrl 时,对象的大小会增加大约 30%
-
是的,还有其他事情发生
-
@Kaiido。当然,OP 的 blob-to-img 比率超出了图表 - 那里有问题。但是 blob 仍然会比 png 大。如果在修复“oops”后传输大小/时间仍然很重要,那么他们可以发送经过质量修改的 jpeg 并在服务器上提取 imageData。
-
但实际上我不明白为什么 OP 不简单地下载图像服务器端而只是将 URL 作为字符串发送......