Proposal: A new common Image API

John Neffenger john at status6.com
Wed Apr 16 19:35:01 UTC 2025


On 4/16/25 3:04 AM, Glavo wrote:
> * Different image APIs have to repeatedly implement support for 
> reading the same image format (such as JPEG).
>   In fact, AWT, JavaFX, and Android now each implement reading JPEG 
> images.
>   This is a waste.

I was initially frustrated by the split between Java (AWT) and JavaFX in 
their image support and would have welcomed a common library, but I came 
to appreciate the flexibility of having both available in a JavaFX 
application. Below are some thoughts.

The challenge is not just in reading various external image formats. 
There are three parts:

 1. Efficiently loading and converting an image from an external format
    (GIF, PNG, JPG).
 2. Efficiently storing images internally with a minimal number of bits
    per pixel.
 3. Efficiently converting the internal format to that required by the
    client library (AWT, JavaFX, Android).

The first item is determined by the external image format standards, but 
the second and third items involve a trade-off. Optimizing for memory 
usage might results in a huge waste of CPU time doing conversions, while 
optimizing for zero conversion time might results in a huge waste of 
RAM. A JavaFX application can pick and choose between this trade-off by 
using both the AWT and JavaFX image libraries.

For example, I had to load and display hundreds of binary images (pure 
black and white) on a constrained device. The AWT can store images in 
memory as one bit per pixel, but JavaFX supports only 32-bit images. So 
I needed to use the AWT image format in memory, but the JavaFX image 
format for display, converting them on-the-fly one-by-one to 32 bits per 
pixel.

JavaFX provides an AWT-to-JavaFX image conversion utility, called 
SwingFXUtils::toFxImage 
<https://github.com/openjdk/jfx/blob/master/modules/javafx.swing/src/main/java/javafx/embed/swing/SwingFXUtils.java>, 
but I couldn't use it because it was far too slow. It's slow because 
it's generic and has to work for all image types. I came up with 14 
different ways to convert <https://github.com/jgneff/tofximage> an AWT 
image to a JavaFX image: 9 that work for images with transparency and 
another 5 that work only for images with no alpha. In my case, one such 
conversion was much faster than the others 
<https://jgneff.github.io/tofximage/2020-06/>.

A common library might end up too generic, too slow, or require too much 
memory to be useful.

John
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20250416/79916b99/attachment-0001.htm>


More information about the openjfx-dev mailing list