@Override
	public T subimage(int x0, int y0, int x1, int y1, T subimage) {
		T ret = createNew(-1, -1);
		ret._setData(_getData());
		ret.stride = Math.max(width * numBands, stride); // ok why is this done?!?!  Shouldn't it always be stride?
		ret.width = x1 - x0;
		ret.height = y1 - y0;
		ret.numBands = numBands;
		ret.startIndex = startIndex + y0 * stride + x0 * numBands;
		ret.subImage = true;
		ret.imageType = imageType;

		return ret;
	}
@ Override public T subimage ( int x0 , int y0 , int x1 , int y1 , T subimage ) { T ret = createNew ( - 1 , - 1 ) ; ret . _setData ( _getData ( ) ) ; ret . stride = Math . max ( width * numBands , stride ) ; ret . width = x1 - x0 ; ret . height = y1 - y0 ; ret . numBands = numBands ; ret . startIndex = startIndex + y0 * stride + x0 * numBands ; ret . subImage = true ; ret . imageType = imageType ; return ret ; }
Creates a sub-image from 'this' image.  The subimage will share the same internal array
that stores each pixel's value, but will only pertain to an axis-aligned rectangular segment
of the original.


@param x0 x-coordinate of top-left corner of the sub-image.
@param y0 y-coordinate of top-left corner of the sub-image.
@param x1 x-coordinate of bottom-right corner of the sub-image.
@param y1 y-coordinate of bottom-right corner of the sub-image.
@param subimage
@return A sub-image of this image.