如何在javafx中禁用画布上drawImage的线性过滤

如何在javafx中禁用画布上drawImage的线性过滤,javafx,Javafx,我试图用javafx在画布上绘制缩放图像。使用此代码: Image image = ...; canvas.setWidth(scale * width); canvas.setHeight(scale * height); GraphicsContext gc = canvas.getGraphicsContext2D(); gc.drawImage(image, 0, 0, scale * width, scale * height); // this gives same resu

我试图用javafx在画布上绘制缩放图像。使用此代码:

Image image = ...;
canvas.setWidth(scale * width);
canvas.setHeight(scale * height);
GraphicsContext gc = canvas.getGraphicsContext2D();    
gc.drawImage(image, 0, 0, scale * width, scale * height);
// this gives same result
// gc.scale(scale, scale);
// gc.drawImage(editableImage, 0, 0, width, height);
它的工作速度非常快,但会产生如下模糊图像:

这不是我想看到的。相反,我想得到这张照片:

可通过使用以下代码手动设置每个像素颜色来绘制:

PixelReader reader = image.getPixelReader();
PixelWriter writer = gc.getPixelWriter();
for (int y = 0; y < scale * height; ++y) {
    for (int x = 0; x < scale * width; ++x) {
        writer.setArgb(x, y, reader.getArgb(x / scale, y / scale));
    }
}
PixelReader=image.getPixelReader();
PixelWriter=gc.getPixelWriter();
用于(整数y=0;y<比例*高度;++y){
用于(整数x=0;x

但我不能使用这种方法,因为它太慢了。用了几秒钟的时间绘制了缩放了8次的1Kb图像。所以我问有没有什么方法可以在画布上画画时禁用这种模糊效果?

我想我已经找到了问题的答案。如前所述,在图形上下文中无法指定过滤选项

说明:

使用drawImage()在GraphicsContext中绘制图像时 方法将小图像放大到更大的画布,图像正在 插值(可能使用双线性或双三次算法)。但是 有时渲染颜色贴图(温度、, 动物数量、盐度等)或一些地理数据(种群) 集中度等),我们希望根本没有插值 (即:改用最近邻算法)以表示 精确的数据和形状

在Java2D中,通过设置适当的 RenderingHights.KEY\在手边的图形2D上进行渲染。目前在 JavaFX的GraphicsContext没有这样的方法来指定图像的显示方式 要进行插值

这同样适用于收缩图像

这可以扩展以支持更好的平滑形式 “平滑”值,该值在Image和ImageView中都可用,并且 目前似乎工作不太好(至少在Windows上)

这一问题产生于2013年,但尚未触及,因此不太可能很快得到解决

2019年7月10日UPD:


看来问题来了!现在GraphicsContext应该具有控制此行为的属性。

相关,甚至可能是一个副本:@fabian,正如您所看到的,这个问题是关于ImageView的。画布是完全不同的。