【问题标题】:highcharts and canvg scaling issuehighcharts 和 canvg 缩放问题
【发布时间】:2013-03-26 16:19:40
【问题描述】:

这是一个特定的问题,但我想如果我能找到解决方案,它可能会在某个时候对其他人有用。

我需要在浏览器端将一些 Highcharts 图表转换为 PNG。这个想法是,当我们的作者创建一个图形时,它会自动转换为 PNG,并且 PNG 将与给定图形的 JS 代码一起保存。然后我们可以在不能选择 JS 的情况下提供该 PNG 版本。我已经通过 canvg 库完成了这一切,它非常完美。

嗯,差不多。由于存在所有高 dpi 屏幕,我们希望 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>

【问题讨论】:

    标签: highcharts scaling canvg


    【解决方案1】:

    我在没有 hack 的情况下改进了 Scott Gearhart :) 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
    });
    

    确保您在图表元素上设置了固定的宽度和高度。

    【讨论】:

      【解决方案2】:

      听起来您正在使用某种管理工具,因此更改图表的大小可能不是问题。您可能应该在调用 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 + ')" '
      ); 
      

      【讨论】:

      • 斯科特,这正是我想做的。最好的解决方案与否,它的工作原理。 :) 出于某种原因,我没有想到导致问题的 svg 对象上的显式高度/宽度。
      【解决方案3】:

      从今天(2016 年)开始,我可以通过将参数传递给 getSVG() 函数来使画布使用正确大小的图表。

      例如:

      var chartSVG = chart.highcharts().getSVG({
              exporting: {
                  sourceHeight: chart.highcharts().chartHeight,
                  sourceWidth: chart.highcharts().chartWidth,
              }
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-20
        相关资源
        最近更新 更多