使用svg(1)-画一张星空背景图

github网址:github.com/xuhuihui/sv…

<!DOCTYPE html><html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    html, body {
      margin: 0;
      padding: 0;
      width: 100%;
      height: 100%;
      background: #001122;
      line-height: 0;
      font-size: 0;
    }
  </style>
</head>
<body>
  <svg width="100%" height="100%" viewBox="-400 -300 800 600" 
      preserveAspectRatio="xMidYMid slice">
    <!-- 星星 -->
    <defs>
      <polygon id="star" points="0 -10 2 -2 10 0 2 2 0 10 -2 2 -10 0 -2 -2" fill="white">
      </polygon>
    </defs>
    <!-- 湖面部分 -->
    <g id="real">
      <!-- 星星背景 -->
      <g id="star-group" width="100%" height="80%"></g>
      <!-- 月亮部分 -->
      <g id="moon-group">
        <!-- 创建蒙版,显示月牙部分 -->
        <mask id="moon-mask">
          <circle cx="-250" cy="-150" r="100" fill="white"></circle>
          <circle cx="-200" cy="-200" r="100" fill="black"></circle>
        </mask>
        <!-- 月亮 -->
        <circle cx="-250" cy="-150" r="100" fill="yellow" mask="url(#moon-mask)"></circle>      </g>      <!-- 灯塔部分 -->      <g id="light-tower" transform="translate(250,0)">        <defs>          <!-- 灯塔的颜色,线性渐变 -->          <linearGradient id="tower" x1="0" y1="0" x2="1" y2="0">            <stop offset="0" stop-color="#999"></stop>            <stop offset="1" stop-color="#333"></stop>          </linearGradient>          <!-- 灯光的颜色,径向渐变 -->          <radialGradient id="light" cx="0.5" cy="0.5" r="0.5">            <stop offset="0" stop-color="rgba(255,255,255,.8)"></stop>            <stop offset="1" stop-color="rgba(255,255,255,0)"></stop>          </radialGradient>          <!-- 光圈三角形路径 -->          <clipPath id="light-clip">            <polygon points="0 0 -400 -15 -400 15" fill="rgba(255,0,0,.5)">              <animateTransform attributeName="transform" attributeType="XML" 
              type="rotate" from="0" to="360" dur="10s" 
              repeatCount="indefinite"></animateTransform> 
           </polygon>
            <!-- 灯光发射点 -->
            <circle cx="0" cy="0" r="2"></circle>
          </clipPath>
        </defs>
        <!-- 灯塔 -->
        <polygon points="0 0 5 50 -5 50" fill="url(#tower)"></polygon>
        <!-- 灯光 -->
        <ellipse cx="0" cy="0" rx="300" ry="100" fill="url(#light)" 
        clip-path="url(#light-clip)"></ellipse>
      </g>
    </g>
    <!-- 绘制反射,倒影部分 -->
    <g id="reflact" transform="translate(0,50)" mask="url(#fading)">
      <defs>
        <!-- 倒影的颜色,线性渐变 -->
        <linearGradient id="fade" x1="0" y1="0" x2="0" y2="1">
          <stop offset="0" stop-color="rgba(255,255,255,0.3)"></stop>
          <stop offset="0.5" stop-color="rgba(255,255,255,0)"></stop>
        </linearGradient>
        <mask id="fading">
          <!-- 倒影 -->
          <rect x="-400" y="0" width="800" height="300" fill="url(#fade)"></rect>
        </mask>
      </defs>
      <use xlink:href="#real" transform="scale(1,-1) translate(0,-50)"></use>
      <line x1="-400" y1="0" x2="400" y2="0" stroke="white"></line>
    </g>
  </svg>
  <script>
    var SVG_NS = 'http://www.w3.org/2000/svg';
    var XLINK_NS = 'http://www.w3.org/1999/xlink';
    var paper = document.querySelector('svg');
    renderStar();    // 创建引用的use标签
    function use(origin) {
      var _use = document.createElementNS(SVG_NS, 'use');
      _use.setAttributeNS(XLINK_NS, 'xlink:href', '#' + origin.id);
      return _use;
    }
    // 产生最大值最小值之间的随机数随机数
    function random(min, max) {
      return min + (max - min) * Math.random();
    }
    function renderStar() {
      var starRef = document.getElementById('star');
      // console.log(starRef)
      var starGroup = document.getElementById('star-group');
      var starCount = 500;
      var star;
      while (starCount--) {
        star = use(starRef);
        //改变透明度,位置和大小
        star.setAttribute('opacity', random(0.1, 0.4));
        star.setAttribute('transform', 
         'translate(' + random(-400, 400) + ',' + random(-300, 300) + ')'
          + 'scale(' + random(0.1, 0.6) + ')');
        starGroup.appendChild(star); //添加星星
      }
    }
  </script>
</body>
</html>
复制代码


转载于:https://juejin.im/post/5aa78cd35188255574595f05

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用JPanel作为容器,在JPanel中使用JLabel来显示SVG像。首先,使用Apache Batik库将SVG像转换为BufferedImage,然后将BufferedImage设置为JLabel的像,最后将JLabel添加到JPanel中。以下是一个简单的示例代码: ```java import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.TranscodingHints; import org.apache.batik.transcoder.image.ImageTranscoder; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.svg.SVGDocument; import org.w3c.dom.svg.SVGRect; public class SVGBackgroundPanel extends JPanel { private BufferedImage image; public SVGBackgroundPanel(String svgFilePath) { try { File file = new File(svgFilePath); SVGDocument svgDocument = (SVGDocument) org.apache.batik.dom.svg.SVGDOMImplementation .getDOMImplementation().createDocument(SVGConstants.SVG_NAMESPACE_URI, "svg", null); TranscodingHints transcodingHints = new TranscodingHints(); transcodingHints.put(ImageTranscoder.KEY_WIDTH, (float) getWidth()); transcodingHints.put(ImageTranscoder.KEY_HEIGHT, (float) getHeight()); TranscoderInput transcoderInput = new TranscoderInput(file.toURI().toString()); ImageTranscoder imageTranscoder = new ImageTranscoder() { @Override public BufferedImage createImage(int width, int height) { return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); } @Override public void writeImage(BufferedImage img, TranscoderOutput output) throws TranscoderException { image = img; } }; imageTranscoder.setTranscodingHints(transcodingHints); imageTranscoder.transcode(transcoderInput, null); } catch (Exception e) { e.printStackTrace(); } } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (image != null) { g.drawImage(image, 0, 0, null); } } @Override public Dimension getPreferredSize() { if (image != null) { return new Dimension(image.getWidth(), image.getHeight()); } return super.getPreferredSize(); } public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new SVGBackgroundPanel("path/to/your/svg/file.svg"); frame.add(panel); frame.pack(); frame.setVisible(true); } } ``` 在上面的代码中,我们使用了Apache Batik库中的ImageTranscoder类来将SVG文件转换为BufferedImage。在构造函数中,我们加载SVG文件并将其转换为BufferedImage,然后在paintComponent()方法中将其绘制在JPanel上。我们还覆盖了getPreferredSize()方法来确保JPanel的大小与像的大小相同。最后,在main()方法中,我们创建了一个JFrame,并将SVGBackgroundPanel添加到其中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值