我正在尝试在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));
}
}
但我不能使用这种方法,因为它太慢了。绘制1Kb图像缩放8次需要几秒钟。所以我问是否有办法在画布上禁用这种模糊效果?
答案 0 :(得分:2)
我想我已经找到了问题的答案。正如this issue所述,无法在图形上下文中指定过滤选项。
说明
使用drawImage()在GraphicsContext中绘制图像时 将小图像放大到更大的画布的方法,图像正在 插值(可能使用双线性或双三次算法)。但 有时像渲染彩色地图(温度, zooplancton,盐度等)或一些地理数据(人口 浓度等)我们想要根本没有插值 (即:使用最近邻算法代替)以表示 准确的数据和形状。
在Java2D中,可以通过设置适当的方法来实现 手上有Graphics2D的RenderingHints.KEY_RENDERING。目前在 JavaFX的GraphicsContext没有这种方式来指定图像 是插值的。
同样缩小图像也是如此。
这可以扩展到支持更好的平滑形式 &#34;平滑&#34; Image和ImageView中可用的值 目前看起来效果不佳(至少在Windows上)。
这个问题是在2013年创建的,但它仍然没有受到影响,因此不太可能很快得到解决。