我想保存我的画布到img。我有这样一个函数:
function save() {
document.getElementById("canvasimg").style.border = "2px solid";
var dataURL = canvas.toDataURL();
document.getElementById("canvasimg").src = dataURL;
document.getElementById("canvasimg").style.display = "inline";
}
它给出了错误:
Uncaught SecurityError:未能在“HTMLCanvasElement”上执行“toDataURL”:受污染的画布可能无法导出。
我该怎么办?
检查从MDN启用的CORS图像。
基本上,你必须有一个服务器托管图像与适当的Access-Control-Allow-Origin头。
< IfModule mod_setenvif c >。
< IfModule mod_headers c >。
< FilesMatch”\。(狗| gif | ico | jpe ? g | png | svgz ? | webp美元)" >
“IS_CORS”
标题集access -控制
< / FilesMatch >
< / IfModule >
< / IfModule >
您将能够将这些图像保存到DOM存储,就像它们是从您的域提供的一样,否则您将遇到安全问题。
var img = new Image,
canvas = document.createElement("canvas"),
ctx = canvas.getContext("2d"),
src = "http://example.com/image"; // insert image url here
img.crossOrigin = "Anonymous";
img.onload = function() {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage( img, 0, 0 );
localStorage.setItem( "savedImageData", canvas.toDataURL("image/png") );
}
img.src = src;
// make sure the load event fires for cached images too
if ( img.complete || img.complete === undefined ) {
img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
img.src = src;
}
如果有人对我的回答有看法,你可能会有这样的情况:
1. 尝试在画布中使用openlayers获取地图截图(版本>= 3)
2. 并查看了导出map的示例
3.使用ol.source.XYZ渲染地图层
宾果!
使用ol.source.XYZ.crossOrigin = '匿名'来解决你的困惑。
或者像下面的代码:
var baseLayer = new ol.layer.Tile({
name: 'basic',
source: new ol.source.XYZ({
url: options.baseMap.basic,
crossOrigin: "Anonymous"
})
});
在OpenLayers6中,ES6做了一些改变。然而,代码是相似的。
import { XYZ } from 'ol/source'
import { Tile as TileLayer } from 'ol/layer'
const baseLayer = new TileLayer({
name : 'basic',
source: new XYZ({
url: 'example.tile.com/x/y/z', // your tile url
crossOrigin: 'Anonymous',
// remove this function config if the tile's src is nothing to decorate. It's usually to debug the src
tileLoadFunction: function(tile, src) {
tile.getImage().src = src
}
})
})
更重要的是,不要忘记在响应头中设置access-control-allow-origin: *或access-control-allow-origin:[你的白名单起源],如果瓷砖是在你自己的服务器上请求的。
是这样的:
更多细节,还有这个
这个可以在laravel中顺利工作。
首先,您需要将受污染的画布转换为blob。在此之后,您可以上传一个blob来服务并将其保存为图像。在ajax调用中返回图像URL。
这是一个上传画布blob的ajax调用。
$("#downloadCollage").click(function(){
canvas.toBlob(function(blob){
var formDataToUpload = new FormData();
formDataToUpload.append("_token", "{{ csrf_token() }}");
formDataToUpload.append("image", blob);
$.ajax({
url:"{{ route('selfie_collage_upload') }}",
data: formDataToUpload,
type:"POST",
contentType:false,
processData:false,
cache:false,
dataType:"json",
error:function(err){
console.error(err);
},
success:function(data){
window.location.href= data.url;
},
complete:function(){
}
});
},'image/png');
link.click();
});
检查从MDN启用的CORS图像。
基本上,你必须有一个服务器托管图像与适当的Access-Control-Allow-Origin头。
< IfModule mod_setenvif c >。
< IfModule mod_headers c >。
< FilesMatch”\。(狗| gif | ico | jpe ? g | png | svgz ? | webp美元)" >
“IS_CORS”
标题集access -控制
< / FilesMatch >
< / IfModule >
< / IfModule >
您将能够将这些图像保存到DOM存储,就像它们是从您的域提供的一样,否则您将遇到安全问题。
var img = new Image,
canvas = document.createElement("canvas"),
ctx = canvas.getContext("2d"),
src = "http://example.com/image"; // insert image url here
img.crossOrigin = "Anonymous";
img.onload = function() {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage( img, 0, 0 );
localStorage.setItem( "savedImageData", canvas.toDataURL("image/png") );
}
img.src = src;
// make sure the load event fires for cached images too
if ( img.complete || img.complete === undefined ) {
img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
img.src = src;
}