比较 2 个画布元素的相似性并返回结果

Posted

技术标签:

【中文标题】比较 2 个画布元素的相似性并返回结果【英文标题】:compare 2 canvas elements for similarity and return result 【发布时间】:2020-08-28 16:49:45 【问题描述】:

我是 js 和 html5 的新手,所以这就是我正在做的事情:我正在开发一款有助于教授插画家快捷方式的游戏,第一个级别由 2 个画布组成,一个具有现有图像,另一个为空白并准备好让用户在 ctrl + s 上绘图(确保我使用 jquery 禁用了它的默认操作)我想比较这两个画布元素的内容。我发现 deepai.org 的图像相似度 api 非常有用和准确,但它只接受 url 或 input="file" 内容,所以我试图找到一种方法将绘制的画布作为图像上传(可能)到一个服务器并获取这样的 url:https://server.com/myaccount/images/img1.png 并且由于我只上传一个图像,我可以将该静态 url 传递给 api 以及原始图像,该图像也将具有一个静态 url,因此希望它可以进行比较。

【问题讨论】:

你用的是什么后端框架? @rkalra 我不使用任何框架(你的意思是 node.js ...?)而且我更喜欢不使用其他任何东西,只使用 js、html5 和 jquery,因为我熟悉这些语言 您可能会发现这个答案很有用 - ***.com/a/15773267/3306990。希望这会有所帮助。 嘿!请尝试更详细地解释您的问题:您有服务器吗?也许这可以为您解决:***.com/a/13198699/9450776 Best,Paul @Pauloco 我试图将我的图像放在本地主机上但没有运气,所以我现在正在尝试制作服务器或找到一种方法来托管我的文件 【参考方案1】:

我制作了一个无需服务器即可工作的解决方案。但我无法让它在像 jsfiddle 这样的在线代码仓库中工作。所以我把它放在我自己的服务器上供你检查。 http://paulyro.com/paul/deepai/

为方便起见,我将所有内容都放在一个文件中。当然,将 JS 保存在单独的文件中是有意义的。但我让你自己决定。

解释:黑框内的红色方块是画布。我生成两个图像并将它们添加到页面中。然后,当您按下按钮时,我会将这些图像发送到 deepAI 服务器。您只需要一个生成的 img,但出于测试目的,我制作了 2 个。

如果这就是您要找的,请告诉我。当然,我希望您根据自己的具体需求调整此解决方案;)

这是代码:

<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="utf-8">
    <title>DeepAiDemo</title>
    <script src="https://cdnjs.deepai.org/deepai.min.js"></script>
    <style rel="stylesheet">
        canvas 
            border: 1px solid black;
        
    </style>
  </head>
  <body>
    <canvas id="canvas1"  ></canvas>
    <button name="button" onClick="load()">Press me</button>
    <div style="position:absolute;left:400px; top:30px; height: 354px;" id="messages">Result will get here</div>
    <script type="text/javascript">
        (async function() 
            var can = document.getElementById('canvas1');
            var ctx = can.getContext('2d');

            // create green canvas and make it an image
            ctx.fillStyle = "green";
            ctx.fillRect(75, 75, 50, 50);
            var img = new Image();
            img.src = can.toDataURL();
            document.body.appendChild(img);

            // create red canvas and make it an image
            ctx.fillStyle = "red";
            ctx.fillRect(75, 75, 50, 50);
            var img2 = new Image();
            img2.src = can.toDataURL();
            document.body.appendChild(img2);

        )()
        const load = async () => 
            document.getElementById('messages').innerHTML = "Waitng for response...";
            deepai.setApiKey('xxxxxxxxxxxxxx');

            var images = document.getElementsByTagName('img');
            console.log("amount images: "+images.length);
            console.log(images[0]);
            console.log(images[1]);

            var resp = await deepai.callStandardApi("image-similarity", 
                image1: images[0],
                image2: images[1],
            );
            console.log("response: ");
            console.log(resp);

            document.getElementById('messages').innerHTML = "Distance: " + resp.output.distance; //resp.output.distance contains the number from the server.

        ;
    </script>
  </body>
</html>

干杯, 保罗

【讨论】:

谢谢你,我没想过将图像保存到数组中,希望这对我有用,我会尽快尝试并告诉你它是否有效(今天确定) 太棒了。当然,慢慢来。当然微调是个好主意。例如。如果您有大量图像,您可以将图像附加到带有 ID 的特定 div,这样您就可以轻松找到它,而不是我的解决方案,HTML 正文中只有 2 张图片。 谢谢你救了我!!!但我现在遇到了另一个问题,因为其中一个画布内容是从文件(drawimage)中设置的,所以它给出了“可能无法导出受污染的画布”有什么办法可以解决这个问题吗?我在绘制的画布上尝试了您的代码(我将其输入为 img1 和 iimg2),万岁我得到了距离 0。 很高兴知道。一旦您满意,请将答案标记为已接受。该错误来自跨域问题尝试在加载之前将其添加到您的drawimage:。进一步阅读:***.com/questions/22710627/… 我现在收到此错误:“CORS 策略已阻止从原点 'null' 访问 'file:///xxxxx/Desktop/illustrator_game/level/level.png' 中的图像:Cross原始请求仅支持协议方案:http、data、chrome、chrome-extension、https。"有任何想法吗 ?我认为 crossorigin 适用于 node.js 对吗?

以上是关于比较 2 个画布元素的相似性并返回结果的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得到这个错误结果=方法(y)FutureWarning:元素比较失败;而是返回标量

方法功能描述:从str1中删除所有的str2,并返回删除后的结果,返回结果为Object[]数组

Informix SQL 查询:返回不同结果的两个相似查询

递归比较两个列表

检查值并返回结果的函数

Psycopg2 - 返回前 1000 个结果并随机选择一个