- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解 JavaFX Canvas setStroke 方法的工作原理。它不会将像素的颜色设置为所需的值。不过 setFill 方法没有问题。
Canvas canvas = new Canvas(500, 500);
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setFill(Color.RED);
gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
int x = 10;
int y = 10;
printPixelRGB(x, y); // displays: red=255, green=0, blue=0 -> OK
// scenario 1: using fill-methods
gc.setStroke(Color.WHITE);
gc.strokeRect(x, y, 200, 200);
printPixelRGB(x, y); // displays: red=255, green=191, blue=191 -> ????
// scenario 2: using stroke-methods
gc.setFill(Color.WHITE);
gc.fillRect(x, y, 200, 200);
printPixelRGB(x, y); // displays: red=255, green=255, blue=255 -> OK
private void printPixelRGB(int x, int y) {
WritableImage snap = gc.getCanvas().snapshot(null, null);
int color = snap.getPixelReader().getArgb(x, y);
int red = (color >> 16) & 0xff;
int green = (color >> 8) & 0xff;
int blue = color & 0xff;
System.out.printf("red=%-3d, green=%-3d, blue=%-3d \n", red, green, blue);
} // printPixelRGB()
场景 2 的结果符合预期。另一方面,场景 1 的结果非常奇怪:像素不是完全白色!怎么会这样?
我该如何解决这个问题?
谢谢
最佳答案
这就是抗锯齿的效果。
像素未 100% 被线条覆盖。因此,结果颜色是在绘制操作之前的像素颜色和描边颜色之间插值的。
下面的代码可以让你观察效果:
@Override
public void start(Stage primaryStage) {
Canvas canvas = new Canvas(800, 300);
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setFill(Color.RED);
gc.fillRect(0, 0, 800, 300);
gc.setStroke(Color.WHITE);
final double dx = 0;
for (double x = 10, s = 1; x < (800 - 40); s++, x += 50) {
gc.setLineWidth(s);
gc.strokeLine(x + dx, 0, x + dx, 300);
}
WritableImage snap = canvas.snapshot(null, null);
PixelReader reader = snap.getPixelReader();
for (int x = 10; x < (800 - 40); x += 50) {
Color color = reader.getColor(x, 150);
System.out.printf("red=%-3d, green=%-3d, blue=%-3d\n", (int) (color.getRed() * 0xFF),
(int) (color.getGreen() * 0xFF), (int) (color.getBlue() * 0xFF));
}
primaryStage.setScene(new Scene(new StackPane(canvas)));
primaryStage.show();
}
绘制的第一条线覆盖了 [10-lineWidth/2, 10+lineWidth/2] = [9.5, 10.5]
的 x 区间。索引 10 的列仅被一半覆盖,这就是为什么结果颜色为 ((255, 0, 0) + (255, 255, 255))/2 = (255, 127, 127)
(已四舍五入为整数值)
修改dx
以完全覆盖该列,然后得到描边颜色:
final double dx = 0.5;
<小时/>
像素被您在代码中填充的矩形完全覆盖,因此颜色设置为填充颜色。将 0.5
添加到您填充的矩形的起始坐标之一,您将观察到与笔划类似的效果。
关于java - setStroke() 和 setFill() 产生不同的像素颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54437985/
当您使用具有笔划宽度的 xml 将可绘制对象分配给 View 时,它工作正常。当我尝试在运行时动态分配它并更改笔划宽度时,它似乎不起作用。 您可以在快照中找到结果和代码here 基本上, 左 View
我遇到以下问题:我想创建一个新的 BasicStroke 并将其设置在 Graphics2D 对象上。这是我为该问题编写的代码: BasicStroke stil = new BasicStr
我试图了解 JavaFX Canvas setStroke 方法的工作原理。它不会将像素的颜色设置为所需的值。不过 setFill 方法没有问题。 Canvas canvas = new Canvas
这个问题已经有答案了: Can we call a method at class level rather than in a method? (3 个回答) 已关闭 3 年前。 我正在启动 Jav
这两种设置描边颜色的方式有区别吗? CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor) [[UIColor re
如何在 Kotlin 中执行固定行程?这不会作为按钮背景中的方法出现。这是我试图在 Java 中实现的目标: ((GradientDrawable) mAllButton.getBackground(
我正在解决 Big Nerd Ranch 的 iOS 编程指南中有关 UIView 子类化的章节中的挑战。 下面有一些代码可以用随机颜色绘制同心圆。并且,摇晃后,它们应该全部变成红色。事实并非如此,因
我在 Core Graphics 中使用圆弧绘制一个完整的圆。圆的每个圆弧都是不同的颜色。如果我使用标准颜色(例如 [UIColor redColor] ),它会很好地绘制。但是,如果我指定自定义颜色
我想为每个 UIBezierPath 部分设置不同的描边颜色。但是顺序完全错误,我不知道如何解决。 这就是我想要的: 这就是我得到的: 好像顺序错了。有没有办法将颜色“绑定(bind)”到 bezie
我在 ImageView 中有一个 Drawable,我正在运行时对其进行修改,以便为用户的排名提供自定义颜色。修改它的方法在低于 20 的 Android 版本上工作正常,但高于它的 drawabl
我是一名优秀的程序员,十分优秀!