Мой код очень хорошо работает на моем локальном хосте, но не работает на сайте.
Я получил эту ошибку из консоли для этой строки .getImageData(x,y,1,1).data
:
Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
часть моего кода:
jQuery.Event.prototype.rgb=function(){
var x = this.offsetX || (this.pageX - $(this.target).offset().left),y = this.offsetY || (this.pageY - $(this.target).offset().top);
if (this.target.nodeName!=="CANVAS")return null;
return this.target.getContext('2d').getImageData(x,y,1,1).data;
}
Примечание: мой URL-адрес изображения (src) взят с URL-адреса поддомена
javascript
html
html5-canvas
Эрфан Сафарпур
источник
источник
Ответы:
Как уже говорили другие, вы «заражаете» холст загрузкой из домена перекрестного происхождения.
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
Однако вы можете предотвратить это, просто установив:
Это работает, только если удаленный сервер правильно устанавливает следующий заголовок:
Выбора файлов Dropbox при использовании опции «прямая ссылка» является прекрасным примером этого. Я использую его на oddprints.com для переноса изображений с URL удаленного изображения Dropbox на свой холст, а затем отправляю данные изображения обратно на мой сервер. Все в javascript
источник
Я обнаружил, что мне пришлось использовать
.setAttribute('crossOrigin', '')
и мне пришлось добавить метку времени к строке запроса URL-адреса, чтобы избежать ответа 304 безAccess-Control-Allow-Origin
заголовка.Это дает мне
источник
imgObj.setAttribute('crossOrigin', '')
решило это для меня - спасибо!img.crossOrigin = "Anonymous"
также работает (как упоминалось здесь ). @SanfordStaab Браузеры рассматривают локальные файлы как находящиеся в другом домене, в противном случае владельцы веб-сайтов могли бы читать ваши локальные файлы. Вам нужно запрашивать изображения из того же домена, или заголовки в ответе на ваш запрос должны сообщать браузеру, что код из других доменов может читать этот файл.Вы не сможете рисовать изображения прямо с другого сервера на холсте, а затем использовать
getImageData
. Это проблема безопасности, и холст будет считаться "испорченным".Сработает ли для вас сохранить копию изображения на сервере с помощью PHP, а затем просто загрузить новое изображение? Например, вы можете отправить URL-адрес сценария PHP и сохранить его на своем сервере, а затем вернуть новое имя файла в свой javascript следующим образом:
Вы бы использовали сценарий PHP с некоторым javascript ajax следующим образом:
Если после этого использовать
getImageData
на холсте, все будет нормально.В качестве альтернативы, если вы не хотите сохранять все изображение, вы можете передать координаты x и y в свой PHP-скрипт и вычислить значение rgba пикселя на этой стороне. Я думаю, что есть хорошие библиотеки для такой обработки изображений в PHP.
Если вы хотите использовать этот подход, дайте мне знать, если вам понадобится помощь в его реализации.
edit-1: peeps указали, что скрипт php открыт и позволяет Интернету потенциально использовать его злонамеренно. есть миллион способов справиться с этим, один из самых простых - это своего рода обфускация URL ... я считаю, что безопасные методы php заслуживают отдельного Google; P
edit-2: по многочисленным просьбам я добавил проверку, чтобы убедиться, что это изображение, а не сценарий php (от: Проверка PHP, является ли файл изображением ).
источник
Я видел эту ошибку,
Chrome
пока тестировал свой код локально. Я переключился наFirefox
и больше не вижу ошибки. Возможно, переход на другой браузер - быстрое решение.Если вы используете решение, указанное в первом ответе, убедитесь, что вы добавили его
img.crossOrigin = "Anonymous";
сразу после объявленияimg
переменной (напримерvar img = new Image();
).источник
Ваша проблема в том, что вы загружаете внешнее изображение, то есть из другого домена. Это вызывает ошибку безопасности при попытке доступа к каким-либо данным контекста холста.
источник
Вы «заражаете» холст загрузкой из домена перекрестного происхождения. Ознакомьтесь с этой статьей MDN:
https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image
источник
При работе на локальном добавить сервер
У меня была аналогичная проблема при работе с local. Ваш URL-адрес будет путем к локальному файлу, например file: ///Users/PeterP/Desktop/folder/index.html.
Обратите внимание, что я использую MAC.
Я обошел это, установив http-сервер глобально. https://www.npmjs.com/package/http-server
шаги:
npm install http-server -g
http-server ~/Desktop/folder/
PS: Я предполагаю, что у вас установлен узел, иначе вы не получите очень далеко от команд npm.
источник
Как сказал Мэтт Бернс в своем ответе , вам может потребоваться включить CORS на сервере, на котором размещены проблемные изображения.
Если сервер Apache, это можно сделать, добавив следующий фрагмент ( отсюда ) либо в вашу конфигурацию VirtualHost, либо в
.htaccess
файл:... при добавлении его в VirtualHost вам, вероятно, потребуется также перезагрузить конфигурацию Apache (например,
sudo service apache2 reload
если Apache работает на сервере Linux)источник
Моя проблема была настолько запутанной, что я просто закодировал изображение base64, чтобы убедиться, что не может быть никаких проблем с CORS
источник
Сегодня я сталкиваюсь с той же проблемой и решаю ее следующим кодом.
html-код:
js код:
код, подобный приведенному выше, и междоменной проблемы нет.
источник
У меня была такая же проблема, и для меня это сработало, просто объединив
https:${image.getAttribute('src')}
источник