В вашем исследовании кажется, что вы прочитали атрибут crossOrigin
, который действительно необходим для доступа к данным ресурсов разных источников.
Однако, похоже, вы не совсем поняли, как он работает.
Этот атрибут является флагом для браузера, чтобы он знал, должны ли они запрашивать ресурс, извлеченный элементом, с заголовками CORS,так что сервер может отправить им ответ с соответствующими заголовками Allow-Origin (или с отказом).
Но этот атрибут ничего не вызывает сам по себе, он простофлаг и посещается только при извлечении ресурса Элемента.
Это означает, что для того, чтобы он имел какой-либо эффект, вы должны установить его перед установкой src
.
Элемента.Поэтому, когда в вашем коде вы делаете im.crossOrigin = "";
, так как после этой настройки вы не устанавливаете src
снова, у извлеченного ресурса нет правильных заголовков Allow-Origin , и ресурс помечаетсянарушая Политику одного и того же происхождения и, таким образом, испортит ваш холст.
Теперь обратите внимание, что некоторые браузеры требуют, чтобы сервер отправлял как минимум заголовок Vary: Origin
или даже Allow-Origin: *
даже для запросовготовы быть кросс-происхождения. см. Больше.
Так что лучше всего установить атрибут crossOrigin
из первого запроса, вы не показываете, где он находится в вашем коде, но вот оба возможных случая:
onload = e => {
const img2 = new Image();
img2.crossOrigin = ""; // set it before setting the src
img2.onload = draw; // wait it's loaded
img2.src = "https://commons.wikimedia.org/static/images/project-logos/commonswiki.png";
};
function draw(evt) {
const img1 = document.getElementById('img1');
const img2 = this;
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
canvas.height = 200;
ctx.drawImage(img2,50,0,200,200);
ctx.drawImage(img1,0,0,300,200);
// export to an <img> in body
canvas.toBlob( blob =>
document.body.appendChild(new Image())
.src = URL.createObjectURL(blob)
);
}
#img1{
display: none;
}
<!-- set the attribute in the markup directly -->
<img id="img1" crossOrigin="anonymous" src="https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png">
И, конечно, это предполагает, что ваш сервер правильно настроен для приема анонимных запросов.