A JavaFX Image always has a fixed size. Usually, this will be the intrinsic size of the image, but it can also be any other size if the image is created with the constructor that takes requestedWidth and requestedHeight. Internally, the JavaFX Image is stored with an arbitrary pixel density. There's exactly two ways how you can end up with a pixel density > 1: a) use the @Nx image naming convention b) use a variable-density image loader on a high-DPI screen
Importantly, you won't get a "dynamic" image if you do that (meaning an image that can have different render sizes), you simply get a normal JavaFX Image that is loaded with a higher pixel density. This means that if you have a variable-density image loader and canSetSourceRenderSize() is true, J2DImageLoader scales the intrinsic size of the image (or the requested size) with the screen DPI. A JavaFX Image is not a scene graph node, it doesn't know about where it is used and how large it ends up on the screen. I think what you're asking for is one of two things (or both things at once): 1. Allow multiple versions of an image loaded at the same time, and defer selection until render time. Then choose the best version depending on the transformed size of the rendered image. This would work for discrete versions like you get with the @Nx naming convention. 2. Allow an image to be dynamically rasterized from source depending on the transformed size of the rendered image. This would work for variable-density images. I think that the first option would be a good enhancement. The second option seems much harder to achieve. On Mon, Jul 14, 2025 at 3:20 PM mkpaz <quizy...@gmail.com> wrote: > > Hello, > > I'm testing the new pluggable image API with SVG and noticed one thing. > Since SVG is a scalable vector format, it can be rendered at an arbitrary > size. > For this purpose, we need to know the frame (pane) size and scale the image > accordingly while rendering. > As I understand, ImageReadParam is used to pass the frame size to the image > reader. > > public class ImageReadParam extends IIOParam { > /** > * Returns {@code true} if this reader allows the source image to be > rendered at an > * arbitrary size as part of the decoding process ... > */ > public boolean canSetSourceRenderSize() { > return canSetSourceRenderSize; > } > } > > But when I set canSetSourceRenderSize to true to activate this, I don't get > the client frame size. > Instead, I get the actual image size, which the reader already knows since it > implements the getWidth() and getHeight() methods. > > I read the code and came across this: > https://github.com/openjdk/jfx/blob/master/modules/javafx.graphics/src/main/java/com/sun/javafx/iio/java2d/J2DImageLoader.java#L122 > > Why does the image loader use the reader's width and height in both branches? > Shouldn't the loader provide the frame size when canSetSourceRenderSize > returns true? > Maybe I'm looking for something that isn't supported? Yet? > > Best regards.