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

时间:2014-03-29 01:22:49

标签: image-processing canvas javafx zoom

我正在使用JavaFX制作精灵编辑器,以便在桌面上使用。

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

我按照每个实施Canvas.setScaleX()缩放的教程调用Canvas.setScaleY()Canvas。但放大时我的图像显得模糊

我有一些测试代码here来演示。

What I get What I want

由于这是一个精灵编辑器,因此使用清晰的边缘对我来说非常重要。在Canvas上修复图片平滑的替代方法是使用non-smoothing ImageView,并使用隐藏的Canvas进行绘制,我宁愿避免使用。

非常感谢帮助。


(here's a link to a related question, but doesn't address my particular problem)

1 个答案:

答案 0 :(得分:3)

我在模糊方面遇到了同样的问题。

在我的情况下,我的电脑有Retina显示屏。 Retina Display使像素以子像素呈现。将图像绘制到画布时,将使用抗锯齿为子像素绘制图像。我没有找到防止这种抗锯齿发生的方法(尽管可以使用其他画布技术,例如HTML5's 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);
            }
         }
      }
   }
}

PixelWriter会绕过绘制图像时出现的消除锯齿现象。