如何在 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 图像的大小?

如何动态的设定imageview的大小

在ImageView中缩放图像(javafx)

JavaFX ImageView 没有任何平滑

JavaFX 将 ImageView 裁剪为 AnchorPane 中的椭圆

JavaFX ImageView旋转更改拖放