javafxports图像在放大imageview时像素化

时间:2018-03-20 18:00:23

标签: java android gluon-mobile javafxports

这是我的代码:

Image image1 = new Image(url);
Dialog mainDialog = new Dialog(true);

ImageView imageView = new ImageView();
imageView.setImage(image1);
imageView.setPreserveRatio(true);
imageView.setCache(true);
imageView.setSmooth(true);
imageView.setPickOnBounds(true);
imageView.setOnZoom(evt->{
    imageView.setScaleX(imageView.getScaleX()*evt.getZoomFactor());
    imageView.setScaleY(imageView.getScaleY()*evt.getZoomFactor());
});

mainDialog.setContent(imageView);
Platform.runLater(() -> mainDialog.showAndWait());

1 个答案:

答案 0 :(得分:0)

你没有提供很多关于图像质量的信息,你的意思是像素化,它发生的规模,或者只是在移动而不是桌面上。

无论如何,这里有一些提示可以改善结果。

  • 在缓存中添加提示,在本例中为CacheHint.SCALE

  • 向imageView添加剪辑。如果比例太大,图像在内存上会很大。这将防止可能的内存问题。将矩形的大小绑定到视图尺寸。

这对我来说很好,即使比例因子为20 +:

Image image1 = new Image(url); 
Dialog mainDialog = new Dialog(true);
ImageView imageView = new ImageView();
imageView.setImage(image1);
imageView.setPreserveRatio(true);
imageView.setCache(true);
imageView.setCacheHint(CacheHint.SCALE); // <-- hint
imageView.setSmooth(true);
imageView.setPickOnBounds(true);
imageView.setOnZoom(evt -> {
    imageView.setScaleX(imageView.getScaleX() * evt.getZoomFactor());
    imageView.setScaleY(imageView.getScaleY() * evt.getZoomFactor());
});
Rectangle r = new Rectangle();
imageView.setClip(r);    // <-- clip
r.widthProperty().bind(view.widthProperty());
r.heightProperty().bind(view.heightProperty());
mainDialog.setContent(imageView);
mainDialog.showAndWait();    // <-- No need of runLater