我正在开发一个展示放射线照相的示例应用,用户必须能够通过点击它来标记兴趣点(以及放置牙齿和绘制折线)。
该方法包括将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);
}
}
我怀疑图像查看器代码存在问题,因为它很简单,但如果要求我可以发布它,我只是不想让它更长。
提前致谢。 安东尼奥。