当前位置: 首页 > 知识库问答 >
问题:

没有任何平滑的JavaFX ImageView

楚昊明
2023-03-14

是否可以在 JavaFX 2.2 中的 ImageView 中渲染缩放后的图像而不应用任何平滑?我正在使用setSmooth(false)将50x50图像渲染为200x200 ImageView,因此源图像中的每个像素都应映射到屏幕上的4x4正方形。

但是,生成的渲染仍然在所有16个目标像素上平滑源像素。有没有人知道一种方法可以做到这一点,而无需手动将每个像素复制到新图像中?

共有3个答案

耿炎彬
2023-03-14

ImageView没有修复,但它对我帮助很大。在搜索了很久之后,我偶然发现了这篇文章:如何在JavaFX Canvas上禁用抗锯齿?

为了在画布上绘制图像,可以禁用平滑,因为JavaFX12

canvas.getGraphicsContext2D().setImageSmoothing(false);
傅乐湛
2023-03-14

我知道这有点旧,但我最近需要这样的ImageView,下面的小hack正是我在我的(Windows)机器上想要的。不能保证它在任何地方都有效。

import com.sun.javafx.sg.prism.NGImageView;
import com.sun.javafx.sg.prism.NGNode;
import com.sun.prism.Graphics;
import com.sun.prism.Texture;
import com.sun.prism.impl.BaseResourceFactory;

import com.sun.prism.Image;
import javafx.scene.image.ImageView;

@SuppressWarnings("restriction")
public class PixelatedImageView extends ImageView {
    @Override protected NGNode impl_createPeer() {
        return new NGImageView() {
            private Image image;

            @Override public void setImage(Object img) {
                super.setImage(img);
                image = (Image) img;
            }

            @Override protected void renderContent(Graphics g) {
                BaseResourceFactory factory = (BaseResourceFactory) g.getResourceFactory();
                Texture tex = factory.getCachedTexture(image, Texture.WrapMode.CLAMP_TO_EDGE);
                tex.setLinearFiltering(false);
                tex.unlock();
                super.renderContent(g);
            }
        };
    }
}

这里的诀窍是纹理被重用,因此线性滤镜设置保持“粘性”。然而,为什么NGImageView不能简单地将“平滑”标志传递给纹理的线性滤镜设置,这超出了我的范围。

井洲
2023-03-14

在 JavaFX 2.2 中,无论你向 ImageView 提供什么平滑提示,ImageView 总是会做一些平滑。

(基于使用带有ATI HD4600图形卡的Java 7u15和Windows 7进行测试)。

也许这是一个错误,即< code>ImageView将总是平滑< code>Image,但文档并没有真正指定平滑做什么或不做什么,所以很难说它的真正意图是什么。您可能希望在openjfx-dev邮件列表中发布这个问题的参考,或者在JavaFX问题跟踪器中记录一个问题,以便从开发人员那里获得更专业的意见。

我尝试了几种不同的方法来缩放图像:

  1. 图像构造函数中的缩放。
  2. 使用fitWidth/fitHeight在ImageView中缩放。
  3. 通过使用ImageView上的caleX/caleY属性进行缩放。
  4. 通过使用PixelReader对Image进行采样并使用PixelWriter创建新图像来缩放。

我发现方法1

生成上述输出的示例代码。

更新实现您自己的图像过滤器的想法

JavaFX 效果与用于图像加载例程的滤镜不同,尽管可以创建用于滤波图像的效果。在 JavaFX 2.2 中,公开记录的 API 支持创建自定义效果,因此创建自定义效果可能很困难。

作为 openjfx 项目的一部分,用于图像支持的本机代码最近是开源的,因此您可以查看它以了解当前如何实现过滤。

您还可能希望针对JavaFX运行时项目提交一个功能请求,以“允许我们制作自己的2D过滤器”。

 类似资料:
  • 问题内容: 我可以使用以下内容滚动到200px 但是我想要一个平滑的滚动效果。我该怎么做呢? 问题答案: 现在,您可以使用来平滑滚动页面。 较旧的解决方案 您可以执行以下操作: ES6 递归方法:

  • 问题内容: 我的问题几乎与此类似: 从矩阵平滑表面图 只是我的工具集是matplotlib和numpy(到目前为止)。 我已经成功生成了X,Y和Z网格以进行绘制 但是,由于这些值非常跳跃,因此看起来非常糟糕。 我想使事情变得平滑,至少使顶点连接或看起来像那样。 我的数据是这样生成的:我有一个函数 它根据x生成矩阵,计算其y次幂,选择列和行的子集,并计算最大奇异值。因此,Z [x,y]是svOfMa

  • 我在tensorflow中实现了一个简单的线性回归。如果我将值的数量保持得非常小(小于8),它就可以正常工作。但是,一旦我做了大量(8个或更多样本),我就会得到NaN的。 这令人困惑,因为这是一个简单的回归,没有除法。成本是均方误差:仅除以固定整数(样本数)。此外,切换到平方和误差也会导致相同的问题。 Tensorflow NaN bug?不会有帮助,因为我的代码中没有分区或登录。 最后,添加会导

  • 我想知道是否有任何本机的方法可以在预定的时间内“平滑滚动”。 为了举例说明我的问题,我希望一个高度为10000dp的垂直从底部滚动到顶部,滚动的时间与它从中部(5000dp)滚动到顶部的时间相同。 如果可以使用插值器,那就太棒了:) 找不到与

  • 我已经编写了一些代码,可以从高度图中渲染3D世界,现在我也编写了允许行走的代码。问题是,当高度增加时,动画几乎“跳跃”,因为每个单元都相当大。有没有一种简单的方法可以让动画更流畅?(一般来说,我对OpenGL和3D渲染非常陌生,所以我不想讨论插值和更复杂的事情。)

  • 下面是关于如何设置messenger机器人的Facebook教程-使用ngrok设置我的webhook。本地测试一切顺利,但在向bot发送消息时仍然没有收到任何响应。 韩国https://ngrok.com/ facebook教程https://developers.facebook.com/docs/messenger-platform/getting-started/quick-start/