Java中SVG圆的解析
我在SVG中有一个圆,表示为:Java中SVG圆的解析,java,svg,svg-salamander,Java,Svg,Svg Salamander,我在SVG中有一个圆,表示为: 然后我将这个圆转换为Java中的BuffereImage,宽度和高度为100,imageType为BuffereImage.TYPE_INT_ARGB。然后,我通过以下代码将此BuffereImage绘制到另一个BuffereImage上: buffereImage source=ImageIO.read(新文件(“imgtodrawton.png”); Graphics g=source.getGraphics(); g、 drawImage(圆圈,100,
然后我将这个圆转换为Java中的BuffereImage,宽度和高度为100,imageType为BuffereImage.TYPE_INT_ARGB。然后,我通过以下代码将此BuffereImage绘制到另一个BuffereImage上:
buffereImage source=ImageIO.read(新文件(“imgtodrawton.png”);
Graphics g=source.getGraphics();
g、 drawImage(圆圈,100,100,空);
其中circleImg是SVG圆的BuffereImage。这可以很好地工作,并绘制到图像上,但结果是非常像素化的。有什么办法可以让我得到一个更平滑的圆吗?我更愿意继续使用SVG,但如果SVG中没有其他方法,也可以考虑其他方法
我尝试过的事情:
对于SVG,我使用的是SVG Salamander v1.0当您使用
ImageIO.read
读取图像时,图像文件的颜色模型将保留。由于您读取了PNG文件,问题可能是源文件使用的是索引颜色模型(调色板),颜色很少,而且可能不匹配。另一个问题可能是必须启用抗锯齿以避免所谓的像素化
为避免颜色模型问题,您可能必须创建一个新的BuffereImage,例如ARGB颜色模型,首先在其上绘制加载的图像,然后绘制SVG图形:
BufferedImage source = ImageIO.read(new File("imgToDrawOnto.png"));
BufferedImage newImage = new BufferedImage(
source.getWidth(),
source.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D)newImage.getGraphics();
g.drawImage(source, 0, 0, null);
g.drawImage(circleImg, 100, 100, null);
要启用抗锯齿,可以在绘制其他图像之前在Graphics2D
对象上设置适当的渲染提示:
g.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
(可选)还可以通过启用双线性或双三次插值来提高抗锯齿质量:
g.setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
g.setRenderingHint(
RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
添加示例图像:尝试将源图像绘制到新的BuffereImage上,不起作用。尝试使用两种类型的插值消除混叠,不起作用。还同时尝试了两种建议,但仍然没有成功。在这种情况下,您可能必须更清楚自己实际在做什么。发布一个完整的示例来重现您的行为,并清楚地说明您的实际期望。很遗憾,我无法发布一个完整的代码示例,因为我的公司不允许这样做,但是如果你用g.drawOval替换我发布的3行中的g.drawImage,你会看到相同的像素。我只想让圆更平滑。因为我没有你正在阅读的PNG文件,当然我不可能运行你发布的代码,即使我替换了最后一行。使用我在图像中发布的建议在缓冲区图像中绘制一个圆圈,我将其添加到了我的答案中,并且用可用的分辨率无法获得更好的结果。感谢您的帮助,结果证明我只是个白痴。圆圈被绘制到了它自己的缓冲图像上,我没有在那个图形对象上设置抗锯齿和插值。完成了,现在可以工作了。非常感谢。