如何在javafx中对canvas上的drawImage禁用线性过滤

时间:2017-06-08 20:34:07

标签: 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 result
// gc.scale(scale, scale);
// gc.drawImage(editableImage, 0, 0, width, height);

它的工作速度非常快,但会产生这样的模糊图像:

enter image description here

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

enter image description here

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

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

但我不能使用这种方法,因为它太慢了。绘制1Kb图像缩放8次需要几秒钟。所以我问是否有办法在画布上禁用这种模糊效果?

1 个答案:

答案 0 :(得分:2)

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

说明

  

使用drawImage()在GraphicsContext中绘制图像时   将小图像放大到更大的画布的方法,图像正在   插值(可能使用双线性或双三次算法)。但   有时像渲染彩色地图(温度,   zooplancton,盐度等)或一些地理数据(人口   浓度等)我们想要根本没有插值   (即:使用最近邻算法代替)以表示   准确的数据和形状。

     

在Java2D中,可以通过设置适当的方法来实现   手上有Graphics2D的RenderingHints.KEY_RENDERING。目前在   JavaFX的GraphicsContext没有这种方式来指定图像   是插值的。

     

同样缩小图像也是如此。

     

这可以扩展到支持更好的平滑形式   &#34;平滑&#34; Image和ImageView中可用的值   目前看起来效果不佳(至少在Windows上)。

这个问题是在2013年创建的,但它仍然没有受到影响,因此不太可能很快得到解决。