如何在没有模糊/别名的情况下将图像绘制到JavaFX Canvas中?

时间:2015-10-27 23:27:51

标签: java canvas javafx

我正在尝试在JavaFX Canvas中绘制图像。但是,drawImage()的传统GraphicsContext方法似乎会产生某种模糊或混淆的结果。可能是因为我使用的是Retina MacBook Pro。

我在这里找到了一个解决方案:https://stackoverflow.com/a/26706028/555690

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);
            }
         }
      }
   }
}

它有效,但有时我需要绘制具有特定大小的目标矩形(所以我需要添加int twint th的参数),但我不知道如何调整上述方法的逻辑,以利用它们。

如何在没有模糊/别名的情况下将图像绘制到JavaFX Canvas中?

1 个答案:

答案 0 :(得分:0)

我也有一台MacBook Pro Retina,我遇到了同样的问题,但是如果你做得对,你在画布上绘制的图像并不模糊。

你必须记住的是Retina Mac的像素比例系数为2.因此,如果你要求画布说1000x1000,你会得到一个尺寸为1000x1000光栅单位或虚拟像素的画布。在内部,它由2000x2000像素的图像支持。现在假设您有一个大小为400x400像素的图像,并且您希望在画布的左上角显示该图像而不会模糊。然后,您必须以下列方式使用drawImage函数:

gc.drawImage(img, 0, 0, 400, 400, 0, 0, 200, 200);

另一种情况可能是您希望使用500x500栅格单位区域的图像填充画布的上四分之一。这意味着您必须提供1000x1000像素的图像并将其放在

gc.drawImage(img, 0, 0, 1000, 1000, 0, 0, 500, 500);

我希望这有助于理解这个问题。