SVG2PNG(前台个后台将SVG转换为PNG,完美支持IE8下载)--amcharts导出png

  

  在项目中用到了amcharts,amcharts图标统计插件是利用SVG实现的,其自带下载png功能,但是不支持IE以下浏览器。因此研究了SVG转换为png,最终实现的效果是将amcharts生成一张png写入一个excel并提供下载。

1.SVG简介:

SVG 意为可缩放矢量图形(Scalable Vector Graphics)。说白了就是利用xml定义图形。

SVG 使用 XML 格式定义图像。

例如一个简单的圆形:

<html>
<body>
<h1>My first SVG</h1>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="100" cy="50" r="40" stroke="black"
  stroke-width="2" fill="red" />
</svg>
</body>
</html>

结果:

注意:如果将SVG的父标签去掉也是正常使用的,比如:(用浏览器打开后缀为下面后缀为SVG的文件)

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="100" cy="50" r="40" stroke="black"
  stroke-width="2" fill="red" />
</svg>

结果:

但是如果将SVG根标签的xmlns属性去掉是不会显示为图形的,比如:

<svg version="1.1">
  <circle cx="100" cy="50" r="40" stroke="black"
  stroke-width="2" fill="red" />
</svg>

总结:SVG如果正常显示为图形,需要在SVG根标签引入   xmlns="http://www.w3.org/2000/svg"

更多的关于SVG的使用参考菜鸟教程:http://www.runoob.com/svg/svg-tutorial.html

2.SVG转换为PNG

  会研究前台JS生成和后台利用batik生成png。所有用到的JS以及lib或者其他会在最后提供github连接。

2.1前台转换(不支持IE)

需要的JS:saveSvgAsPng.js   ,前台下载也比较简单。支持chrome、firefox等主流浏览器(Ie就不主流了。。。。。)

简单的测试:

<html>
    <body>
        <h1>My first SVG</h1>
        <div>
            <svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="testSvg">
                  <circle cx="100" cy="50" r="40" stroke="black"
                  stroke-width="2" fill="red" />
            </svg>
        </div>
        <button onclick="downloadSvg()">download</button>
    </body>
    <script src="saveSvgAsPng.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        function downloadSvg(){
            //下载的方法--第一个参数是SVG的顶级元素,第二个参数是文件名字
            saveSvgAsPng(document.getElementById("testSvg"), "diagram.png");
        }
    </script>
</html>

2.2后台将SVG转换为PNG

后台转换也就是将SVGCODE转换为PNG,注意SVGCODE是需要xmlns属性的,否则会转换失败:

1.依赖的jar包:(commons-io包是为了读取svgcode)

2.工程结构

3. 需要转换的SVGCODE:

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <circle cx="100" cy="50" r="40" stroke="black"
  stroke-width="2" fill="red" />
</svg>

直接浏览器打开效果:

 4.转换的代码以及测试:

package cn.qlq.svg2png;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.ImageTranscoder;
import org.apache.batik.transcoder.image.PNGTranscoder;
import org.apache.commons.io.FileUtils;

/**
 * 将svg转换为png格式的图片
 *
 *
 */
public abstract class SVG2PNGUtils {

