JavaFX:禁用Canvas对象上的图像平滑

sor*_*bet 5 javafx canvas zoom image-processing

我正在使用JavaFX制作精灵编辑器以用于桌面.

我正在尝试实现缩放功能,但我遇到了一个问题:我无法弄清楚如何禁用Canvas对象上的图像平滑.

我正在打电话,Canvas.setScaleX()Canvas.setScaleY()按照每个实施Canvas缩放的教程.但放大时我的图像看起来很模糊.

在这里有一些测试代码来演示.

我得到了什么我想要的是

由于这是一个精灵编辑器,因此使用清晰边缘对我来说非常重要.固定图像平滑的替代方法Canvas是使其具有非平滑性ImageView,并且具有隐藏Canvas以进行绘制,我宁愿避免使用.

感谢帮助.


(这里是相关问题的链接,但没有解决我的特定问题)

小智 3

我也遇到了同样的模糊问题。

就我而言,我的电脑配备 Retina 显示屏。视网膜显示器导致像素用子像素渲染。将图像绘制到画布时,将使用子像素的抗锯齿功能绘制图像。我还没有找到一种方法来防止这种抗锯齿的发生(尽管使用其他画布技术(例如HTML5 的 Canvas )是可能的)

与此同时,我有一个解决方法(尽管我担心性能):

public class ImageRenderer {
   public void render(GraphicsContext context, Image image, int sx, int sy, int sw, int sh, int tx, int ty) {
      PixelReader reader = image.getPixelReader();
      PixelWriter writer = context.getPixelWriter();
      for (int x = 0; x < sw; x++) {
         for (int y = 0; y < sh; y++) {
            Color color = reader.getColor(sx + x, sy + y);
            if (color.isOpaque()) {
              writer.setColor(tx + x, ty + y, color);
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

PixelWriter 绕过绘制图像时发生的抗锯齿。