将 ImageData 对象(不是画布)转换为图像 dataURL

Posted

技术标签:

【中文标题】将 ImageData 对象(不是画布)转换为图像 dataURL【英文标题】:Convert an ImageData object (not a canvas) to image dataURL 【发布时间】:2016-05-28 16:58:12 【问题描述】:

我想从 ImageData 对象(即宽度、高度、数据)创建一个 dataURL。我意识到画布有这个,但我想避免画布使用的扭曲(主要是 alpha 预乘)......即我想避免明显的 canvas.putImageData 步骤。

从this post 我可以将任何arraybuffer/typedarray/dataview 变成base64。我知道的是 canvas dataurl 如何将宽度/高度添加到 base64 字符串的 Uint8 数据部分。我也不知道 png 转换是如何完成的。 (我可以使用原始数据图像类型,但我认为没有......只有 png 和 jpg)

可能的方法:

使用 putImageData 将 ImageData 加载到 Canvas。失败,扭曲数据。 使用 img.src = base64 数据创建图像。失败,必须是 canvas dataurl。 其他?

有谁知道如何从原始宽度、高度、数据Imagedata构造一个图像dataURL?

【问题讨论】:

【参考方案1】:

在不使用Canvas 的情况下,将ImageData 对象转换为data URL 理论上是可行的,但并不实际。

ImageData 对象具有图像像素的原始 RGBA 表示。 data URL 期望数据采用可识别的 MIME 格式。根据MDN 的说法,唯一广泛支持的基于像素的图像类型是 GIF、JPEG、PNG 和 ICO。 GIF 和 JPEG 相当复杂,所有这些格式都有头信息,而 PNG 有 CRC,因此将像素数据转换为图像格式并非易事。

推荐的转换方法是使用Canvas。您说您的尝试“扭曲”了数据,但这表明您的操作方式存在问题,因为这确实是最受支持的方法,因为它建立在浏览器用来进行所有图像处理的内部结构之上。

您是否检查了您的context 设置?如果您使用的是 alpha,您可能需要 ctx.globalCompositeOperation = "copy" 而不是默认的 "source-over"

【讨论】:

谢谢。我需要做这个操作服务器端。我目前使用package canvas,但我想知道是否有更好的方法。 主要失真来自非 255 alpha 值的 alpha 预乘。其次,任何基于浏览器的方法都可以进行“颜色配置文件”调整。从那以后,我发现了一种相当简单的 webgl 方法,其中涉及使用帧缓冲区。我应该总结一下! BMP 不是将 Uint8ClampedArray 数据转换成更直接的格式吗?所有主流浏览器都支持它。

以上是关于将 ImageData 对象(不是画布)转换为图像 dataURL的主要内容,如果未能解决你的问题,请参考以下文章

gl.texImage2D适用于Image,但不适用于ImageData

上传前调整图像大小 - 将画布转换为文件对象

将fabricjs画布转换为base64图像

如何检测对象是不是位于画布元素上的坐标处?

将图像控件转换为字节数组 Asp.Net

如何将画布内容转换为图像?