是否有可能呈现在JavaFX的2.2的ImageView的缩放图像,没有任何平滑应用? 我渲染50×50图像分割成200×200的ImageView,与setSmooth(假),那么在源图像中的每个像素应该映射到屏幕上的4×4平方。
然而,得到的渲染还是抚平所有16个目标像素源像素。 有谁知道的方式做到这一点,而无需手动复制在每个像素到一个新的形象?
是否有可能呈现在JavaFX的2.2的ImageView的缩放图像,没有任何平滑应用? 我渲染50×50图像分割成200×200的ImageView,与setSmooth(假),那么在源图像中的每个像素应该映射到屏幕上的4×4平方。
然而,得到的渲染还是抚平所有16个目标像素源像素。 有谁知道的方式做到这一点,而无需手动复制在每个像素到一个新的形象?
在JavaFX 2.2 ImageView
总是会做一些平滑而不管的顺利你提供的线索ImageView
。
(基于使用Java 7u15和Windows 7,配备ATI HD4600显卡测试)。
也许这是一个错误ImageView
总会平滑Image
,但文件并没有真正明确指定平滑或不这样做,所以很难说其真正意图是什么。 您可能要张贴参考就此问题向的OpenJFX-dev邮件列表或登录一个问题JavaFX的问题跟踪器来获得从开发更加专家的意见。
我尝试了缩放图像的几个不同的方法:
ImageView
与fitWidth / fitHeight 。 ImageView
。 Image
与PixelReader和创建与新的图像PixelWriter 。 我发现,方法1和4产生了急剧的像素化图像作为你希望和2和3造成了模糊的锯齿图像。
示例代码 ,以生成上述输出。
与思路更新实现自己的图像过滤器
一个JavaFX效果并不一样用于图像加载例程过滤器,尽管可以创建到滤波器的图像的效果。 在JavaFX 2.2公开记录的API,支持自定义特效制作,这样的自定义效果创造可能很难。
该图像支持本地代码最近开源的一部分的OpenJFX项目 ,所以你可以看看这个,看看过滤是如何目前实施。
您可能还需要提交一份针对JavaFX运行项目功能要求 ,以“让我们做出我们自己的2D过滤器”。
我知道这是一个有点老,但我最近有一个需要这样的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
不能简单地将“平滑”标志纹理的线性过滤设置超出了我但是。
当您添加下面的构造方法马丁Sojka的回答,您可以JavaFX的图片只是传递给构造函数。 此外,尽管关于弃用功能的警告,他的回答仍然能正常工作(在JDK 1.8_121)。
public PixelatedImageView (javafx.scene.image.Image image) {
super(image);
}