Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将受污染的画布下载为PNG_Javascript_Html - Fatal编程技术网

Javascript 将受污染的画布下载为PNG

Javascript 将受污染的画布下载为PNG,javascript,html,Javascript,Html,我正在尝试制作一个按钮,当按下该按钮时,会将画布元素下载为PNG文件 function downloadImage(canvas) { let url = canvas.toDataURL("image/png"); window.open(url); } 此代码适用于未上色的画布,但我尝试下载图像的画布已被污染,因此我无法在其上运行.toDataURL()。我见过许多处理污染画布的线程都与创建画布的图像显示有关,但有没有办法直接下载它而不创建中间图像元素 我的网站非常简单,目

我正在尝试制作一个按钮,当按下该按钮时,会将画布元素下载为PNG文件

function downloadImage(canvas)
{
    let url = canvas.toDataURL("image/png");
    window.open(url);
}
此代码适用于未上色的画布,但我尝试下载图像的画布已被污染,因此我无法在其上运行
.toDataURL()
。我见过许多处理污染画布的线程都与创建画布的图像显示有关,但有没有办法直接下载它而不创建中间图像元素


我的网站非常简单,目前我没有在任何服务器上运行它(只是在Google Chrome中打开index.html文件)。但是,我也不想更改任何本地浏览器设置,因为我希望它可以在多个不同的浏览器上运行。

问题是JavaScript的设计目的是让您不下载任何受污染的图像

然而,这是可以避免的。您在问题中提到您正在使用文件协议;然而,评论中提到,您最终会在github页面上使用web服务器,因此,如果我们在这种环境下工作,也许我们可以做到这一点

首先,再次直接回答您的问题,如何下载已被操纵的污染画布,正式而言,浏览器的设计旨在防止这种情况发生,请参阅以获取更多信息

现在我们来看看可能的解决办法

这取决于画布被污染的原因,是在代码访问画布之前在画布上画了什么,还是您的代码首先使画布被污染

如果这是第二种选择,那么,正如所引用的答案中提到的,你可以做几件事

首先,尝试在JavaScript中的image元素上添加属性
crossOrigin=“anonymous”
,这可能适用于某些站点

但对于其他人,您可以使用nodeJS或PHP或任何其他服务器端语言设置一个简单的服务器,托管在任何托管平台上,该平台将对给定的图像URL发出HTTP请求,下载它,并将其返回到您的客户机文件,访问控制允许源设置为
*
,但是,正如回答中所述,这将占用更多的带宽,但如果带宽不是问题,那么您可以这样做

当然,您也可以让用户通过文件输入而不是URL上传图像,但这会限制可用性

另一种选择是,与前面提到的第一个“crossOrigin”解决方案相关,如果图像来自允许跨源请求的站点,则您可以首先使用fetch下载它,然后从blob数据生成一个对象URL,并将图像的源设置为该URL,然后当图像加载时,基本上将其绘制到画布上

fetch("someURLtoAnImageOnaSiteThatAllowsCrossOriginRequests")
.then(result => result.blob())
.then(blob => {
    myImageElement.src = URL.createObjectURL(blob);
    myImageElement.onload = startDrawingImageToCanvasFunction;
})

问题是JavaScript的设计目的是让您不下载任何受污染的图像

然而,这是可以避免的。您在问题中提到您正在使用文件协议;然而,评论中提到,您最终会在github页面上使用web服务器,因此,如果我们在这种环境下工作,也许我们可以做到这一点

首先,再次直接回答您的问题,如何下载已被操纵的污染画布,正式而言,浏览器的设计旨在防止这种情况发生,请参阅以获取更多信息

现在我们来看看可能的解决办法

这取决于画布被污染的原因,是在代码访问画布之前在画布上画了什么,还是您的代码首先使画布被污染

如果这是第二种选择,那么,正如所引用的答案中提到的,你可以做几件事

首先,尝试在JavaScript中的image元素上添加属性
crossOrigin=“anonymous”
,这可能适用于某些站点

但对于其他人,您可以使用nodeJS或PHP或任何其他服务器端语言设置一个简单的服务器,托管在任何托管平台上,该平台将对给定的图像URL发出HTTP请求,下载它,并将其返回到您的客户机文件,访问控制允许源设置为
*
,但是,正如回答中所述,这将占用更多的带宽,但如果带宽不是问题,那么您可以这样做

当然,您也可以让用户通过文件输入而不是URL上传图像,但这会限制可用性

另一种选择是,与前面提到的第一个“crossOrigin”解决方案相关,如果图像来自允许跨源请求的站点,则您可以首先使用fetch下载它,然后从blob数据生成一个对象URL,并将图像的源设置为该URL,然后当图像加载时,基本上将其绘制到画布上

fetch("someURLtoAnImageOnaSiteThatAllowsCrossOriginRequests")
.then(result => result.blob())
.then(blob => {
    myImageElement.src = URL.createObjectURL(blob);
    myImageElement.onload = startDrawingImageToCanvasFunction;
})

那么你是在用
文件://
协议做所有事情?没有来自其他站点的外部图像?使用Firefox,它不考虑<代码>文件:///<代码>在我调试时在文件中工作://环境,但最终我想把它发布到GITHUB页面,在那里,来自不同浏览器的人会访问它,所以改变浏览器不是我的解决方案。那么,在github页面中,图像是否来源相同?图像直接上传到网站,而不是存储在任何地方,画布是通过操纵图像制作的,因此,我认为答案是肯定的。那么,一旦你摆脱了
文件://
协议,你就不会有问题了-使用本地http服务器进行开发-使用nodejs或pythonso非常简单-你正在使用
文件://
协议做任何事情?没有来自其他站点的外部图像?使用Firefox,它不考虑“代码>文件:///< /COD>在我调试时在文件中工作://环境,但最终我想把它发布到GITHUB页面,在那里,来自不同浏览器的人将访问它,所以改变浏览器不是我的解决方案。对,所以在GITHUB页面中