Nota: Esto solo funciona si la imagen es del mismo dominio que la página, o tiene el crossOrigin="anonymous"
atributo y el servidor admite CORS. Tampoco le dará el archivo original, sino una versión codificada nuevamente. Si necesita que el resultado sea idéntico al original, vea la respuesta de Kaiido .
Deberá crear un elemento de lienzo con las dimensiones correctas y copiar los datos de la imagen con la drawImage
función. Luego puede usar la toDataURL
función para obtener datos: url que tiene la imagen codificada en base 64. Tenga en cuenta que la imagen debe estar completamente cargada, o simplemente obtendrá una imagen vacía (negra, transparente).
Sería algo como esto. Nunca he escrito un script de Greasemonkey, por lo que es posible que deba ajustar el código para que se ejecute en ese entorno.
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,/, "");
}
Obtener una imagen con formato JPEG no funciona en versiones anteriores (alrededor de 3.5) de Firefox, por lo que si desea admitir eso, deberá verificar la compatibilidad. Si la codificación no es compatible, el valor predeterminado será "image / png".
drawImage
hará nada, y terminarás con un lienzo en blanco y la imagen resultante.Esta función toma la URL y luego devuelve la imagen BASE64
Llámalo así:
getBase64FromImageUrl("images/slbltxt.png")
fuente
img.src =
despuésimg.onload =
, porque en algunos navegadores, como Opera, el evento no sucederá.getBase64FromImageUrl(url)
yimg.onload = function ()
se han salido, img es inalcanzable y se recolecta basura. Aparte de IE 6/7 y esto está bien.Mucho después, pero ninguna de las respuestas aquí es completamente correcta.
Cuando se dibuja en un lienzo, la imagen pasada se descomprime y se multiplica previamente.
Cuando se exporta, se descomprime o vuelve a comprimir con un algoritmo diferente y no se multiplica.
Todos los navegadores y dispositivos tendrán diferentes errores de redondeo en este proceso
(ver Huellas digitales de Canvas ).
Entonces, si uno quiere una versión base64 de un archivo de imagen, debe solicitarlo nuevamente (la mayoría de las veces vendrá del caché) pero esta vez como un Blob.
Luego puede usar un FileReader para leerlo como ArrayBuffer o como dataURL.
fuente
XMLHttpRequest cannot load data:image/jpeg;base64,/9j/4AA ... /2Q==. Invalid response. Origin 'https://example.com' is therefore not allowed access.
Una versión más moderna de la respuesta de kaiido usando fetch sería:
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
Editar: como se señaló en los comentarios, esto devolverá una URL de objeto que apunta a un archivo en su sistema local en lugar de un DataURL real, por lo que, según su caso de uso, esto podría no ser lo que necesita.
Puede consultar la siguiente respuesta para usar fetch y una dataURL real: https://stackoverflow.com/a/50463054/599602
fuente
URL.revokeObjectURL()
si tienes una aplicación de larga ejecución que usa este método, o tu memoria se desordenará.shiv / shim / sham
Si sus imágenes ya están cargadas (o no), esta "herramienta" puede ser útil:
.. ¿pero por qué?
Esto tiene la ventaja de utilizar los datos de imagen "ya cargados", por lo que no se necesita ninguna solicitud adicional. Adicionalmente permite que el usuario final (programador como usted) decidir las CORS y / o
mime-type
equality
-O- se puede dejar de lado estos argumentos / parámetros tal como se describe en el MDN especificación aquí .Si tiene este JS cargado (antes de cuando sea necesario), la conversión a
dataURL
es tan simple como:ejemplos
HTML
JS
Huella digital GPU
Si le preocupa la "precisión" de los bits, puede modificar esta herramienta para que se ajuste a sus necesidades según lo dispuesto por la respuesta de @ Kaiido.
fuente
Use el
onload
evento para convertir la imagen después de cargarMostrar fragmento de código
fuente
En HTML5 mejor use esto:
fuente