2012-01-24 17 views
20

Sto utilizzando la libreria HighCharts per generare alcuni grafici dinamici. Tuttavia, mi piacerebbe rendere l'elemento Canvas HighCharts come un'immagine PNG, in modo che l'utente possa copiare e incollare il grafico in una e-mail, ecc. Senza dover utilizzare la funzione di esportazione.Render Highcharts canvas come PNG nella pagina

In particolare, sto cercando di creare un modello di email HTML che includa il grafico e voglio che l'utente sia in grado di selezionare tutto> copia/incolla nel client di posta elettronica invece di copiare/incollare, esportare l'immagine, quindi trovare un modo per inserirlo nella e-mail.

Ho trovato questo: Capture HTML Canvas as gif/jpg/png/pdf?, ma il codice non sembra rendere un'immagine al documento.

+0

La versione recente di diagrammi elevati viene visualizzata utilizzando canvas SVG non HTML5: http://www.highcharts.com/component/content/article/2-news/12-highcharts-goes-svg – Mark

risposta

6

Ecco una soluzione lato server basata su PhantomJS. Puoi utilizzare JSONP per effettuare una chiamata interdominio a image.vida.io.

http://image.vida.io/

Il grafico/visualizzazione bisogno di essere accessibile dall'esterno. È possibile passare credenziali all'URL.

http://image.vida.io/api/https%3A%2F%2Fvida.io%2Fdocuments%2FWgBMc4zDWF7YpqXGR/viewport_width=980&viewport_height=900&delay=5000&selector=%23canvas

Quindi è possibile visualizzare l'immagine con tag img:

<img src="data:image/png;base64, [base64 data]"/> 

Funziona attraverso browser.

25

Here's a hack se si ha il coraggio di utilizzare HighCharts. Usa canvg per analizzare l'SVG in una tela e quindi converte la tela in un PNG.

chart = new Highcharts.Chart({ 
     
    chart: { 
        renderTo: 'container' 
    }, 
     
    title: { 
        text: '' 
    }, 
     
    xAxis: { 
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 
    }, 
     
    series: [{ 
        data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]         
    }], 
     
    navigation: { 
        buttonOptions: { 
            align: 'center' 
        } 
    } 
}); 

canvg(document.getElementById('canvas'), chart.getSVG()) 
     
var canvas = document.getElementById("canvas"); 
var img = canvas.toDataURL("image/png"); 

document.write('<img src="'+img+'"/>'); 
+0

Questo è fantastico; Supponendo che sarebbe troppo chiedere di farlo funzionare in POS Internet Explorer. Non renderà in Outlook (ovviamente). Grazie ancora per il vostro aiuto. –

+0

Stavo pensando che forse potrei usare un metodo un po 'schivo per salvare il file PNG risultante sul server, quindi eseguire uno script cron per accedere alla pagina, in modo che l'immagine aggiornata venga regolarmente salvata, quindi vorrei caricare una pagina diversa con l'immagine dal server. Ho trovato questo: http: // StackOverflow.it/questions/7291183/decoding-a-canvas-todataurl - ma non ci sono istruzioni su come passare il canvas.toDataURL(); restituire a una variabile PHP e salvare uno il server –

+0

sto usando angolare, durante la conversione sto ricevendo errore per favore aiuto http://stackoverflow.com/questions/19245398/how-to-convert-highchart-to-binary- image/19245522? noredirect = 1 # comment28488385_19245522 – Prashobh

10

So che questa è ormai una vecchia questione, ma dal momento che si avvicinò 1 # per me in un risultato di ricerca di Google, penso che la pena ricordare che Highcharts ora natively supports a server-side image generation script e funziona benissimo.

+0

Impressionante .... scusate la mia ingenuità, ma c'è qualche tipo di guida didattica per l'impostazione di questo? Sembra che questa sia più una spiegazione dello strumento piuttosto che una guida di installazione, ma forse mi manca qualcosa di evidente. –

+0

Sembra che non ci sia ancora una sezione nella documentazione di base. Tuttavia, ho usato la pagina che ho indicato come guida per cosa fare e l'ho trovato MOLTO facile. Tutti i componenti sono praticamente privi di configurazione e hanno funzionato come pubblicizzati fin dal primo momento. – jkraybill

+0

Se vuoi saperne di più su un how-to, ti suggerisco anche di parlare con il supporto di highcharts - sono molto reattivi. – jkraybill

6

Con le informazioni da "Render charts on the server" (da jkraybills answer), ho creato questo esempio utilizzando un minimo Ajax per ottenere un'immagine di un grafico che non è stato reso, e la visualizzazione in un img -tag.

HTML:

<img id="chart" style="width: 600px;" /> 

Javascript:

// Regular chart options 
var options = { 
    title: { 
     text: 'My chart' 
    } 
    ... 
} 

//URL to Highcharts export server 
var exportUrl = 'http://export.highcharts.com/'; 

//POST parameter for Highcharts export server 
var object = { 
    options: JSON.stringify(options), 
    type: 'image/png', 
    async: true 
}; 

//Ajax request 
$.ajax({ 
    type: 'post', 
    url: exportUrl, 
    data: object, 
    success: function (data) { 
     // Update "src" attribute with received image URL 
     $('#chart').attr('src', exportUrl + data); 
    } 
}); 

Come in this JSFiddle demonstration.

Il resto del parametro POST (width, callback ...) è in the documentation.

+0

Ciao, grazie per questa soluzione, funziona come un fascino. È possibile salvare l'immagine, che renderà nel browser direttamente al server? THX evviva – achillix

Problemi correlati