Java中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,

我在SVG中有一个圆,表示为:


然后我将这个圆转换为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中没有其他方法,也可以考虑其他方法

我尝试过的事情:

  • 我已将圆的半径设置为500,并将BuffereImage的高度和宽度设置为100
  • 我已经将BuffereImage的高度和宽度设置为1000,并使用了draw方法,该方法将高度和宽度作为参数,并将它们设置为100
  • 我同时做了1和2
  • 我也尝试过使半径更大,即2500
  • 我还将circleImg参数更改为circleImg.GetScaleInstance(100100,1)
  • 什么都没起作用。有些看起来更平滑,但不是很多,而另一些看起来更糟。另外需要注意的是,我在使用g.drawOval(150150100100)时也观察到了像素化。这让我相信问题不在于SVG,但我可能错了

    Java版本:

    java version "1.6.0_30" Java SE Runtime Enviroment (build 1.6.0_30-b12) Java HotSpot 64-bit Server VM (build 20.5-b03, mixed mode) java版本“1.6.0_30” Java SE运行时环境(build 1.6.0_30-b12) Java HotSpot 64位服务器虚拟机(构建20.5-b03,混合模式)
    对于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文件,当然我不可能运行你发布的代码,即使我替换了最后一行。使用我在图像中发布的建议在缓冲区图像中绘制一个圆圈,我将其添加到了我的答案中,并且用可用的分辨率无法获得更好的结果。感谢您的帮助,结果证明我只是个白痴。圆圈被绘制到了它自己的缓冲图像上,我没有在那个图形对象上设置抗锯齿和插值。完成了,现在可以工作了。非常感谢。