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

6
我正在使用JavaFX制作一个适用于桌面的精灵编辑器。
我尝试实现缩放功能,但是遇到了一个问题:我不知道如何禁用Canvas对象上的图像平滑处理。
我按照所有实现Canvas缩放的教程调用Canvas.setScaleX()Canvas.setScaleY()。但是当缩放时,我的图像看起来模糊。
我有一些测试代码在这里进行演示。
由于这是一个精灵编辑器,对我来说具有清晰的边缘非常重要。解决Canvas上的图像平滑处理的替代方法是拥有一个不平滑的ImageView,并且拥有一个隐藏的Canvas进行绘制,但我不希望采用这种方法。
谢谢您提供的帮助。
(这是一个相关问题的链接,但没有解决我的问题)
1个回答

3
我遇到了模糊问题。
在我的情况下,我的电脑有Retina显示屏。Retina显示屏会导致像素用子像素渲染。在将图像绘制到画布上时,图像将以子像素的抗锯齿方式进行绘制。我还没有找到防止出现此抗锯齿的方法(尽管使用其他画布技术如HTML5的画布是可能的)。
同时,我有一个解决方法(尽管我担心性能):
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绕过绘制图像时发生的抗锯齿处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接