Não dormi o suficiente ou o quê? Este código a seguir
var frame=document.getElementById("viewer");
frame.width=100;
frame.height=100;
var ctx=frame.getContext("2d");
var img=new Image();
img.src="http://www.ansearch.com/images/interface/item/small/image.png"
img.onload=function() {
// draw image
ctx.drawImage(img, 0, 0)
// Here's where the error happens:
window.open(frame.toDataURL("image/png"));
}
está gerando este erro:
SECURITY_ERR: DOM Exception 18
Não tem como isso não funcionar! Alguém pode explicar isso, por favor?
javascript
html
canvas
cross-domain
pop850
fonte
fonte
Respostas:
Nas especificações , diz:
Se a imagem vier de outro servidor, acho que você não pode usar toDataURL ()
fonte
Definir atributo de origem cruzada nos objetos de imagem funcionou para mim (eu estava usando fabricjs)
Para aqueles que usam fabricjs, veja como corrigir Image.fromUrl
fonte
Se a imagem estiver hospedada em um host que define Access-Control-Allow-Origin ou Access-Control-Allow-Credentials, você pode usar o Cross Origin Resource Sharing (CORS). Veja aqui (o atributo crossorigin) para mais detalhes.
Sua outra opção é que seu servidor tenha um endpoint que busca e veicula uma imagem. (por exemplo, http: // seu_host / endpoint? url = URL ) A desvantagem dessa abordagem é a latência e, teoricamente, a busca desnecessária.
Se houver mais soluções alternativas, estou interessado em ouvir sobre elas.
fonte
Parece que há uma maneira de evitar que, se a hospedagem de imagens for capaz de fornecer os seguintes cabeçalhos HTTP para os recursos de imagem e o navegador for compatível com CORS:
É declarado aqui: http://www.w3.org/TR/cors/#use-cases
fonte
Finalmente encontrei a solução. Só precisa adicionar o
crossOrigin
terceiro parâmetro nafromURL
funçãofonte
Tive o mesmo problema e todas as imagens estão hospedadas no mesmo domínio ... Então, se alguém está com o mesmo problema, resolvi aqui:
Eu tinha dois botões: um para gerar a tela e outro para gerar a imagem a partir da tela. Só funcionou para mim, e sinto muito por não saber por que, quando escrevi todo o código no primeiro botão. Então, quando eu clicar nele, gerei a tela e a imagem ao mesmo tempo ...
Sempre tenho esse problema de segurança quando os códigos estavam em funções diferentes ... = /
fonte
Consegui fazer funcionar usando:
Escreva isso na primeira linha do seu
.htaccess
servidor de origemEntão, ao criar um
<img>
elemento, faça o seguinte:fonte
Você não pode colocar espaços em seu ID
Atualizar
Meu palpite é que a imagem está em um servidor diferente daquele onde você está executando o script. Consegui duplicar o seu erro ao executá-lo em minha própria página, mas funcionou bem no momento em que usei uma imagem hospedada no mesmo domínio. Portanto, está relacionado à segurança - coloque a imagem em seu site. Alguém sabe por que isso acontece?
fonte
Se você estiver simplesmente desenhando algumas imagens em uma tela, certifique-se de carregar as imagens do mesmo domínio.
www.example.com é diferente de example.com
Portanto, certifique-se de que suas imagens e o url que você tem em sua barra de endereço sejam iguais, www ou não.
fonte
Estou usando fabric.js e poderia resolver isso usando toDatalessJSON em vez de toDataURL:
Edit: Nevermind. Isso resulta na exportação apenas da imagem de fundo para JPG, sem o desenho na parte superior, portanto, não foi totalmente útil.
fonte