4

これはある種の特定の問題ですが、私が解決策を見つけることができれば、ある時点で他の誰かにとって役立つかもしれないと思います。

ブラウザ側でHighchartsグラフの一部をPNGに変換する必要があります。作成者がグラフを作成するときに、グラフは自動的にPNGに変換され、そのPNGは指定されたグラフのJSコードとともに保存されるという考え方です。次に、JSがオプションではない状況で、そのPNGバージョンを提供できます。私はこれをすべてcanvgライブラリを介して機能させており、完璧です。

よくほとんど。そこにあるすべての高dpi画面のために、グラフが通常表示される2倍の大きさのPNGを拡大する必要があります。そうすれば、PNGバージョンはiPhone/iPadなどで見栄えがします...

canvgにはいくつかのスケーリングオプションがあるので、それらを使用しようとしました。しかし、それはそれが崩壊し始めるところです。グラフは正しくスケーリングされますが、Highchartsオブジェクトのどこかに、他のすべてと一緒にスケーリングされないボックスがあり、結果のスケーリングされたグラフは、美しくスケーリングされたグラフの左上隅だけを示します。

私はcanvgコードを見て、JSの能力が何が起こっているのかを理解するのに十分ではないことにすぐに気づきました。これは、Highchartsの終わりでも同じです。

誰かがこれに対するアイデアを持っているか、簡単な解決策を知っているなら、私は非常に感謝するでしょう。

問題を再現するために、私がまとめたこのJSFIDDLEの例を見ることができます。

http://jsfiddle.net/UVNvh/3/

そして、そのJSFIDDLEページがめちゃくちゃになったり、何らかの理由で消えたりした場合のコードは次のとおりです。

<script src="http://code.highcharts.com/highcharts.js">http://code.highcharts.com/highcharts.js</script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>
<script type="text/javascript" src="http://canvg.googlecode.com/svn/trunk/rgbcolor.js"></script> 
<script type="text/javascript" src="http://canvg.googlecode.com/svn/trunk/canvg.js"></script> 
<p>Highcharts</p>
<div id="container" style="height: 400px; margin-top: 1em"></div>
<p>Canvas</p>
<canvas id="canvas"></canvas>
<p>Image</p>
<div id="image"><div>

<script type="text/javascript">
$(function () {
    var chart = new Highcharts.Chart({

        chart: {
            renderTo: 'container'
        },

        credits: {
            enabled: false
        },

        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: {
                enabled: false
            }
        },
        exporting: {
            type: 'image/jpeg'
        }

    });

    var chart_svg = chart.getSVG();                    
    var chart_canvas = document.getElementById('canvas');

    canvg(chart_canvas, chart_svg, {scaleWidth: 1280, scaleHeight: 860});

    var chart_img = chart_canvas.toDataURL('image/png');

    jQuery('#image').append('<img src="' + chart_img + '" />');
});
</script>
4

3 に答える 3

7

私はハックなしでスコットギアハートを改善しました: )http://jsfiddle.net/marcalj/EsPud/7/

最も重要な部分:

// Get chart aspect ratio
var c_ar = chart.chartHeight / chart.chartWidth;

// Set canvas size
chart_canvas.width = 1280;
chart_canvas.height = chart_canvas.width * c_ar;

canvg(chart_canvas, chart_svg, {
    ignoreDimensions: true,
    scaleWidth: chart_canvas.width,
    scaleHeight: chart_canvas.height
});

チャート要素に固定の幅と高さを設定してください。

于 2013-11-18T13:49:42.893 に答える
5

ある種の管理ツールで作業しているようですので、グラフのサイズを変更しても問題はないかもしれません。getSVG()を呼び出す前に、chart.setSize(width、height)を使用する必要があります。

そのルートに行けない場合は、SVGテキストを直接編集することもできますが、それは私の意見ではベストプラクティスではありません。

canvgが機能する方法は、scaleWidth / scaleHeightを取得し、渡したオプションとsvgの既存の高さ/幅に基づいてsvgにtransform = "scale()"を追加することです。問題は、svgと結果の画像の既存の高さ/幅を変更しないことです。私はあなたが望むと思うことをするjsfiddleをまとめましたが、それはおそらく最良の解決策ではありません。http://jsfiddle.net/sgearhart2/EsPud/1/

var chart_svg = chart.getSVG();                    
chart_svg = chart_svg.replace('width="600"', 'width="1280"');   
chart_svg = chart_svg.replace('height="400"', 'height="860"'); 

// If i had to guess, canvg does the next part but not the prior part  
var dWidth = 1280/600, dHeight = 860/400;
chart_svg = chart_svg.replace(
    '<svg ', 
    '<svg transform="scale(' + dWidth + ' ' + dHeight + ')" '
); 
于 2013-03-26T19:48:19.843 に答える
2

今日(2016年)のように、パラメーターをgetSVG()関数に渡すことで、キャンバスに正しいサイズのグラフを使用させることができます。

例として:

var chartSVG = chart.highcharts().getSVG({
        exporting: {
            sourceHeight: chart.highcharts().chartHeight,
            sourceWidth: chart.highcharts().chartWidth,
        }
    });
于 2016-09-19T11:11:41.127 に答える