在JPanel上绘制SVG图像

时间:2013-12-18 17:02:35

标签: java swing svg

我想在我的Java应用程序中将SVG图像绘制,缩放,旋转,着色并使用alpha图层绘制到JPanel上。我怎样才能做到这一点?这些图像可能有多个重叠。

我真的不知道如何在Java中使用SVG图像所以请从一开始就解释,而不仅仅是渲染过程:)

提前致谢!

2 个答案:

答案 0 :(得分:7)

您需要将SVG图像转换为JPanel可以显示的类型 - 我假设您已经知道如何使用BufferedImage来显示,例如一个PNG,你不需要编辑SVG,只需显示它。

这里的关键是Java没有对SVG的原生支持。您必须使用像batik这样的库来加载图像并将其转换为可显示的格式。

我从http://bbgen.net/blog/2011/06/java-svg-to-bufferedimage/

那里偷了这个答案

编写一个简单的代码转换器

class BufferedImageTranscoder extends ImageTranscoder
{
  @Override
  public BufferedImage createImage(int w, int h)
  {
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    return bi;
  }

  @Override
  public void writeImage(BufferedImage img, TranscoderOutput output)
  {
    this.img = img;
  }

  public BufferedImage getBufferedImage()
  {
    return img;
  }
  private BufferedImage img = null;
}

使用代码转换器

public static BufferedImage loadImage(File svgFile, float width, float height)
  {
    BufferedImageTranscoder imageTranscoder = new BufferedImageTranscoder();

    imageTranscoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, width);
    imageTranscoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, height);

    TranscoderInput input = new TranscoderInput(svgFile);
    imageTranscoder.transcode(input, null);

    return imageTranscoder.getBufferedImage();
  }

然后,只需在JPanel上显示呈现的BufferedImage,就像它是PNG一样。

答案 1 :(得分:7)

使用Batik(http://xmlgraphics.apache.org/batik/)或SVGSalamander(https://svgsalamander.java.net/)。我以前成功使用了蜡染,但我还没有尝试过SVGSalamander。

在蜡染中,有一个SVG面板可以为您显示图像,并添加键盘/鼠标快捷键以进行缩放,平移和旋转图像。但是,您可以禁用这些快捷方式并实现自己的机制。

此外,通过一些工作,您可以重叠图像。

请务必阅读常见问题解答。