【问题标题】:height,width and font not consistent when converting svg to png将svg转换为png时,高度、宽度和字体不一致
【发布时间】:2016-07-06 17:40:46
【问题描述】:

我正在尝试将 svg 转换为 png,我发现转换后的图像与 svg 不同。如何保证 svg 和 png 之间的一致性?

将 svg 转换为 png 的代码

    jQuery('#imgDiv').css({display: 'block', 'padding-left': '25px', overflow: 'scroll'});
    jQuery('#resImg').css({display: 'block', 'padding-left': '25px'});
    var svg = jQuery('#map').html().replace(/>\s+/g, ">").replace(/\s+</g, "<");
    // strips off all spaces between tags

    canvg('cvs', svg, {
        ignoreMouse: true,
        ignoreAnimation: true
    });
    var canvas = document.getElementById('cvs');

    img = canvas.toDataURL("image/png", 1);
    var a = document.createElement('a');
    a.href = img;
    a.download = "image.png";
    var clickEvent = new MouseEvent("click", {
        "view": window,
        "bubbles": true,
        "cancelable": false
    });
    a.dispatchEvent(clickEvent)

一切都是文件,但是当我看到下载的图像时,高度、宽度不同,标签和字体不可见。

生成 svg 的代码:

var width = 1260,
        height = 910;
var svg = d3.select("#map")
            .append("svg")
            .attr("width", width)
            .attr("height", height)
            .on("contextmenu", function (d, i) {
                d3.event.preventDefault();
                printMap();
            });

    svg.append("rect")
            .attr("x", 0)
            .attr("y", 0)
            .attr("width", width)
            .attr("height", height)
            .style("stroke", '#000000')
            .style("stroke-opacity", 1)
            .style("fill", "#FFF")
            .style("fill-opacity", 0)
            .style("stroke-width", 2);

var cluster = topojson.feature(data, data.objects.clustergeojson).features;
        var projection = d3.geo.mercator();
        s = 250;

        projection.scale(8500)
                .center([83, 29.5]);

        var path = d3.geo.path().projection(projection);

        var b = path.bounds(cluster),
                s = .95 / Math.max((b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height),
                t = [(width - s * (b[1][0] + b[0][0])) / 2, (height - s * (b[1][1] + b[0][1])) / 2];

实际 SVG:

转换后的 PNG:

这里是示例jsFiddle

var projection = d3.geo.mercator()
  .scale(5000)
  .center([83.96, 28.27]);

如果我将比例从 5000 更改为 6000,则 svg 会更大,但 png 不会。小提琴输出的svg可以右键导出为png。

【问题讨论】:

  • 我自己没用多久。不确定您的问题是什么,但不确定您是否知道,CSS 样式只有在它是内联时才有效。如果你给某个东西一个类并在 CSS 中设置该类的样式,它将不起作用,例如,宽度高度字体大小等。话虽如此,我知道这条线会出现在生成的画布中:''.style ("fill", "#FFF")'' 在 D3 中,但我不确定这一行:''jQuery('#imgDiv').css({display: 'block', 'padding-left': '25px ', overflow: 'scroll'});@@ 因为我没有使用 JQuery,我可能错了。如果可以的话,把你的问题简单地摆弄一下,我会看看
  • @thisOneGuy 我发现问题在于 d3 比例,这使得 svg 更大,但 png 导出的尺寸很小。这是小提琴jsfiddle.net/bnLoq1Lw/6。您可以尝试使用 var projection = d3.geo.mercator() .scale(5000) .center([83.96, 28.27]);从 5000->6000 并右键单击 svg。

标签: canvas d3.js svg png canvg


【解决方案1】:

这是我玩过的小提琴:https://jsfiddle.net/thatoneguy/bnLoq1Lw/9/

我已经调整了你的,所以你不必滚动查看整个 svg。还补充道:

  • 不是右击,而是左击事件。

  • 点击时,保存到文件,但也保存到output div,这样您就可以立即在屏幕上看到输出。

  • 添加了内联样式,因此样式会出现在生成的输出中。

内联样式:

.style('stroke','red')
.style('fill','green')

现在,当您更改比例时,一切似乎都正常吗?和以前一样,我什至什么都看不见。

看看我展示的小提琴,让我知道它是否适合你

【讨论】:

  • 我找不到零钱?你翻译 svg 了吗?
  • 抱歉忘了说我翻译它只是为了让它到中心:.attr('transform', 'translate('+(-width/2)+',0)'); // svg 的中心,小提琴的第 31 行。这解决了你的问题吗?
  • 我找不到零钱。我尝试改变高度和长度,但图像仍然被裁剪并且质量相同。 jsfiddle.net/bnLoq1Lw/11我想知道主要问题是什么。
  • @kinkajou 工作正常。如果您转到图像位置,右键单击文件并转到属性,您将看到尺寸与 SVG 相同:1500 x 650
  • 我已经接受了答案。我会尝试研究 hidpi !
猜你喜欢
  • 2019-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2018-02-26
  • 2016-01-15
  • 2013-08-20
  • 2010-12-16
相关资源
最近更新 更多