Примечание. Это работает, только если изображение находится в том же домене, что и страница, или имеет crossOrigin="anonymous"
атрибут, а сервер поддерживает CORS. Это также не даст вам оригинальный файл, а перекодированную версию. Если вам нужно, чтобы результат был идентичен оригиналу, см . Ответ Кайидо .
Вам нужно будет создать элемент canvas с правильными размерами и скопировать данные изображения с помощью drawImage
функции. Затем вы можете использовать toDataURL
функцию для получения data: url с закодированным изображением base-64. Обратите внимание, что изображение должно быть полностью загружено, иначе вы просто получите пустое (черное, прозрачное) изображение.
Это было бы что-то вроде этого. Я никогда не писал сценарий Greasemonkey, поэтому вам может потребоваться настроить код для работы в этой среде.
function getBase64Image(img) {
// Create an empty canvas element
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
// Copy the image contents to the canvas
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
// Get the data-URL formatted image
// Firefox supports PNG and JPEG. You could check img.src to
// guess the original format, but be aware the using "image/jpg"
// will re-encode the image.
var dataURL = canvas.toDataURL("image/png");
return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}
Получение изображения в формате JPEG не работает на более старых версиях (около 3.5) Firefox, поэтому, если вы хотите это поддерживать, вам нужно проверить совместимость. Если кодировка не поддерживается, по умолчанию будет использоваться «image / png».
drawImage
ничего не сделает, и вы получите пустой холст и получившееся изображение.Эта функция берет URL, а затем возвращает изображение BASE64
Назовите это так:
getBase64FromImageUrl("images/slbltxt.png")
источник
img.src =
послеimg.onload =
, потому что в некоторых браузерах, таких как Opera, событие не произойдет.getBase64FromImageUrl(url)
иimg.onload = function ()
выхода из них img становится недоступным, а сборщик мусора. Кроме IE 6/7 и это нормально.Придет много позже, но ни один из ответов здесь не является полностью правильным.
При рисовании на холсте переданное изображение не сжимается + все предварительно умножается.
При экспорте он распаковывается или повторно сжимается по другому алгоритму и не умножается.
Все браузеры и устройства будут иметь разные ошибки округления, происходящие в этом процессе
(см. Отпечатки холста ).
Поэтому, если кто-то хочет версию образа для base64, он должен запросить его снова (большую часть времени он будет поступать из кэша), но на этот раз как Blob.
Затем вы можете использовать FileReader для чтения его как ArrayBuffer или как dataURL.
источник
XMLHttpRequest cannot load data:image/jpeg;base64,/9j/4AA ... /2Q==. Invalid response. Origin 'https://example.com' is therefore not allowed access.
Более современная версия ответа Кайидо с использованием fetch:
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
Редактировать: Как указано в комментариях, это будет возвращать URL объекта, который указывает на файл в вашей локальной системе вместо фактического DataURL, поэтому в зависимости от вашего варианта использования это может быть не то, что вам нужно.
Вы можете посмотреть следующий ответ, чтобы использовать fetch и фактический dataURL: https://stackoverflow.com/a/50463054/599602
источник
URL.revokeObjectURL()
если у вас есть долго работающее приложение, использующее этот метод, или ваша память будет загромождена.Шив / Шим / Шам
Если ваши изображения уже загружены (или нет), этот «инструмент» может пригодиться:
.. но почему?
Это дает преимущество использования «уже загруженных» данных изображения, поэтому дополнительный запрос не требуется. Aditionally это позволяет конечному пользователю (программисту , как вы) принимает решение о CORS и / или
mime-type
иquality
-ИЛИ- Вы можете оставить эти аргументы / параметры , как описано в MDN описании здесь .Если у вас загружен этот JS (до того момента, когда он понадобится), то преобразовать в
dataURL
него так же просто, как:Примеры
HTML
JS
Снятие отпечатков пальцев GPU
Если вас беспокоит «точность» битов, вы можете изменить этот инструмент в соответствии со своими потребностями, как указано в ответе @ Kaiido.
источник
Используйте
onload
событие для преобразования изображения после загрузкиПоказать фрагмент кода
источник
В HTML5 лучше использовать это:
источник