我在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中没有办法,也可以考虑其他方式。
我尝试过的事情:
没有任何效果。有些看起来更顺畅,但不是很多,有些看起来更糟。另外需要注意的是,当使用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
答案 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);
添加了示例图片: