【发布时间】:2016-08-05 17:18:54
【问题描述】:
我在 Canvas 节点中绘制了一些像素,如下所示:
canvas.getGraphicsContext2D().getPixelWriter().setColor(10, 10, Color.RED);
然后我缩放画布。现在像素模糊/平滑(参见第一张图片)。但我想要实现的是第二张图片。
我该怎么做?
【问题讨论】:
我在 Canvas 节点中绘制了一些像素,如下所示:
canvas.getGraphicsContext2D().getPixelWriter().setColor(10, 10, Color.RED);
然后我缩放画布。现在像素模糊/平滑(参见第一张图片)。但我想要实现的是第二张图片。
我该怎么做?
【问题讨论】:
我查看了 GraphicsContext2D 和 Canvas API 并搜索了互联网和 SE,但找不到任何有用的东西。最后,我决定创建一个所需尺寸最大的画布,然后使用canvas.setScaleX(a) 和canvas.setScaleY(a) 其中0<a<=1。这样你就得到了一个缩放效果,它不会以任何方式模糊输出。当然,您的“像素”大小为s 乘以s,其中s 是您的最大缩放系数。我想唯一的缺点是它需要s^2 更多的内存来存储。不理想,但我可以应付和使用的解决方法。
不确定这会对任何人都有帮助,但我最近发现使用java.awt.Graphics2D 有以下命令,例如:
graphics.setRenderingHint(KEY_ANTIALIASING, VALUE_ANTIALIAS_OFF);
graphics.setRenderingHint(KEY_DITHERING, VALUE_DITHER_DISABLE);
graphics.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
【讨论】:
在 javafx 中渲染图像的一些方法,实际上 javafx 中的许多组件都具有抗锯齿功能,这意味着它们会尝试平滑,请参阅 here 以获取另一篇用图像覆盖它的帖子。
您可以尝试先将像素绘制到图像视图并禁用平滑属性并将图像重新绘制回上下文:
ImageView scaledImageView = new ImageView(image);
scaledImageView.setSmooth(false);
但是,这需要重新实现您已有的内容, 并以调整后的大小将图像重新绘制到 context2d 上。
这个帖子here也有同样的问题,就是抗锯齿造成的模糊,仅供参考。
还有一些侵入性较小的解决方案可以工作,如果您缩放/缩放小于 2 的幅度,有时抗锯齿会扭曲图像,例如 32x32、64x64,这样做是因为:
在设备像素级别,整数坐标映射到角落 像素和像素中心之间出现裂缝 整数像素位置之间的中点。因为所有坐标 值用浮点数指定,坐标可以 精确指向这些角(当浮点值有 精确的整数值)或像素上的任何位置。例如,一个 (0.5, 0.5) 的坐标将指向左上角的中心 舞台上的像素。类似地,一个位于 (0, 0) 的矩形,其尺寸为 10 x 10 将跨越左上角的左上角 舞台上的像素到舞台上第 10 个像素的右下角 第 10 条扫描线。里面最后一个像素的像素中心 矩形将位于坐标 (9.5, 9.5)。
【讨论】: