Java中的SVG圆分辨率

时间:2013-12-05 10:28:30

标签: java svg svg-salamander

我在SVG中有一个圆圈表示:

    <circle cx="50" cy="50" r="50" stroke="black" stroke-width="1" style="fill:white"/>

然后我将此圆转换为Java中的BufferedImage,宽度和高度= 100,imageType = BufferedImage.TYPE_INT_ARGB。然后我通过以下代码将此BufferedImage绘制到另一个:

    BufferedImage source = ImageIO.read(new File("imgToDrawOnto.png"));
    Graphics g = source.getGraphics();
    g.drawImage(circleImg, 100, 100, null);

其中circleImg是SVG圈的BufferedImage。这工作正常,并绘制到图像,但它出来非常像素化。有什么方法可以让我的圆圈变得更光滑吗?我更喜欢继续使用SVG,但如果SVG中没有办法,也可以考虑其他方式。

我尝试过的事情:

  1. 我已将圆的半径设置为500,并将BufferedImage的高度和宽度保持为100.
  2. 我已将BufferedImage的高度和宽度设置为1000并使用了draw方法,该方法将height和width作为参数并使它们为100。
  3. 我同时做了1和2。
  4. 我也试过让半径更大,即。 2500
  5. 我还将circleImg参数更改为circleImg.getScaledInstance(100,100,1)
  6. 没有任何效果。有些看起来更顺畅,但不是很多,有些看起来更糟。另外需要注意的是,当使用g.drawOval(150,150,100,100)时,我也观察到像素化。这让我相信问题不在于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)
    

    对于SVG我正在使用SVG-Salamander v1.0

1 个答案:

答案 0 :(得分:1)

使用ImageIO.read读取图像时,会保留图像文件的颜色模型。由于您读取了PNG文件,问题可能是源文件使用的索引颜色模型(调色板)很少,也许不匹配颜色。另一个问题可能是您必须启用消除锯齿以避免您所谓的像素化。

为避免颜色模型问题,您可能需要创建一个新的BufferedImage,例如: 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);

添加了示例图片:enter image description here