Nota: Isso funciona apenas se a imagem for do mesmo domínio da página ou tiver o crossOrigin="anonymous"
atributo e o servidor suportar CORS. Também não fornecerá o arquivo original, mas uma versão recodificada. Se você precisar que o resultado seja idêntico ao original, consulte a resposta de Kaiido .
Você precisará criar um elemento de tela com as dimensões corretas e copiar os dados da imagem com a drawImage
função Em seguida, você pode usar a toDataURL
função para obter um dado: url que tenha a imagem codificada na base 64. Observe que a imagem deve estar totalmente carregada ou você receberá uma imagem vazia (preta, transparente).
Seria algo assim. Eu nunca escrevi um script Greasemonkey, portanto, pode ser necessário ajustar o código para ser executado nesse ambiente.
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,/, "");
}
A obtenção de uma imagem formatada em JPEG não funciona em versões mais antigas (cerca de 3,5) do Firefox, por isso, se você quiser dar suporte a isso, precisará verificar a compatibilidade. Se a codificação não for suportada, o padrão será "image / png".
drawImage
não fará nada, e você terminará com uma tela em branco e a imagem resultante.Esta função pega o URL e retorna a imagem BASE64
Chame assim:
getBase64FromImageUrl("images/slbltxt.png")
fonte
img.src =
depoisimg.onload =
, porque em alguns navegadores, como o Opera, o evento não acontecerá.getBase64FromImageUrl(url)
eimg.onload = function ()
são encerrados, img fica inacessível e o lixo é coletado. Diferente do IE 6/7 e isso está ok.Vindo muito tempo depois, mas nenhuma das respostas aqui está totalmente correta.
Quando desenhada em uma tela, a imagem passada é descompactada + todas pré-multiplicada.
Quando exportado, é descompactado ou recomprimido com um algoritmo diferente e não é multiplicado.
Todos os navegadores e dispositivos terão diferentes erros de arredondamento nesse processo
(consulte Impressão digital do Canvas ).
Portanto, se alguém quiser uma versão base64 de um arquivo de imagem, precisará solicitá- lo novamente (na maioria das vezes será proveniente do cache), mas desta vez como um Blob.
Em seguida, você pode usar um FileReader para lê-lo como um ArrayBuffer ou como dataURL.
fonte
XMLHttpRequest cannot load data:image/jpeg;base64,/9j/4AA ... /2Q==. Invalid response. Origin 'https://example.com' is therefore not allowed access.
Uma versão mais moderna da resposta do kaiido usando a busca seria:
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
Editar: Como indicado nos comentários, isso retornará um URL de objeto que aponta para um arquivo no sistema local em vez de um DataURL real; portanto, dependendo do seu caso de uso, pode não ser o que você precisa.
Você pode olhar para a seguinte resposta para usar a busca e uma dataURL real: https://stackoverflow.com/a/50463054/599602
fonte
URL.revokeObjectURL()
se você tiver um aplicativo de execução demorada usando esse método, ou sua memória ficará cheia.shiv / shim / sham
Se suas imagens já estiverem carregadas (ou não), esta "ferramenta" pode ser útil:
.. mas por que?
Isso tem a vantagem de usar os dados de imagem "já carregados", portanto, nenhuma solicitação extra é necessária. Além disso, permite que o usuário final (programador como você) decida o CORS e / ou
mime-type
equality
-OR- você pode deixar de fora esses argumentos / parâmetros, conforme descrito na especificação MDN aqui .Se você tiver esse JS carregado (antes de quando for necessário), a conversão para
dataURL
é tão simples quanto:exemplos
HTML
JS
Impressão digital da GPU
Se você está preocupado com a "precisão" dos bits, pode alterar esta ferramenta para atender às suas necessidades, conforme fornecido pela resposta do @ Kaiido.
fonte
Use o
onload
evento para converter a imagem após o carregamentoMostrar snippet de código
fonte
No HTML5, use melhor isso:
fonte