JavaFX的ImageView的,没有任何平滑(JavaFX ImageView without

2019-08-31 12:26发布

是否有可能呈现在JavaFX的2.2的ImageView的缩放图像,没有任何平滑应用? 我渲染50×50图像分割成200×200的ImageView,与setSmooth(假),那么在源图像中的每个像素应该映射到屏幕上的4×4平方。

然而,得到的渲染还是抚平所有16个目标像素源像素。 有谁知道的方式做到这一点,而无需手动复制在每个像素到一个新的形象?

Answer 1:

在JavaFX 2.2 ImageView总是会做一些平滑而不管的顺利你提供的线索ImageView

(基于使用Java 7u15和Windows 7,配备ATI HD4600显卡测试)。

也许这是一个错误ImageView总会平滑Image ,但文件并没有真正明确指定平滑或不这样做,所以很难说其真正意图是什么。 您可能要张贴参考就此问题向的OpenJFX-dev邮件列表或登录一个问题JavaFX的问题跟踪器来获得从开发更加专家的意见。


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

  1. 规模在图像构造 。
  2. 规模ImageView与fitWidth / fitHeight 。
  3. 通过使用刻度的scaleX / 的scaleY上的属性ImageView
  4. 通过采样规模Image与PixelReader和创建与新的图像PixelWriter 。

我发现,方法1和4产生了急剧的像素化图像作为你希望和2和3造成了模糊的锯齿图像。

示例代码 ,以生成上述输出。


与思路更新实现自己的图像过滤器

一个JavaFX效果并不一样用于图像加载例程过滤器,尽管可以创建到滤波器的图像的效果。 在JavaFX 2.2公开记录的API,支持自定义特效制作,这样的自定义效果创造可能很难。

该图像支持本地代码最近开源的一部分的OpenJFX项目 ,所以你可以看看这个,看看过滤是如何目前实施。

您可能还需要提交一份针对JavaFX运行项目功能要求 ,以“让我们做出我们自己的2D过滤器”。



Answer 2:

我知道这是一个有点老,但我最近有一个需要这样的ImageView,和下面的小黑客不正是我想要我的(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不能简单地将“平滑”标志纹理的线性过滤设置超出了我但是。



Answer 3:

当您添加下面的构造方法马丁Sojka的回答,您可以JavaFX的图片只是传递给构造函数。 此外,尽管关于弃用功能的警告,他的回答仍然能正常工作(在JDK 1.8_121)。

public PixelatedImageView (javafx.scene.image.Image image) {
    super(image);
}


文章来源: JavaFX ImageView without any smoothing