Java Graphics无法渲染SVG(SVG Salamander和BufferedImage)

时间:2016-11-03 11:09:04

标签: java svg graphics bufferedimage

我正在开发一个展示放射线照相的示例应用,用户必须能够通过点击它来标记兴趣点(以及放置牙齿和绘制折线)。

该方法包括将SVG文件与图像相关联,该文件具有简单的结构:每条线定义一个点,因此当打开图像时,我们将原始图像和SVG渲染的组合放在一个帧上使用Graphics中的drawGraphics方法到BufferedImage。

该框架有一个mouseListener,它在SVG文件中添加一条线,点击的像素上有一个点。然后它将顶部更新的SVG重新渲染原始图像。问题是,这在首次加载图像时工作正常,但在单击时不会更新,在应用程序关闭然后再打开之前它不显示任何新点(SVG文件确实已更新,如上所示文本编辑器。)

我尝试在图像查看器上调用invalidate并重新绘制,但它不起作用。

动态非常简单:加载图像文件,然后使用drawImages方法在顶部渲染相关文件。完成所有这些操作后,最终结果将放在框架中。我使用SVG Salamander库进行渲染,因为它非常简单。 Batik看起来更完整但也更复杂。

public class Test {

    Graphics g;
    ImageViewer v;
    BufferedImage imagenbase;
    ArrayList<BufferedImage> images;
    String basename;

    int count = 0;

    SVGUniverse universe;
    SVGDiagram diagram = null;

    public Test() {
        v = new ImageViewer(1200, 1200, 1.0, this);
        universe = new SVGUniverse();
    }

    public void drawSVGdot(int x, int y) {
        File file = new File(basename + "extra.svg");
        if (file.exists()) {
            try {
                List<String> lines;
                Path path = file.toPath();
                lines = Files.readAllLines(path, StandardCharsets.UTF_8);
                String extra = "    <circle cx=\"" + x + "\" cy=\"" + y + "\" r=\"1\" style=\"fill:red;stroke:red\"/>";
                lines.add(1, extra);
                Files.write(path, lines, StandardCharsets.UTF_8);
            } catch (IOException e) {
            }

        } else {
            try {
                file.createNewFile();
                StringBuilder sb = new StringBuilder("");
                int h = v.getHeight();
                int w = v.getWidth();
                sb.append("<svg width=\"" + w + "\" height=\"" + h + "\" style=\"fill:none;stroke-width:4\">");
                sb.append("\n");
                sb.append("    <circle cx=\"" + x + "\" cy=\"" + y + "\" r=\"1\" style=\"fill:red;stroke:red\"/>");
                sb.append("\n");
                sb.append("</svg>");
                BufferedWriter writer = null;
                try {
                    writer = new BufferedWriter(new FileWriter(file));
                    writer.append(sb);
                } catch (IOException e) {
                } finally {
                    if (writer != null)
                        try {
                            writer.close();
                        } catch (IOException e) {
                        }
                }
            } catch (IOException e) {
            }
        }

        loadRelatedImages(basename);
    }

    public void loadImage(String uri, String uriless) {
        try {
            basename = uriless;
            imagenbase = ImageIO.read(new File(uri));
            g = imagenbase.getGraphics();
            v.setVisible(true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void loadRelatedImages(String uri) {
        BufferedImage[] imgs = new BufferedImage[5];
        for (int i = 1; i <= 4; i++) {
            File file = new File(uri + i + ".svg");
            if (file.exists())
                imgs[i - 1] = SVGtoImage(file);
        }
        File file = new File(uri + "extra.svg");
        if (file.exists())
            imgs[4] = SVGtoImage(file);

        BufferedImage imagenfinal = new BufferedImage(imagenbase.getWidth(), imagenbase.getHeight(),
                BufferedImage.TYPE_INT_ARGB);
        g = imagenfinal.getGraphics();
        g.drawImage(imagenbase, 0, 0, null);
        for (int i = 0; i < imgs.length; i++) {
            if (imgs[i] != null) {
                g.drawImage(imgs[i], 0, 0, null);
            }
        }
        v.setImage(imagenfinal);
        v.invalidate();
        v.repaint();
        v.setVisible(true);
    }

    public BufferedImage SVGtoImage(File f) {
        BufferedImage bi = new BufferedImage(v.getHeight(), v.getWidth(), BufferedImage.TYPE_INT_ARGB);
        try {
            universe.loadSVG(f.toURI().toURL());
            URI xmlBase = f.toURI();
            diagram = universe.getDiagram(xmlBase);
            Graphics2D g = (Graphics2D) bi.getGraphics();
            diagram.render(g);
        } catch (MalformedURLException e) {
        } catch (SVGException e) {
        }
        return bi;
    }

    public static void main(String[] args) {

        Test t = new Test();

        String imagename = "7.jpg";
        String withoutext = imagename.substring(0, imagename.lastIndexOf('.'));

        t.loadImage(imagename, withoutext);
        t.loadRelatedImages(withoutext);

    }
}

我怀疑图像查看器代码存在问题,因为它很简单,但如果要求我可以发布它,我只是不想让它更长。

提前致谢。 安东尼奥。

0 个答案:

没有答案