Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Метод getImageData работает наполовину (https://javascript.ru/forum/events/65835-metod-getimagedata-rabotaet-napolovinu.html)

Даша4 10.11.2016 12:59

Метод getImageData работает наполовину
 
Здравствуйте. У меня как-то наполовину работает метод getImageData в канвасе. Когда я рисую квадрат, то эта функция работает нормально, а когда вставляю картинку она вообще не работает. В консоли выдает ошибку:
Код:

Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
Я беру код прямо с примеров, вот например:
document.getElementById("scream").onload = function() {
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");
    var img = document.getElementById("scream");
    ctx.drawImage(img, 0, 0);
    var imgData = ctx.getImageData(0, 0, c.width, c.height);
	console.log(imgData.data[0]);
    // invert colors
    var i;
    for (i = 0; i < imgData.data.length; i += 4) {
        imgData.data[i] = 255 - imgData.data[i];
        imgData.data[i+1] = 255 - imgData.data[i+1];
        imgData.data[i+2] = 255 - imgData.data[i+2];
        imgData.data[i+3] = 255;
    }
    ctx.putImageData(imgData, 0, 0);
};

Может быть у меня старая версия JavaScript?

Deff 10.11.2016 13:17

Даша4,
Картинка должна быть загружена на тот же домен, что и страница со скриптом. Картинки с чужого домена не читаются
При считывании с локального хоста тож помнится были сложности... вроде как в одной папке со страницей, и то, не со всех браузеров

Даша4 10.11.2016 14:10

да спасибо большое. Наверно эта функция еще не доработана. Я пыталась запустить ее на локальном компе. Просто я решила запустить пример.

Aetae 10.11.2016 14:27

Даша4, скорее наоборот, передоработана.)
Помнится самые первые версии в бэтах позволяли брать "чужие" картинки, что позволяло воровать информацию с других сайтов и потому эту дырку быстро закрыли.)

Deff 10.11.2016 14:47

Цитата:

Сообщение от Aetae (Сообщение 434655)
Даша4, скорее наоборот, передоработана.)
Помнится самые первые версии в бэтах позволяли брать "чужие" картинки, что позволяло воровать информацию с других сайтов и потому эту дырку быстро закрыли.)

Ну через линейный анонимайзер мон и сегодня... друго дело ненадёжно, сайт работает, анонимайзер на обслуге, хотя чичас большинство имеют прицепленное к сайту API проксирования, смысла в этих защитах ток от обывателя

Aetae 10.11.2016 22:17

Deff, нет, тут суть в ином. Картинки могут генерироваться персонально для человека и содержать конфиденциальные данные. Соответственно злоумышленник таким образом может получить такие картинки по прямым url, т.к. пользователь автоматизирован на целевом сайте, и украсть информацию. Всякие проксики, соответственно, авторизации не имеют, как и доступа к таким вещам.

Deff 10.11.2016 22:57

++
Ну да, под логином могут быть конфиденциальные файлы и сведения

Alexandroppolus 11.11.2016 11:29

Есть 3 варианта:
1) Атрибут crossorigin для img (поддерживается не во всех браузерах)
2) Загрузка картинки через свой сервер (если есть такая возможность)
3) Если вдруг картинка приходит с CORS-заголовками (что маловероятно), то её можно аяксом загрузить как блоб, передать в URL.createObjectURL, и создать картинку с таким адресом


Часовой пояс GMT +3, время: 04:52.