如何在 javafx imageView 中获取显示图像的宽度/高度?
Posted
技术标签:
【中文标题】如何在 javafx imageView 中获取显示图像的宽度/高度?【英文标题】:How to get width/height of displayed image in javafx imageView? 【发布时间】:2016-09-09 09:56:32 【问题描述】:我需要在 imegView 中获取显示图像的宽度/高度,并将其与 imageView.getImage().getWidth()/getHeight() 中的原始图像大小进行比较,并在用户从应用程序 GUI 调整其大小时听取更改。
我从imageView.fitWidthProperty()
得到这个尺寸,高度相似,但我得到的是 imageView 的尺寸而不是其中的图像:
我得到蓝色的大小,即 imageView,但我需要显示图像的大小(绿色)。当用户调整窗口应用程序大小时,如何将它作为属性来监听(绿色也改变大小,但它似乎有最大和最小大小,因此当它是最大或最小时它停止使用 imageView 调整大小)。
我使用这个属性来计算蓝色矩形下方右下角原始图像大小的百分比。
有可能吗?
E:下面是这个标签的fxml:
<BorderPane fx:id="root" fx:controller="..."
xmlns:fx="..." xmlns="..." stylesheets="@...css">
<center>
<StackPane>
<ImageView fx:id="..."/>
<fx:include source="...fxml" fx:id="..."/>
</StackPane>
</center>
<bottom>
<VBox fx:id="..." minHeight="110" styleClass="small-padding" spacing="5">
<HBox alignment="CENTER_RIGHT" spacing="5">
<fx:include source="...fxml" resources="..."
fx:id="..."/>
</HBox>
<TextArea fx:id="..." promptText="%..." styleClass="-fx-description-text-area"/>
</VBox>
</bottom>
【问题讨论】:
【参考方案1】:~>1)
Image
没有调整大小以覆盖所有ImageView 的事实与preserveRatio 方法有关。如果你想被覆盖setPreserveRatio(false);
结合setSmooth( true );
~>2)
绿色边框是原始图像的大小。
~>3)
在将Image
添加到ImageView
之前,您可以:
Image image = new Image("FILE:...");
image.getWidth( );
image.getHeight( );
这就是图片的原始尺寸。
至于图片在ImageView
里面显示时的大小:
imageView.getFitWidth();
imageView.getFitHeight();
对于场景内ImageView
的大小(您问题中的蓝色边框):
imageView.getWidth();
imageView.getHeight();
ImageView
类具有上述属性。
【讨论】:
imageView.getFitWidth() 不起作用。但是我在 imageView.boundsInParentProperty() 中找到了我需要的东西,所以问题解决了。 这里也一样,需要使用:listView.boundsInParentProperty().get().getWidth()
【参考方案2】:
当ImageView
设置为保留纵横比时,必须手动计算实际尺寸。至少我还没有找到其他方法。
double aspectRatio = image.getWidth() / image.getHeight();
double realWidth = Math.min(imageView.getFitWidth(), imageView.getFitHeight() * aspectRatio);
double realHeight = Math.min(imageView.getFitHeight(), imageView.getFitWidth() / aspectRatio);
稍微解释一下:getFitHeight/Width 是你的蓝色矩形。在保留源图像的纵横比时,蓝色矩形的至少一侧必须与绿色矩形的对应边具有相同的长度。此外,绿色矩形始终位于蓝色矩形之内,因此调用Math.min()
。
【讨论】:
【参考方案3】:我不知道您可以直接使用任何属性来获得所需的数字,但您可能会建议将此作为 JavaFX 未来版本的改进。
您现在可以做的是编写一些代码来跟踪 ImageView 的所有属性,这些属性会影响显示图像的大小,然后自己计算显示的大小。这对我来说听起来并不复杂。
【讨论】:
以上是关于如何在 javafx imageView 中获取显示图像的宽度/高度?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 javafx 中调整 imageview 图像的大小?