gpt4 book ai didi

java - 为什么这个 RadialGradientPaint 绘制不正确?

转载 作者:行者123 更新时间:2023-12-01 14:17:15 31 4
gpt4 key购买 nike

我正在绘制带有径向渐变的小圆圈。结果示例(r = 10 px):

r=10

但是当我减小半径时,奇怪的事情开始发生。如果 r = 5px:

r=5

缩放以匹配 10 像素图像:

r=5,scaled

如果 r = 2px(再次缩放),情况会变得更糟:

enter image description here

如您所见,渐变中心始终偏离圆心(向下和向右)。

我用来生成上述图像的代码(SSCCE,可编译和可运行):

import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.*;
import java.awt.geom.*;

public class Test {
public static void main(String[] args) throws Exception {
float r = 2;
BufferedImage img = new BufferedImage((int) r*4, (int) r*4, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
RenderingHints rh = new RenderingHints(null);
rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
rh.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.addRenderingHints(rh);
g.setBackground(Color.WHITE);
g.clearRect(0, 0, (int) r*4, (int) r*4);
g.setPaint(new RadialGradientPaint(
r*2,r*2,r*2,
new float[] {0.1f,0.35f},
new Color[] {Color.RED, Color.GREEN}
));
g.fill(new Ellipse2D.Float(r,r,r*2,r*2));
g.dispose();
ImageIO.write(img, "png", new File("out.png"));
}
}

我尝试切换渲染提示,但结果没有改变。什么可能导致此问题?

编辑:

将 RadialGradientPaint 左上角偏移 0.5f 会产生正确的图像 (r=2):

enter image description here

“固定”代码:

g.setPaint(new RadialGradientPaint(
r*2-0.5f, r*2-0.5f, r*2,
new float[] {0.1f,0.35f},
new Color[] {Color.RED, Color.GREEN}
));

最佳答案

问题与圆的高度和宽度是偶数有关。你曾经有g.fill(new Ellipse2D.Float(r,r,r*2,r*2));作为代码的一部分。这使得圆的宽度和高度始终均匀。这会导致问题,因为计算机并不完美,并且不可能精确地在尺寸均匀的圆的中心绘制像素。为了解决这个问题,我在你画圆圈的地方添加了一个。工作代码如下:

import java.awt.image.*;
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.*;
import java.awt.geom.*;

public class Test {
public static void main(String[] args) throws Exception {
float r = 2;
BufferedImage img = new BufferedImage((int) r*4 + 1, (int) r*4 + 1, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
RenderingHints rh = new RenderingHints(null);
rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
rh.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.addRenderingHints(rh);
g.setBackground(Color.WHITE);
g.clearRect(0, 0, (int) r*4 + 1, (int) r*4 + 1);
g.setPaint(new RadialGradientPaint(
r*2,r*2,r*2,
new float[] {0.1f,0.35f},
new Color[] {Color.RED, Color.GREEN}
));
g.fill(new Ellipse2D.Float(r,r,r*2 + 1,r*2 + 1));
g.dispose();
ImageIO.write(img, "png", new File("out.png"));
}
}

关于java - 为什么这个 RadialGradientPaint 绘制不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18018461/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com