[ 
https://issues.apache.org/jira/browse/IMAGING-126?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14260103#comment-14260103
 ] 

Gary Lucas commented on IMAGING-126:
------------------------------------

Well, first off, switching to Compress is an interesting side issue, not the 
key question raised by this particular tracker item.  So let me talk about the 
code change involved in the size of the compressed images before moving on to 
the question of using Compress.

In terms of the image size...  I did some work on this a year ago, but got busy 
with other things and let the matter drop. Basically, the issue comes down to 
the size of a memory allocation used to compress and decompress an image.  This 
memory holds a "dictionary" of sorts which is used to encode and decode the 
image.  The current size is 8K. A bigger size, say 32 K, achieves substantially 
better compression ratios and results in substantially smaller images.  
However, a bigger dictionary presents a larger search space for the compressor 
and slows things down.  In testing with the existing code I found that 32 K was 
a reasonable compromise...  It didn't make things as small as I'd wish, but it 
didn't increase the run time to an unacceptable degree.

My gut instinct is to simply make 32K be the default and be done with it.  Some 
of the others who joined the discussion pointed out that this would change the 
behavior of the existing code and might interfere with existing applications. 
So, what I would propose as an alternate is to offer a new option for the 
"parameters" passed to the Imaging.writeImage() methods. This would involve 
defining a key/value pair defined in the TiffConstants class which could be 
passed in to control compression.  This would require extra knowledge on the 
part of person writing application code to employ a feature that he would 
almost always want, but has the advantage of preserving the existing behavior. 
But I do think it's a reasonable approach.

So, if you are looking to wrap things up and put out a release, I will give 
this some attention and prepare a patch for you.  Is there a consensus on 
approach?

----------------------------------------------------------------------

Now, on to the discussion of Compress.

There are tradeoffs involved in adding a cross-project dependency.  So if we're 
thinking about doing that, let's be sure we've considered all the issues and 
have determined that it is a good idea. I will briefly consider both the pro's 
and con's. 

First the con's: Right now, all you have to do to use Apache Commons Imaging is 
download one jar file. Introducing cross dependencies to the build will 
complicate its use and management for anyone who wants to use the code.  Also, 
when I looked at this last year, Compress was not a perfect fit with the LZW 
compression used in the TIFF format. Unless things have changed since then 
(which is entirely possible), the Compress code would require some 
modifications to present a more general-purpose solution that could be used for 
Imaging.  Also, the current solution in Imaging does work, so it's not as if it 
has bugs that need to be fixed.

Now the pro's: One of the issues I mentioned above with the increase in the 
size of the memory used for the compression "dictionary" is the increase in 
compression time (and decompression time too?) related to the larger search 
space.  If Compress implements a more advanced compression implementation that 
improves performance, that would be a motivation for adopting it.

I don't think that anyone would argue against the idea that, in general, it is 
better not to maintain redundant implementations of anything. On the other 
hand, sometimes you have a need that is just specialized enough that 
maintaining a single code base becomes problematic. We might be looking at just 
such a case here.

> TIFF and PNG images should not be bigger than the ones created by java ImageIO
> ------------------------------------------------------------------------------
>
>                 Key: IMAGING-126
>                 URL: https://issues.apache.org/jira/browse/IMAGING-126
>             Project: Commons Imaging
>          Issue Type: Improvement
>          Components: Format: PNG, Format: TIFF
>    Affects Versions: 1.0
>         Environment: W7
>            Reporter: Tilman Hausherr
>            Priority: Minor
>             Fix For: Discussion
>
>         Attachments: Imaging_126_patch_1.patch, pdfbox-1870-devicen3-01.png, 
> pdfbox-1870-devicen3-01.tif, pdfbox-1870-devicen3.pdf-1.png, 
> pdfbox-1870-devicen3.pdf-1.tif
>
>
> I tried to use Apache Imaging for the PDFBOX project (PDFBOX-1734) because of 
> problems with setting the tiff resolution in java imageio.
> While the code is pretty nice, I found that the generated images are 
> sometimes much bigger in size than the ones generated by java imageio.
> Example:
> pdfbox-1870-devicen3-01.png 50 KB (imageio)
> pdfbox-1870-devicen3.pdf-1.png 70 KB (imaging)
> pdfbox-1870-devicen3-01.tif 401 KB (imageio)
> pdfbox-1870-devicen3.pdf-1.tif 1063 KB (imaging)



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to