我操纵图像的RGBA值并使用toDataUrl保存它,如下所示:
image.src = ctx.toDataURL("image/png");
现在我想读出这个保存图像的RGBA值。它应该具有相同的RGBA值,但事实上 一些值被改变,即:从RGB(0,0,1)到RGB(0,0,0)。这似乎不是一个大问题 但是我需要完全相同的值,我已经操作过来解码我的编码图像,因为我编写了一个隐写术,否则我无法确定被操作的图像及其RGBA值是否被正确保存。
编辑: 编码图像由用户加载到我的服务器上,并作为img元素添加到DOM中。 比我的编码功能通过ctx.getImageData使用canvas访问此图像。 现在我在LSB-Method之后操纵RGBA值。 (二进制消息嵌入在每个R,G,B和A值的最后一位)
编码函数本身正在工作,但是当解码(使用toDataURL保存的操作图像)时,getImageData之前和之后的数据数组不相等。
我想这可能是由toDataURL引起的某种数据丢失
答案 0 :(得分:2)
toDataURL("image/png")
输出PNG8图像,最多只支持256种颜色。因此,如果您想要准确的输出,那么它是不可靠的。在这种情况下,您必须制作自己的编码算法(例如,在getImageData
的帮助下获取颜色数据,并编码为PNG24图像)。
答案 1 :(得分:2)
.getImageData - >期间会导致不等的值。 .putImageData循环。此周期有损。
WhatWG(标准板)规范允许浏览器在执行.putImageData时更改图像数据值。因此,生成的.toDataURL将具有与您操作的值相同(但不相同)的颜色值。允许浏览器更改您的值,以便更轻松地组合覆盖/覆盖画布的像素。
由于转换为预乘alpha颜色值的有损性质,刚刚使用putImageData()设置的像素可能会返回到等效的getImageData()作为不同的值。
https://html.spec.whatwg.org/multipage/scripting.html#the-canvas-element