我正在尝试在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 tw
和int th
的参数),但我不知道如何调整上述方法的逻辑,以利用它们。
如何在没有模糊/别名的情况下将图像绘制到JavaFX Canvas
中?
答案 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);
我希望这有助于理解这个问题。