mais uma pergunta, como posso salvar a imagem que obtive nesta tag no servidor. Algum palpite?
Surya
7
Mas se eu usar var img = canvas.toDataURL ("image / jpeg"); estou obtendo o fundo como preto completo. Como corrigir isso
gauti
181
Oh vamos lá. Eu respondi isso em 2009. O que você espera?
donohoe
35
@donohoe, na verdade, você respondeu em agosto de 2010 :)
nick
13
Usaria muito menos memória para fazer algo assim var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);. O document.writecódigo está criando o URL dos dados, eles criando uma string HTML e, em seguida, colocando uma cópia dessa string no DOM, o navegador precisa analisar essa string HTML, colocar outra cópia no elemento de imagem e analisá-la novamente para ativar o URL de dados nos dados da imagem e, finalmente, ele pode mostrar a imagem. Para uma imagem em tamanho de tela, é uma quantidade enorme de memória / cópia / análise. Apenas uma sugestão
gman
116
O HTML5 fornece Canvas.toDataURL (mimetype), implementado no Opera, Firefox e Safari 4 beta. Entretanto, existem várias restrições de segurança (principalmente relacionadas ao desenho de conteúdo de outra origem na tela).
Portanto, você não precisa de uma biblioteca adicional.
por exemplo
<canvas id=canvas width=200 height=200></canvas><script>
window.onload =function(){var canvas = document.getElementById("canvas");var context = canvas.getContext("2d");
context.fillStyle ="green";
context.fillRect(50,50,100,100);// no argument defaults to image/png; image/jpeg, etc also work on some// implementations -- image/png is the only one that must be supported per spec.
window.location = canvas.toDataURL("image/png");}</script>
Teoricamente, isso deve criar e navegar para uma imagem com um quadrado verde no meio, mas não testei.
Onde a imagem será salva. Localização no meu local?
chinna_82
5
a imagem será exibida como uma imagem no seu navegador. Você pode salvá-lo em disco ou o que for. Aqui está um bookmarklet rápida e suja genérica "Canvas2PNG" que converte a primeira tela na página para PNG e exibe no navegador em uma nova janela:javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
Kai Carver
Se a imagem tiver alguns MB, prepare-se para travar o navegador (fiz isso há algum tempo no FireFox).
jahu
1
Como isso pode ser modificado para renderizar várias imagens?
Mentalista
Os URIs de dados têm tamanho máximo, portanto, há um limite superior no tamanho de uma imagem que você pode colocar em um URL de dados.
Juha Syrjälä
44
Pensei em ampliar um pouco o escopo dessa pergunta, com alguns boatos úteis sobre o assunto.
Para obter a tela como uma imagem, faça o seguinte:
var canvas = document.getElementById("mycanvas");var image = canvas.toDataURL("image/png");
Você pode usar isso para escrever a imagem na página:
document.write('<img src="'+image+'"/>');
Onde "image / png" é do tipo mime (png é o único que deve ser suportado). Se você deseja uma matriz dos tipos suportados, pode fazer algo como:
var imageMimes =['image/png','image/bmp','image/gif','image/jpeg','image/tiff'];//Extend as necessary var acceptedMimes =newArray();for(i =0; i < imageMimes.length; i++){if(canvas.toDataURL(imageMimes[i]).search(imageMimes[i])>=0){
acceptedMimes[acceptedMimes.length]= imageMimes[i];}}
Você só precisa executá-lo uma vez por página - nunca deve mudar no ciclo de vida de uma página.
Se você deseja fazer o usuário baixar o arquivo como ele é salvo, você pode fazer o seguinte:
var canvas = document.getElementById("mycanvas");var image = canvas.toDataURL("image/png").replace("image/png","image/octet-stream");//Convert image to 'octet-stream' (Just a download, really)
window.location.href = image;
Se você estiver usando isso com diferentes tipos de mímica, altere as duas instâncias de image / png, mas não a imagem / octet-stream. Também vale a pena mencionar que, se você usar algum recurso entre domínios na renderização de sua tela, encontrará um erro de segurança ao tentar usar o método toDataUrl.
Com a sua solução para baixar o arquivo, devo escolher o software que quero usar, é um pouco inconveniente ... Existe uma maneira de substituir o mime como png depois de baixado?
So4ne
1
@ So4ne Acho que não, tem que ser um fluxo de imagem / octeto para solicitar ao usuário o download. Se você se livrar dessa linha, a página será redirecionada para a imagem. Eu adoraria saber se alguém sabe como fazer isso muito bem.
meiamsome 26/12/13
2
usando target = "_ blank" no link <a> e .click (), também deve funcionar para acionar o download (testado com URLs de dados FF e download = "filename" para texto / csv e texto / sem formatação)
Ax3l
Isso é ótimo. Obrigado! Mas e se eu quiser salvar no servidor e não no local? Uma entrada de arquivo de formulário aceitará o img src como algo que pode ser carregado?
Também estou no campo wkhtmltopdf. Temos usado para arquivamento e sua incrível.
Daniel Szabo
Como usar o WKHTMLtoPDF na página que exigia informações de login? Eu estou usando Jsreport para converter em PDF, mas eu capturar o meu conteúdo com HTML2Canvas, eu tenho problema com o envio a tela como parâmetro para JSreport
Outra solução interessante é o PhantomJS . É um WebKit decapitado com script em JavaScript ou CoffeeScript.
Um dos casos de uso é a captura de tela: você pode capturar programaticamente o conteúdo da Web, incluindo SVG e Canvas e / ou Criar capturas de tela de sites com visualização em miniatura.
O melhor ponto de entrada é a página wiki de captura de tela .
Aqui está um bom exemplo para o relógio polar (de RaphaelJS):
+1: O PhantomJS é um sistema simples, bem documentado e bem pensado, perfeito para este trabalho. Ele permite muito mais do que apenas pegar uma tela também - por exemplo, você pode modificar a página ou parte dela (através do JS) antes de pegar, para que ela pareça do jeito que você deseja. Perfeito!
Johndodo 18/09/2013
1
O PhantomJs agora está obsoleto #
Merc
3
Se você estiver usando jQuery, o que muitas pessoas fazem, você implementaria a resposta aceita da seguinte maneira:
var canvas = $("#mycanvas")[0];var img = canvas.toDataURL("image/png");
$("#elememt-to-write-to").html('<img src="'+img+'"/>');
A solução pura (100%) do jQuery é a seguinte: $('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());Exatamente uma linha.
Naeel Maqsudov
1
Você pode usar o jspdf para capturar uma tela em uma imagem ou pdf como este:
var imgData = canvas.toDataURL('image/png');var doc =new jsPDF('p','mm');
doc.addImage(imgData,'PNG',10,10);
doc.save('sample-file.pdf');
Essa é a outra maneira, sem strings, embora eu realmente não saiba se é mais rápido ou não. Em vez de toDataURL (como todas as perguntas aqui propõem). No meu caso, quero impedir o dataUrl / base64, pois preciso de um buffer ou exibição de matriz. Portanto, o outro método em HTMLCanvasElement é toBlob. (Função TypeScript):
exportfunction canvasToArrayBuffer(canvas:HTMLCanvasElement, mime: string):Promise<ArrayBuffer>{returnnewPromise((resolve, reject)=> canvas.toBlob(async(d)=>{if(d){const r =newFileReader();
r.addEventListener('loadend', e =>{const ab = r.result;if(ab){
resolve(ab as ArrayBuffer);}else{
reject(newError('Expected FileReader result'));}}); r.addEventListener('error', e =>{
reject(e)});
r.readAsArrayBuffer(d);}else{
reject(newError('Expected toBlob() to be defined'));}}, mime));}
Outra vantagem dos blobs é que você pode criar ObjectUrls para representar dados como arquivos, semelhante ao membro 'files' do HTMLInputFile. Mais informações:
Respostas:
Opa A resposta original foi específica para uma pergunta semelhante. Isso foi revisado:
com o valor em IMG, você pode escrevê-lo como uma nova imagem da seguinte forma:
fonte
var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);
. Odocument.write
código está criando o URL dos dados, eles criando uma string HTML e, em seguida, colocando uma cópia dessa string no DOM, o navegador precisa analisar essa string HTML, colocar outra cópia no elemento de imagem e analisá-la novamente para ativar o URL de dados nos dados da imagem e, finalmente, ele pode mostrar a imagem. Para uma imagem em tamanho de tela, é uma quantidade enorme de memória / cópia / análise. Apenas uma sugestãoO HTML5 fornece Canvas.toDataURL (mimetype), implementado no Opera, Firefox e Safari 4 beta. Entretanto, existem várias restrições de segurança (principalmente relacionadas ao desenho de conteúdo de outra origem na tela).
Portanto, você não precisa de uma biblioteca adicional.
por exemplo
Teoricamente, isso deve criar e navegar para uma imagem com um quadrado verde no meio, mas não testei.
fonte
javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
Pensei em ampliar um pouco o escopo dessa pergunta, com alguns boatos úteis sobre o assunto.
Para obter a tela como uma imagem, faça o seguinte:
Você pode usar isso para escrever a imagem na página:
Onde "image / png" é do tipo mime (png é o único que deve ser suportado). Se você deseja uma matriz dos tipos suportados, pode fazer algo como:
Você só precisa executá-lo uma vez por página - nunca deve mudar no ciclo de vida de uma página.
Se você deseja fazer o usuário baixar o arquivo como ele é salvo, você pode fazer o seguinte:
Se você estiver usando isso com diferentes tipos de mímica, altere as duas instâncias de image / png, mas não a imagem / octet-stream. Também vale a pena mencionar que, se você usar algum recurso entre domínios na renderização de sua tela, encontrará um erro de segurança ao tentar usar o método toDataUrl.
fonte
fonte
Eu usaria " wkhtmltopdf ". Apenas funciona muito bem. Ele usa o mecanismo de webkit (usado no Chrome, Safari etc.) e é muito fácil de usar:
É isso aí!
Tente
fonte
Aqui está uma ajuda se você fizer o download através de um servidor (desta forma, você pode nomear / converter / pós-processar / etc seu arquivo):
-Postar dados usando
toDataURL
-Definir os cabeçalhos
-criar imagem
-exportar imagem como JPEG
-ou como PNG transparente
fonte
Outra solução interessante é o PhantomJS . É um WebKit decapitado com script em JavaScript ou CoffeeScript.
Um dos casos de uso é a captura de tela: você pode capturar programaticamente o conteúdo da Web, incluindo SVG e Canvas e / ou Criar capturas de tela de sites com visualização em miniatura.
O melhor ponto de entrada é a página wiki de captura de tela .
Aqui está um bom exemplo para o relógio polar (de RaphaelJS):
Deseja renderizar uma página em PDF?
fonte
Se você estiver usando jQuery, o que muitas pessoas fazem, você implementaria a resposta aceita da seguinte maneira:
fonte
.toDataURL
é JS nativo.$('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());
Exatamente uma linha.Você pode usar o jspdf para capturar uma tela em uma imagem ou pdf como este:
Mais informações: https://github.com/MrRio/jsPDF
fonte
Essa é a outra maneira, sem strings, embora eu realmente não saiba se é mais rápido ou não. Em vez de toDataURL (como todas as perguntas aqui propõem). No meu caso, quero impedir o dataUrl / base64, pois preciso de um buffer ou exibição de matriz. Portanto, o outro método em HTMLCanvasElement é
toBlob
. (Função TypeScript):Outra vantagem dos blobs é que você pode criar ObjectUrls para representar dados como arquivos, semelhante ao membro 'files' do HTMLInputFile. Mais informações:
https://developer.mozilla.org/es/docs/Web/API/HTMLCanvasElement/toBlob
fonte
Em algumas versões do Chrome, você pode:
ctx.drawImage(image1, 0, 0, w, h);
fonte