Nota: Esto sólo funciona si la imagen es del mismo dominio que la página, o tiene el atributo crossOrigin="anonymous"
y el servidor soporta CORS. Tampoco le proporcionará el archivo original, sino una versión recodificada. Si necesita que el resultado sea idéntico al original, consulte Kaiido's answer.
Usted tendrá que crear un elemento de lienzo con las dimensiones correctas y copiar los datos de la imagen con la función drawImage
. Luego puede usar la función toDataURL
para obtener una información: 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 escribí 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,/, "");
}
conseguir una imagen con formato JPEG no funciona en versiones anteriores (alrededor de 3.5) de Firefox, así que si usted quiere apoyar eso, usted tendrá que comprobar la compatibilidad. Si la codificación no es compatible, se establecerá de forma predeterminada en "image/png".
Si bien esto parece estar funcionando (excepto el no protegido/en el retorno), no crea la misma cadena base64 que la que obtengo de PHP cuando se hace base64_encode en el archivo obtenido con la función file_get_contents. Las imágenes parecen muy similares/iguales, aún el de Javascripted es más pequeño y me encantaría que fueran exactamente iguales. Una cosa más: la imagen de entrada es una pequeña (594 bytes), 28x30 PNG con fondo transparente, si eso cambia algo. – Detariael
También http://www.motobit.com/util/base64-decoder-encoder.asp confirma que la cadena codificada en Base64 de JavaScript es incorrecta: si se crea a partir del archivo original, el resultado es el mismo que el mío de PHP y diferente de el de Javascript. – Detariael
Firefox podría estar usando un nivel de compresión diferente que afectaría la codificación. Además, creo que PNG admite información de encabezado adicional, como notas, que se perderá, ya que el lienzo solo obtiene los datos de píxeles. Si necesita que sea exactamente igual, probablemente pueda usar AJAX para obtener el archivo y base64 codificarlo manualmente. –