proposed enhancement reduces load time for some image files by 40 percent
-------------------------------------------------------------------------

                 Key: SANSELAN-56
                 URL: https://issues.apache.org/jira/browse/SANSELAN-56
             Project: Commons Sanselan
          Issue Type: Improvement
         Environment: Tested in Windows, Linux, MacOS
            Reporter: Gary Lucas



I have identified an enhancement that reduces the time required to load TIFF 
image by 40 percent.  I have tested a modified version of Sanselan under 
Windows, Linux, and MacOS with consistent savings on each platform.  
Additionally, I suspect that this technique may be applicable to other areas of 
the Sanselan code base, including more popular image formats supported by 
Sanselan such as JPEG, PNG, etc.

I propose to add the relevant code changes to the Sanselan code base.  Once 
these modifications are in place, there would be an opportunity for others to 
look at the pro's and cons' of applying the techniques to other data formats.

The Enhancement

To load an image from a TIFF file, Sanselan performs extensive data processing 
in order to obtain RGB values for the pixels in the output image. The code for 
that processing appears to be well written and efficient. Once the RGB value 
are obtained, they are stored in a Java BufferedImage using a call  to the 
setRGB() method.
Unfortunately, setRGB() is an extremely inefficient method.   A much, much 
better approach is to store the data into an integer array and defer the 
creation of the buffered image until all information for the image has been 
collected.    Java has a nice (though somewhat obscure) API that lets memory in 
an integer array be transferred directly to a BufferedImage so that the system 
does not have to allocate additional memory for this procedure (a very nice 
feature when dealing with huge images).  This change virtually eliminated the 
overhead for transferring data to images, which accounted for 40 percent of the 
time required to load images.  For TIFF files, this was a reasonable approach 
because the TiffImageParser class always loads 4-byte image  and the 
getGrayscaleBufferedImage() method is never used.  I have not investigated the 
code for the other renders, but some refinement might be needed for the 
one-byte grayscale images.

Steps to Integration

In sanselan.common, a new class called ImagePrep was created.  ImagePrep 
carries a width, height, and an integer array for storing pixels.  It provides 
its own setRGB() method which looks just like the one in BufferedImage.   
Finally, it provides a method called getBufferedImage() which creates a 
BufferedImage from its internal the integer array when the processing is 
complete.

In the TiffImageParser classes, data is read from input stream and transferred 
to pixel values in a series of classes known as PhotometricInterpreters.  These 
were modified to operate on ImagePrep objects rather than BufferedImage 
objects.  The DataReader and TiffImageParser classes were modified to pass 
ImagePrep objects into the photometric interpreters rather than using 
BufferedImages.

At the very last step, before passing its result back to the calling method 
(the Sanselan main class, etc.), the TiffImageParser used the 
ImagePrep.getBufferedImage() to convert the result to the expected form.






--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to