[
https://issues.apache.org/jira/browse/SANSELAN-56?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13216806#comment-13216806
]
Gary Lucas commented on SANSELAN-56:
------------------------------------
Hi Damjan,
I'm not emotionally attached to most of my changes, and am willing to yield to
your judgement on most matters.
The only one that I have any comment on is the issue about the 16 byte palette.
The issue is whether Sanselan should include logic to handle a mistake in a
data palette format. The question is how common is the mistake. I myself don't
know. I've noticed that Microsoft Picture and Fax viewer handles files that
have the 8-byte palettes, but I have no insights into what drove that
particular design change.
The only other thing I would disagree with is the characterization of my code
changes as messy. Overreaching? Overly agressive? Reckless? Okay. But
messy... say it ain't so :-)
g.
---
Gary W. Lucas, Senior Software Engineer
Sonalysts, Inc
215 Parkway North
Waterford, CT 06320
(860) 326-3682
> 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
> Labels: api-change
> Attachments: Sanselan-56-SpeedEnhanceTiff.patch
>
> Original Estimate: 48h
> Remaining Estimate: 48h
>
> 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