0

我有一个用 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 方法将高度和宽度作为参数并将它们设为 100。
  3. 我同时做了1和2。
  4. 我也尝试过使半径更大,即。2500
  5. 我还将 circleImg 参数更改为 circleImg.getScaledInstance(100, 100, 1)

没有任何效果。有些看起来更平滑,但不是很多,有些看起来更糟。另外需要注意的是,我在使用 g.drawOval(150, 150, 100, 100) 时也观察到像素化。这让我相信问题不在于 SVG,但我可能错了。

Java版本:

    java版本“1.6.0_30”
    Java SE 运行时环境(内部版本 1.6.0_30-b12)
    Java HotSpot 64 位服务器 VM(内部版本 20.5-b03,混合模式)

对于 SVG,我使用的是 SVG-Salamander v1.0

4

1 回答 1

1

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

为避免颜色模型问题,您可能必须使用例如 ARGB 颜色模型创建一个新的 BufferedImage,您首先在其上绘制加载的图像,然后绘制 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);

添加了示例图像:在此处输入图像描述

于 2013-12-05T10:48:28.463 回答