Hello

PixelInterleavedSampleModel constructor has the following argument check at line 100:

   if (pixelStride*w > scanlineStride) {
        throw new IllegalArgumentException("Pixel stride times width must be less 
than or equal to the scanline stride");
   }

It seems to me that the following check would be more accurate:

   if (pixelStride*(w-1) + maxBandOff >= scanlineStride) {
        ...
   }

Rational: consider a subsampling operation where a new PixelInterleavedSampleModel is created for an image with a subset of the pixels of the original image. This is an operation similar to the existing PixelInterleavedSampleModel.createSubsetModel(int[] bands) method, which allows to create a view without coyping the DataBuffer content. Consider the following subsampling factors:

   sourceXSubsampling = 5
   sourceYSubsampling = 1

Consider an image of size 16 × 3 pixels with a single band. In the illustration below, "X" and "-" are pixels from the source images and "X" are pixels retained in the subsampled image. Note that the last column of the source image is included in the subsampled image; it is important for this issue.

   X----X----X----X
   X----X----X----X
   X----X----X----X

A subsampled image view can be created with a PixelInterleavedSampleModel having a pixel stride of 5, a width of 4 and everything else identical, in particular a scanline stride of 16. It works well in the general case. But for the case illustrated above, an IllegalArgumentException is thrown. It can be seen from the following condition:

   pixelStride*w > scanlineStride
              5*4 > 16
               20 > 16
               true -> IllegalArgumentException

Above condition is equivalent to requiring image to be like that:

   X----X----X----X----

Instead of:

   X----X----X----X

The amended check proposed at the beginning of this email checks if there is enough room for storing the last sample value of a row, ignoring the remaining of pixel stride that are just skipped. The check in this case become:

   pixelStride*(w-1) + maxBandOff >= scanlineStride
   5*(4-1) + 0 >= 16
   15 >= 16
   false -> no exception thrown

I can create a pull request, but before spending time on it I would like to know if this is considered worth fixing?

    Regards,

        Martin


Reply via email to