【问题标题】:html5 canvas.toDataURL output size bigger than original image sizehtml5 canvas.toDataURL 输出大小大于原始图像大小
【发布时间】:2016-12-13 20:10:49
【问题描述】:

我只是尝试在使用画布上传之前在 javascript 中调整图像大小。我按照这里的说明进行操作:https://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/

当我将图像缩放为 1 时,即按照原始宽度和高度,图像的输出大小几乎是原始图像大小的两倍。在此之前,当我使用 FileReader 读取DataAsURL 时,输出字符串长度大于图像大小。如何正确使用html canvas和FileReader?

谢谢。

【问题讨论】:

  • FileReader 会将数据转换为图像中原始数据的 base 64 编码等效项。 Base 64 编码数据通常需要更长的字符串来表示相同的数据,因为它最多只有 64 种不同类型的符号来表示通常由 255 个不同符号表示的相同数据。
  • 嗨@vbguyny。谢谢您的回复。我明白了,除了 toDataURL,还有其他选项可以从画布导出吗?我想在上传前尽量缩小尺寸。

标签: javascript html canvas html5-canvas


【解决方案1】:

您可以考虑改用 Blob。浏览器中的 Data-URI 使用 Base-64 编码,大小增加了 33%,并且 data-uri 标头的形式有所改变。

要改用 blob,您需要记住代码是异步的。此外,由于从浏览器导出的图像始终为 RGBA 格式,因此无法保证生成的图像小于原始图像,而原始 PNG 源图像可以索引,灰度,仅 RGB,有更好的压缩等等。

对于 FileReader,您可以直接将 File 对象与 createObjectURL() 一起使用,而无需使用 FileReaderFile 对象基本上是一个 Blob 带有一些扩展信息,例如文件名等。

读取 Blob/File wo/FileReader 的示例

这假设输入字段使用下面的changeHandler 来处理事件(并且此示例仅处理单个文件):

function changeHandler() {
  var img = new Image();
  img.onload = drawImageToCanvas;
  img.src = (URL || webkitURL).createObjectURL(this.files[0]);
}

function drawImageToCanvas() {
  // modify canvas size here if needed
  ctx.drawImage(this, 0, 0);  // draw image to canvas
  // since we're async., continue from here (or use promises)
}

示例 Blob 导出 (toBlob)

使用 blob 导出:

canvas.toBlob(function(blob) {
  // blob now contains the PNG file
  // This code is called asynchronous, so continue from here.
}, "image/png");

您现在可以上传比 Data-URL 更小的 Blob。

某些浏览器可能需要toBlob()polyfill(或者只是进行功能检测并在这些浏览器中使用toDataURL() 作为后备)。

【讨论】:

  • 嗨@K3N。谢谢您的回复。我认为 blob 是我问题的答案。
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
相关资源
最近更新 更多