Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получение данных изображения по URL (https://javascript.ru/forum/misc/80455-poluchenie-dannykh-izobrazheniya-po-url.html)

RZAh 06.06.2020 19:00

Получение данных изображения по URL
 
Привет.

Передо мной поставлена задача - написать на JS инструмент для сравнения похожести изображений. Ранее писал такой на PHP (его я знаю лучше, чем JS). Нашел хороший код, который идеально описывает мою задачу - view-source:http://blog.kislenko.net/archives/9171.html

Но нужно его переделать, чтобы изображение загружалось по ссылке.

Банально указать ссылку в .src в объекте Image() не рашает проблему. Возможно, когда файл по ссылке грузится, нужно обрабатывать его по-другому.

Пожалуйста, подскажите, какие функции заменить, чтобы можно было передавать ссылку на изображение, а не файл.

Error 06.06.2020 21:47

Не до конца понимаю вопрос. Главное — загрузить изображение и отобразить его на холсте. Тогда функция compareImages сможет сравнить два массива. Способ загрузки файла не влияет на то, как его следует обрабатывать.

Чтобы загружать по ссылке, используйте crossOrigin='Anonymous'.

RZAh 07.06.2020 14:56

crossOrigin - это для загрузки скриптов. Я же говорю про загрузку изображений по ссылке.

Когда я заменяю у Image() аттрибут src на ссылку на изображение, например:

Код:

img1 = new Image();
img1.src = "https://cdn.freshdesignweb.com/wp-content/uploads/site/flow.js-angular-html5-file-upload.jpg";

При этом на Canvas появляются изображения по ссылке, но они не обрабатываются функцией "compareImages". Функция ничего не выдает.

Поэтому у меня вопрос: отличается ли обработка изображения, полученного по ссылке, а не файла. Предполагаю, что getImageData должна быть другой.

MallSerg 07.06.2020 15:15

Цитата:

crossOrigin - это для загрузки скриптов
Это утверждение лживое или ошибочное.

Это политика и применяют ее к HTTP запросам не имеет значение что эти запросы запрашивают (текст, картинки, скрипты или стили).

Отладчик браузера должен красными буквами писать что скрипт вызывает CORS исключение.

RZAh 07.06.2020 15:53

Crossorigin ничего не изменил - https://rzahprojects.000webhostapp.com/temp/image.html.

Или я неправильно его использовал

MallSerg 07.06.2020 16:43

Разрешение на использование изображения выдает хост который отвечает на запрос указав специальный заголовок. подробнее

В твоем примере хост "https://cdn.000webhost.com" должен установить
http заголовок "Access-Control-Allow-Origin: *" он этого не делает.
Ошибку в консоли ты не видишь потому что у промиса отправляющего запрос есть обработчик исключений.

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

Rise 07.06.2020 19:36

Цитата:

Сообщение от RZAh
чтобы можно было передавать ссылку на изображение, а не файл.

Правильно так:
img1.src = '/get.php?url=' + encodeURIComponent(url);

RZAh 08.06.2020 23:29

Если дело в хосте, почему не работает при запуске не с сервера (с компа)? Также почему-то скрипт видит размеры одного избражения (который запустится первым), а второго нет (undefined), почему так?

encodeURIComponent тоже не помогает.

Rise 09.06.2020 07:19

Цитата:

Сообщение от RZAh
Если дело в хосте, почему не работает при запуске не с сервера (с компа)?

Потому что на file:// нет хоста, location.host равно "". Чтобы работало нужен сервер, локальный или глобальный.
Цитата:

Сообщение от RZAh
Также почему-то скрипт видит размеры одного избражения (который запустится первым), а второго нет (undefined), почему так?

Потому что, getImageData дает ошибку на кросс-доменные картинки, не соответствующие определенным правилам.
Цитата:

Сообщение от RZAh
encodeURIComponent тоже не помогает.

А чем оно помогает, если это для PHP, чтобы правильно попасть в $_GET['url']. Вам нужен прокси-сервер для картинок, либо свой get.php, либо чужой. Если чужой, то он должен иметь специальный заголовок ответа Access-Control-Allow-Origin, а картинки должны иметь специальный атрибут crossorigin: img1.crossOrigin='anonymous', img2.crossOrigin='anonymous'.

PS: get.php вам нужно реализовать самому, а не просто указать в ссылке.


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