    /**
     * 将svg字符串转换为png
     *
     * @param svgCode
     *            svg代码
     * @param pngFilePath
     *            保存的路径
     * @throws TranscoderException
     *             svg代码异常
     * @throws IOException
     *             io错误
     */
    public static void convertToPng(String svgCode, String pngFilePath) throws IOException, TranscoderException {

        File file = new File(pngFilePath);

        FileOutputStream outputStream = null;
        try {
            file.createNewFile();
            outputStream = new FileOutputStream(file);
            convertToPng(svgCode, outputStream);
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 将svgCode转换成png文件,直接输出到流中
     *
     * @param svgCode
     *            svg代码
     * @param outputStream
     *            输出流
     * @throws TranscoderException
     *             异常
     * @throws IOException
     *             io异常
     */
    public static void convertToPng(String svgCode, OutputStream outputStream) throws TranscoderException, IOException {
        try {
            byte[] bytes = svgCode.getBytes("utf-8");
            PNGTranscoder t = new PNGTranscoder();
            TranscoderInput input = new TranscoderInput(new ByteArrayInputStream(bytes));
            TranscoderOutput output = new TranscoderOutput(outputStream);
            // 增加图片的属性设置(单位是像素)---下面是写死了,实际应该是根据SVG的大小动态设置,默认宽高都是400
            t.addTranscodingHint(ImageTranscoder.KEY_WIDTH, new Float(941));
            t.addTranscodingHint(ImageTranscoder.KEY_HEIGHT, new Float(800));
            t.transcode(input, output);
            outputStream.flush();
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws IOException, TranscoderException {
        ClassLoader classLoader = SVG2PNGUtils.class.getClassLoader();
        String filePath = classLoader.getResource("cn/qlq/svg2png/svgtest.svg").getPath();
        String svgCode = FileUtils.readFileToString(new File(filePath), "UTF-8");
        convertToPng(svgCode, "e:/test.png");
    }
}

 结果会生成PNG。(再次强调SVG文件的xmlns一定要写)

至此就实现了SVG转换为PNG,在web应用中我们可以将SVGCODE传到后台处理之后生成一个PNG并提供下载,再深入一点可以将图片再写入excel中提供下载。

原文地址:https://www.cnblogs.com/qlqwjy/p/9780021.html

时间: 2024-10-13 22:58:59

SVG2PNG(前台个后台将SVG转换为PNG,完美支持IE8下载)--amcharts导出png的相关文章

前台和后台互相传递多维数组

上一篇文章介绍了前台和后台相互传递数组的方法,从客户端传一维数组到服务器可以用jquery的ajax方法直接传递.但如果传递的是多维数组呢? 此时可以借用json的stringify()方法将字符串数组转换为json数组对象传递到后台,后台再使用JSONArray对象的fromObject()方法将其转换为数组即可. 示例: JS代码: $(function(){ var array1 = new Array(); array1.push("A"); array1.push("

ajax之前台和后台数据传输

Spring中ajax数据传输 由于项目需要用ajax提交数据,而不是form提交数据.因此我需要学习ajax,这也是我在开发小组做的最后一个东西,尽管由于暑假要去东软实训,这个ajax提交也没有做完,但对于数据的在前台和后台的传递是解决了. 如何把数据通过ajax从前台传到后台,在网上查询的方法都是通过"data:"把数据传到后台,但是后台"String endTime=request.getParameter("eTime");"时间的值是空

前台向后台传值的两种方法 以及 从后台获取数据的方法

1.前台向后台传值方法一: 表单提交的方式: 1 <form action="${path }/manage/logon.do" method="post" id="logonForm"> 2 <table cellpadding="0" cellspacing="0" border="0"> 3 <tr height="50">

js前台与后台数据交互-前台调后台【转】

前台调用后台方法与变量: 方法一:通过WebService来实现 步骤: 后台 ?  首先引入命名空间(using System.Web.Services;) ?  然后定义公共的静态的方法(必须为public和static的,且静态方法不能访问外部的非静态变量,此时后台与前台相当于父类与子类的关系),并在该方法头部上加上[System.Web.Services.WebMethod],来标注方法特性. 前台 ?  添加ScriptManager服务器控件,并把其EnablePageMethods

JS 之 前台调用后台变量和方法

      在我们平时的网站开发过程中,并不是所有的网页都是后台查询出一个DataTable或者List然后绑定到DataGrid上.我们可能还会遇到前台需要后台的某一个变量,或者前台某个显示的地方需要调用一下后台的某一个查询的方法.下面我就给大家列举一个小例子: Asp.Net前台代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta ht

LigerUi-js中ajax前台调用后台Json格式转换!(已解决)

LigerUi-js中ajax前台调用后台Json格式转换!(已解决) success: function (data, status) { var aaa = JSON2.stringify(data); alert(aaa ); } LigerUi-js中ajax前台调用后台Json格式转换!(已解决),布布扣,bubuko.com

Linxu中命令的执行(前台、后台)

距离上一篇文章已经有半个月的时间了,感觉这段时间对不起自己呀.因为现在我开始学习Java了,以后有时间和大家交流一个学习经验. 今天我要分享的知识是如何建立进程.在Linux中我们应该如何进程呢,让我们好好来探究一下吧. 示例一: 这个例子就是建立了一个后台进程 [[email protected] Desktop]# ping 127.0.0.1& [1] 16885 [[email protected] Desktop]# PING 127.0.0.1 (127.0.0.1) 56(84)

WP 前台或后台显示ShellToast

using Microsoft.Phone.Shell; ShellToast toast = new ShellToast(); toast.Title = "程序标题"; toast.Content = "内容"; toast.NavigationUri = new Uri("/xxx.xaml", UriKind.Relative); toast.Show(); WP 前台或后台显示ShellToast,布布扣,bubuko.com

datatable 前台和后台数据格式

datatable是非常强大的前台表格插件,前台定义好表格格式后,后台需要返回指定格式的json数据!如下: 首先是js的定义: var oTable = $('#sample_editable_1').dataTable({ "aLengthMenu": [ [5, 15, 20, -1], [5, 15, 20, "All"] // change per page values here ], "bProcessing": true, &qu