Preserving arbitrary Aspect Ratio in JavaFX
I had an attempt at displaying the proper aspect ratio in JavaFX, and after a couple of false-starts came up with a pretty simple solution. The ImageView does it's own aspect ratio preservation but for a WritableImage the pixels are always square - as far as I can tell.
So one must adjust it outside. First I just used:
vout.setScaleX(aspect);
To set the ratio - this displayed the video properly but didn't take the adjust size into account during layout and fitting to the display area. Not really a show-stopper as the user can just adjust the window until it fits, but I was sure I could do better than that.
I tried various things such as placing the vout (an ImageView) into a Group and so on - but this didn't work (of course) as I was setting the dimensions of the ImageView relative to the window size.
Actually it turned out to be extremely simple: since I'm scaling the ImageView when it is being displayed, I just have to scale the inverse when I'm binding it's dimensions:
vout.fitWidthProperty().bind(root.widthProperty().divide(aspect));
The height is simply bound to the root.height.
And also remember to take it into account on the initial scene size too:
Scene scene = new Scene(root, width * aspect, height);
So apart from calculating the aspect ratio, those were the only lines of code required. Seems to work although i've only tested it on one PAL 16:9 video so far ...
Although the screen capture stuff just stores the unscaled frame still ... which is probably what I want tbh.
Well not a bad haul today for a poor nights sleep and feeling a bit crap overall.
Update: Added some shots to show it it works in JJPlayer.
Window too narrow - automatically scaled to fit horizontally:
Window too wide - automatically scaled to fit vertically (and controls fading out):
A raw non-corrected frame grab showing the image using square pixels: