为什么2个相同的图像具有不同的dataUrls?

时间:2016-08-20 09:05:19

标签: javascript html5-canvas data-uri todataurl

我有2张图片都是通过javascript画布生成的。 我想检查两个图像是否相同。 为此,我生成了一组图像并将其保存为png文件。 然后我尝试比较两者的dataUrls,先前生成的图像和新生成的图像。但dataUrls是不同的。为什么会这样?

我使用了来自imagemagick的compare来进行双重检查,这些图像实际上是相同的。唯一的区别是,第一个可用作文件,另一个可通过canvas元素获得。

我用这种方式生成了dataUrls:

// first image: available as file:
<img src="image.png"> // var img = ...
var canvas1 = document.createElement('canvas')
canvas1.width = img.width
canvas1.height = img.height
canvas1.getContext('2d').drawImage(img,0,0)
canvas1.toDataURL()

// second image generated on canvas
canvas2.width = 500
canvas2.height = 500
canvas2.getContext('2d').rect(20,20,150,100);
canvas2.toDataURL()

请注意,这只是某些图片的问题 - 并非所有图片都是如此。上面显示的简单示例完全有效。

1 个答案:

答案 0 :(得分:0)

我最终创建了两个新的图像对象,然后我用它们在另一个画布上绘制它们,我从中获得了dataUrl - 它们最终匹配了!

var imageToCanvas = function (img) {
    var canvas = document.createElement('canvas')
    canvas.width = img.width
    canvas.height = img.height
    canvas.getContext('2d').drawImage(img, 0, 0)
    return canvas
}

let img1 = document.createElement('img')
let img2 = document.createElement('img')

let one, two

img1.onload = function(){
    one = imageToCanvas(img1)
    cb()
}

img2.onload = function(){
    two = imageToCanvas(img2)
    cb()
}

img1.src = canvas.toDataURL() // my images generated with the same parameters like the reference images
img2.src = images[i].src // my pregenerated reference images

let cb = function(){
    if(!one || !two) return

    console.log(one.toDataURL(),two.toDataURL()) // the same

}