svg生成方案分析

svg生成方案分析


--》方案一:利用batik
package com.test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.apache.batik.svggen.SVGGraphics2D;
import org.apache.batik.svggen.SVGGraphics2DIOException;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class BatikTest {

private Document doc;
private String svgNS;

public BatikTest(){
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
doc = impl.createDocument(svgNS, "svg", null);
}

//创建 svg 根节点
public Element getSvgRoot(){
Element svgRoot = doc.getDocumentElement();
svgRoot.setAttributeNS(null, "width", "400");
svgRoot.setAttributeNS(null, "height", "450");
//加入自定义属性
// svgRoot.setAttributeNS(null,"desc", "xx电厂");
svgRoot.setAttributeNS(null,"desc", "xx哈哈");
return svgRoot;
}

public Element buildNode(String nodeName){
Element e = doc.createElementNS(svgNS, nodeName);
return e;
}

public Element buildNode(String nodeName,String atrrName,String atrrValue){
Element e = doc.createElementNS(svgNS, nodeName);
e.setAttribute(atrrName, atrrValue);
return e;
}

public Element buildNode(String nodeName, Map<String,String> attrMap){
Element e = doc.createElementNS(svgNS, nodeName);

if(attrMap != null && attrMap.size()>0){
Set<String> key = attrMap.keySet();
for(Iterator it = key.iterator(); it.hasNext();){
String atrrName = (String) it.next();
String atrrValue = attrMap.get(atrrName);
e.setAttribute(atrrName, atrrValue);
}
}
return e;
}

public static void main(String[] args) throws IOException {
BatikTest bt = new BatikTest();
// Get the root element (the 'svg' element).
Element svgRoot = bt.getSvgRoot();

Element defs = bt.buildNode("defs",null);
//style
Element style = bt.buildNode("style", "type","text/css");
defs.appendChild(style);

Element g_head_Layer = bt.buildNode("g","id","Head_Layer");
Map<String,String> rectAtrrMap = new HashMap<String, String>();
rectAtrrMap.put("x", "10");
rectAtrrMap.put("y", "20");
rectAtrrMap.put("width", "100");
rectAtrrMap.put("height", "200");
rectAtrrMap.put("fill", "red");
Element rectangle = bt.buildNode("rect", rectAtrrMap);

g_head_Layer.appendChild(rectangle);

svgRoot.appendChild(defs);
svgRoot.appendChild(g_head_Layer);



SVGGraphics2D g = new SVGGraphics2D(bt.doc);
try {
FileOutputStream fos = new FileOutputStream("E:\\workspace\\batikTest\\xx.svg");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
g.stream(svgRoot,osw);
// g.stream(svgRoot,new OutputStreamWriter(new FileWriter("E:\\workspace\\batikTest\\xx.svg"),"utf-8"));
} catch (SVGGraphics2DIOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println(doc.getXmlVersion());
}

}


生成的svg
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg contentScriptType="text/ecmascript" width="400" xmlns:xlink="http://www.w3.org/1999/xlink" zoomAndPan="magnify" contentStyleType="text/css" desc="xx哈哈" height="450" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" version="1.0"
><defs
><style type="text/css" xml:space="preserve"
/></defs
><g id="Head_Layer"
><rect x="10" fill="red" width="100" y="20" height="200"
/></g
></svg
>

--》方案二:利用svg.js类库
对svg.js类库测试的一个例子
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script type="text/javascript" src="./js/svg.js"></script>
<script type="text/javascript" src="./js/jquery.js"></script>
<script type="text/javascript">
function loadHandler() {
var draw = SVG('canvas').size(300, 300);
// var rect = draw.rect(100, 100).attr({ fill:'#f06' });
// var ellipse = draw.ellipse(200, 100);
// var circle = draw.circle(100);
// var line = draw.line(0, 0, 100, 150).stroke({ width: 1 })
// var polyline = draw.polyline('0,0 100,50 50,100').fill('none').stroke({ width: 1 })
// var polygon = draw.polygon('0,0 100,50 50,100').fill('none').stroke({ width: 1 })
// var path = draw.path('M10,20L30,40')
// var image = draw.image('img/0.png', 200, 200).move(100, 100);
// var text = draw.text("Lorem\n ipsum dolor sit amet consectetur.\nCras sodales imperdiet auctor.");
/*
var text = draw.text(function(add) {
add.tspan('Lorem ipsum dolor sit amet ').newLine()
add.tspan('consectetur').fill('#f06')
add.tspan('.')
add.tspan('Cras sodales imperdiet auctor.').newLine().dx(20)
add.tspan('Nunc ultrices lectus at erat').newLine()
add.tspan('dictum pharetra elementum ante').newLine()
})
*/
/*
var text = draw.text(function(add) {
add.tspan('We go ')
add.tspan('up').fill('#f09').dy(-40)
add.tspan(', then we go down, then up again').dy(40)
})
text.path('M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100')
.font({ size: 42.5, family: 'Verdana' });
*/
/*
var rect = draw.rect(100, 100).fill('#f09')
var use = draw.use(rect).move(200, 200)
*/

/*
var draw = SVG('canvas')
var group = draw.group().attr('class', 'my-group')
var rect = group.rect(100,100).attr('class', 'my-element')
var circle = group.circle(100).attr('class', 'my-element').move(100, 100)

var elements = $('#canvas g.my-group .my-element').each(function() {
this.instance.animate().fill('#f09')
})
*/

/*
var rect = draw.rect(100, 100);
rect.attr({
fill: '#f06'
, 'fill-opacity': 0.5
, stroke: '#000'
, 'stroke-width': 10
})
*/

/*
var rect = draw.rect(100, 100);
rect.attr('transform', 'translate(200,200) scale(1,2) rotate(45,0,0)')
*/

/*
var rect = draw.rect(100, 100);
rect.style('cursor:pointer;fill:#f03;')
*/


var rect = draw.rect(100, 100);


// rect.fill({ color: '#f06', opacity: 0.6 })
// rect.stroke({ color: '#f06', opacity: 0.6, width: 5 })
// rect.opacity(0.5);
// rect.skew(0, 45)
/*
var ellipse = draw.ellipse(80, 40).move(10, 10).fill({ color: '#fff' })
rect.maskWith(ellipse)
*/
/*
var rect2 = draw.rect(200, 200);
rect2.style('cursor:pointer;fill:#f03;')
rect.front();
*/

/*
var group = draw.group()
group.add(rect);
*/

/*
// create some elements
var circle = draw.circle(100).move(100,100).fill('#f09')
// create a set and add the elements
var set = draw.set()
set.add(rect).add(circle)
set.fill('#ff0')

set.each(function(i) {
this.attr('id', 'shiny_new_id_' + i)
})
*/

/*
rect.click(function() {
this.fill({ color: '#f06' })
alert("ok?");
})
*/

/*
rect.data('key', { value: { data: 0.3 }})
console.log(rect.data('key'));
*/


}
</script>
</head>
<body onload="loadHandler()">
<div id="canvas"/>
</body>
</html>

--》总结:
svg生成关键是看从什么源生成,如果源是java的原始图形生成svg,最好用batik实现,因为有大量的方法是直接利用java的原始图型生成,否则的话基本可以用dom操作进行svg生成。svg.js也可以作为一个生成方案,但最好是从外部生成svg文件,利用svg.js进行操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值