Support pluggable image loading via javax.imageio

John Neffenger john at status6.com
Tue Apr 18 15:47:14 UTC 2023


On 4/17/23 2:10 PM, Michael Strauß wrote:
> I've been working on a proposal that doesn't add any new API to
> JavaFX, but instead plugs into the existing `javax.imageio` API,
> allowing applications to use third-party libraries like TwelveMonkeys
> [0] to load a wide variety of image formats.

Looks interesting! Just in case it's helpful, I tested 14 different ways 
of converting AWT images to JavaFX images using the public APIs. The 
latest results are here:

   Benchmarks - September 2020 - toFXImage
   https://jgneff.github.io/tofximage/2020-09/

The source code for all of the tests is found here:

   Benchmarks.java
 
https://github.com/jgneff/tofximage/blob/master/src/main/java/org/status6/tofximage/Benchmarks.java

I see you're using 'for' loops in your 'BufferedImageConverter' class to 
convert the pixels. Unlike yours, the 'for' loops in my tests were 
making two method calls for each pixel, so they were the slowest by far:

     PixelWriter writer = jfxImage.getPixelWriter();
     for (int y = 0; y < awt.height; y++) {
         for (int x = 0; x < awt.width; x++) {
             writer.setArgb(x, y, awtImage.getRGB(x, y));
         }
     }

The 'for' loops you're using might be optimized by the JIT compiler more 
easily. In my tests, though, I found that letting a PixelWriter do the 
conversion on the entire pixel array in one call was the fastest. If I 
remember correctly, it dropped into native code for the actual 
conversion and copying:

     int[] data = ((DataBufferInt)
             awtImage.getRaster().getDataBuffer()).getData();
     jfxImage.getPixelWriter().setPixels(0, 0, width, height,
             format, data, 0, width);

John



More information about the openjfx-dev mailing list