Javafx 如何禁用画布像素平滑

Javafx 如何禁用画布像素平滑,javafx,javafx-8,Javafx,Javafx 8,我在画布节点中绘制了一些像素,如下所示: canvas.getGraphicsContext2D().getPixelWriter().setColor(10, 10, Color.RED); 然后我缩放画布。现在像素模糊/平滑(请参见第一幅图像)。但我想要实现的是第二幅图 我该怎么做 在javafx中呈现图像的一些方法,实际上javafx中的许多组件都是抗锯齿的,这意味着它们将尝试平滑,请参阅另一篇文章,其中介绍了图像 您可以尝试先将像素绘制到图像视图,然后禁用“平滑”属性并将图像重新绘制

我在画布节点中绘制了一些像素,如下所示:

canvas.getGraphicsContext2D().getPixelWriter().setColor(10, 10, Color.RED);
然后我缩放画布。现在像素模糊/平滑(请参见第一幅图像)。但我想要实现的是第二幅图

我该怎么做


在javafx中呈现图像的一些方法,实际上javafx中的许多组件都是抗锯齿的,这意味着它们将尝试平滑,请参阅另一篇文章,其中介绍了图像

您可以尝试先将像素绘制到图像视图,然后禁用“平滑”属性并将图像重新绘制回上下文:

ImageView scaledImageView = new ImageView(image);
scaledImageView.setSmooth(false);
然而,这需要重新实现你已经拥有的, 并以调整后的大小将图像绘制回context2d

这篇文章也有同样的问题,因为消除混叠会造成模糊,仅供参考

也有一些侵入性较小的解决方案可以发挥作用,有时,如果缩放/缩放幅度小于2(例如32x32、64x64),消除混叠会扭曲图像,这是因为:

在设备像素级,整数坐标映射到角上 像素和像素中心之间的裂缝出现在 整数像素位置之间的中点。因为所有的坐标 值是用浮点数指定的,坐标可以 精确地指向这些角点(当浮点值 精确整数值)或像素上的任何位置。例如,一个 坐标(0.5,0.5)将指向左上角的中心 舞台上的像素。类似地,在(0,0)处的矩形具有尺寸 10乘10的范围将从左上角开始 舞台上第10个像素右下角的像素 第10扫描线。其中最后一个像素的像素中心 矩形将位于坐标(9.5,9.5)处


在javafx中呈现图像的一些方法,实际上javafx中的许多组件都是抗锯齿的,这意味着它们将尝试平滑,请参阅另一篇用图像覆盖它的文章

您可以尝试先将像素绘制到图像视图,然后禁用“平滑”属性并将图像重新绘制回上下文:

ImageView scaledImageView = new ImageView(image);
scaledImageView.setSmooth(false);
然而,这需要重新实现你已经拥有的, 并以调整后的大小将图像绘制回context2d

这篇文章也有同样的问题,因为消除混叠会造成模糊,仅供参考

也有一些侵入性较小的解决方案可以发挥作用,有时,如果缩放/缩放幅度小于2(例如32x32、64x64),消除混叠会扭曲图像,这是因为:

在设备像素级,整数坐标映射到角上 像素和像素中心之间的裂缝出现在 整数像素位置之间的中点。因为所有的坐标 值是用浮点数指定的,坐标可以 精确地指向这些角点(当浮点值 精确整数值)或像素上的任何位置。例如,一个 坐标(0.5,0.5)将指向左上角的中心 舞台上的像素。类似地,在(0,0)处的矩形具有尺寸 10乘10的范围将从左上角开始 舞台上第10个像素右下角的像素 第10扫描线。其中最后一个像素的像素中心 矩形将位于坐标(9.5,9.5)处


我浏览了
GraphicsContext2D
Canvas
API,搜索了互联网和SE,但没有找到任何有用的东西。最后,我决定创建一个最大尺寸的画布,然后使用
canvas.setScaleX(a)
canvas.setScaleY(a)
其中
0我查看了
GraphicsContext2D
canvas
API,搜索了互联网和SE,但找不到任何有用的东西。最后,我决定创建一个最大尺寸的画布,然后使用
canvas.setScaleX(a)
canvas.setScaleY(a)
where
0