在JPanel上绘制SVG图像

Joc*_*ers 7 java swing svg

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

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

提前致谢!

Pau*_*mer 8

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

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

我从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;
}
Run Code Online (Sandbox Code Playgroud)

使用转码器

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();
  }
Run Code Online (Sandbox Code Playgroud)

然后,只需BufferedImage在JPanel上显示渲染,就像它是PNG或其他任何东西一样.

  • 这违背了使用 SVG 图形的目的。您会失去图像的平滑缩放。 (4认同)

Dod*_*10x 6

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

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

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

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