JDK-5101502 : SampleModel should support very large images (width*height > Integer.MAX_VALUE)
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 1.4.2
  • Priority: P4
  • Status: Open
  • Resolution: Unresolved
  • OS: generic
  • CPU: generic
  • Submitted: 2004-09-14
  • Updated: 2018-09-05
Related Reports
Relates :  
Description
Since the SampleModel class does not support very large images (those whose width * height > Integer.MAX_VALUE), Image I/O cannot be used to read in these very large images. Customer Michael Owen <###@###.###> has run into this problem:

FULL PRODUCT VERSION :
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Microsoft Windows XP [Version 5.1.2600]

A DESCRIPTION OF THE PROBLEM :
The JPEG2000 codec is unable to decode huge JP2 files.   This appears to affect both the java and native decoder.

This occurs with the image-io tools for JAI v1.0 and v1.0_01 releases.


STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Run the suppliedsample program with a very large .jp2 file.  The dimensions of the JP2 image need to be over 65,536 pixels.  A 1.5kb JP2 file for an image that is 100,000 x 100,000 pixels is attached.
The actual images used for the real application are photo mosaics of many images, which have been compressed as JPEG2000 images externally to this application.  These are almost always larger than 65,536 x 65,536 pixels.


ERROR MESSAGES/STACK TRACES THAT OCCUR :
Trying reader jpeg 2000
java.lang.IllegalArgumentException: Dimensions (width=100000 height=100000) are too large
        at java.awt.image.SampleModel.<init>(SampleModel.java:112)
        at java.awt.image.ComponentSampleModel.<init>(ComponentSampleModel.java:128)
        at java.awt.image.PixelInterleavedSampleModel.<init>(PixelInterleavedSampleModel.java:69)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KRenderedImageCodecLib.createSampleModel(J2KRenderedImageCodecLib.java:591)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KRenderedImageCodecLib.createOriginalSampleModel(J2KRenderedImageCodecLib.java:579)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KRenderedImageCodecLib.<init>(J2KRenderedImageCodecLib.java:191)

        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderCodecLib.readHeader(J2KImageReaderCodecLib.java:334)

        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderCodecLib.getWidth(J2KImageReaderCodecLib.java:145)
        at JP2Test.main(JP2Test.java:28)
java.lang.IllegalArgumentException: The destination or source region is empty.
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReader.computeRegionsWrapper(J2KImageReader.java:180)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KRenderedImageCodecLib.<init>(J2KRenderedImageCodecLib.java:167)

        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderCodecLib.read(J2KImageReaderCodecLib.java:281)
        at JP2Test.main(JP2Test.java:43)
Trying reader jpeg 2000
Image size = 100000,100000
java.lang.IllegalArgumentException: Dimensions (width=100000 height=100000) are too large
        at java.awt.image.SampleModel.<init>(SampleModel.java:112)
        at java.awt.image.ComponentSampleModel.<init>(ComponentSampleModel.java:128)
        at java.awt.image.PixelInterleavedSampleModel.<init>(PixelInterleavedSampleModel.java:69)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.getSampleModel(J2KReadState.java:787)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.getColorModel(J2KReadState.java:827)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.readBufferedImage(J2KReadState.java:302)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReader.read(J2KImageReader.java:356)
        at JP2Test.main(JP2Test.java:43)


REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.awt.image.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.imageio.*;
import javax.imageio.stream.*;
import javax.imageio.metadata.*;
import com.sun.media.imageio.plugins.jpeg2000.*;


public class JP2Test  {
    public static void main(String[] args) {
        File jp2File = new File(args[0]);

        // Demonstrate the problem using ImageIO
        Iterator iterator = ImageIO.getImageReadersByFormatName("jpeg2000");
        while (iterator.hasNext()) {
            try {
                ImageInputStream iis = ImageIO.createImageInputStream(jp2File);
                ImageReader reader = (ImageReader) iterator.next();
                reader.setInput(iis);

                // First bug - line below fails on huge images
                // The Java decoder throws an OutOfMemoryError, the native decoder throws an IllegalArgumenmtException
                try {
                    int width = reader.getWidth(0);
                    int height = reader.getHeight(0);
                    System.out.println("Image size = " + width + "," + height);
                } catch(IllegalArgumentException ex) {
                    ex.printStackTrace();
                } catch(OutOfMemoryError e) {
                    e.printStackTrace();
                }
            }
            catch (Throwable t) {
                t.printStackTrace();
            }
        }
    }
}


---------- END SOURCE ----------

Comments
EVALUATION There is at least one other open bug (4690476) related to w*h overflow in the imaging classes (SampleModel, DataBuffer, etc). Apparently in 1.1 we used (buf.length/w >= h) instead of (buf.length >= w*h) to test for bounds. There are obviously many other issues that need to be taken into account, and the spec should be clarified w.r.t. images with large dimensions. Assigning this to the engineer who is familiar with how we've handled these issues historically. ###@###.### 2004-09-14
14-09-2004