gpt4 book ai didi

highcharts 和 canvg 缩放问题

转载 作者:行者123 更新时间:2023-12-04 21:58:14 86 4
gpt4 key购买 nike

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

我需要在浏览器端将我的一些 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>

最佳答案

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

关于highcharts 和 canvg 缩放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15642145/

86 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com