这是一种特定的问题,但我想如果我能找到解决方案,它可能会在某个时候对其他人有用。
我需要在浏览器端将一些Highcharts图形转换为PNG。我们的想法是,当我们的作者创建一个图形时,它将自动转换为PNG,并且PNG将与给定图形的JS代码一起保存。然后,我们可以在JS不能选择的情况下提供PNG版本。我已经通过canvg库完成了所有的工作,它非常完美。
嗯,差不多吧。由于所有的高dpi屏幕,我们希望PNG放大到正常图形显示的两倍。这样一来,PNG版本在iPhone/iPad等设备上的效果就更好了。
canvg有一些缩放选项,所以我尝试使用这些选项。但这就是它开始崩溃的地方。图的缩放是正确的,但是在Highcharts对象中的某个地方有一个框,它没有与其他所有对象一起缩放,结果缩放后的图只显示了缩放得漂亮的图的左上角。
我看了canvg代码,很快意识到我的JS能力还不够好,不足以弄清楚发生了什么,高端图表也是如此。
如果有人对此有想法或知道一个简单的解决方案,我将非常感激。
为了重复这个问题,你可以看看我放在一起的这个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>发布于 2013-03-27 03:48:20
这听起来像是在使用某种管理工具,因此更改图表的大小可能不是问题。在调用getSVG()之前,您可能应该使用chart.setSize(宽度,高度)。
如果你不能走那条路,你也可以直接编辑SVG文本,但在我看来这不是最好的做法。
似乎canvg的工作方式是,它接受scaleWidth/scaleHeight,并根据您传递的选项和svg的现有高度/宽度向svg添加一个缩放“transform=()”。问题是它不会改变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-11-18 21:49:43
我在没有黑客的情况下改进了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
});请确保在图表元素上设置固定的宽度和高度。
发布于 2016-09-19 19:11:41
就像今天(2016年)一样,我可以通过将参数传递到getSVG()函数来使canvas使用正确大小的图表。
举个例子:
var chartSVG = chart.highcharts().getSVG({
exporting: {
sourceHeight: chart.highcharts().chartHeight,
sourceWidth: chart.highcharts().chartWidth,
}
});https://stackoverflow.com/questions/15642145
复制相似问题