int trefy = j2kwparam.getTileGridYOffset();
if (trefx < 0 || trefy < 0 || trefx > refx || trefy > refy)
throw new IIOException(I18N.getString("J2KImageWriter4"));
// Instantiate tiler
Tiler imgtiler = new Tiler(imgsrc,refx,refy,trefx,trefy,tw,th);
// Creates the forward component transform
ForwCompTransf fctransf = new ForwCompTransf(imgtiler, j2kwparam);
// Creates ImgDataConverter
ImgDataConverter converter = new ImgDataConverter(fctransf);
// Creates ForwardWT (forward wavelet transform)
ForwardWT dwt = ForwardWT.createInstance(converter, j2kwparam);
// Creates Quantizer
Quantizer quant = Quantizer.createInstance(dwt,j2kwparam);
// Creates ROIScaler
ROIScaler rois = ROIScaler.createInstance(quant, j2kwparam);
// Creates EntropyCoder
EntropyCoder ecoder =
EntropyCoder.createInstance(rois, j2kwparam,
j2kwparam.getCodeBlockSize(),
j2kwparam.getPrecinctPartition(),
j2kwparam.getBypass(),
j2kwparam.getResetMQ(),
j2kwparam.getTerminateOnByte(),
j2kwparam.getCausalCXInfo(),
j2kwparam.getCodeSegSymbol(),
j2kwparam.getMethodForMQLengthCalc(),
j2kwparam.getMethodForMQTermination());
// Rely on rate allocator to limit amount of data
File tmpFile = File.createTempFile("jiio-", ".tmp");
tmpFile.deleteOnExit();
// Creates CodestreamWriter
FileCodestreamWriter bwriter =
new FileCodestreamWriter(tmpFile, Integer.MAX_VALUE);
// Creates the rate allocator
float rate = (float)j2kwparam.getEncodingRate();
PostCompRateAllocator ralloc =
PostCompRateAllocator.createInstance(ecoder,
rate,
bwriter,
j2kwparam);
// Instantiates the HeaderEncoder
HeaderEncoder headenc =
new HeaderEncoder(imgsrc, imsigned, dwt, imgtiler,
j2kwparam, rois,ralloc);
ralloc.setHeaderEncoder(headenc);
// Writes header to be able to estimate header overhead
headenc.encodeMainHeader();
//Initializes rate allocator, with proper header
// overhead. This will also encode all the data
try {
ralloc.initialize();
} catch (RuntimeException e) {
if (WRITE_ABORTED.equals(e.getMessage())) {
bwriter.close();
tmpFile.delete();
processWriteAborted();
return;
} else throw e;
}
// Write header (final)
headenc.reset();
headenc.encodeMainHeader();
// Insert header into the codestream
bwriter.commitBitstreamHeader(headenc);
// Now do the rate-allocation and write result
ralloc.runAndWrite();
//Done for data encoding
bwriter.close();
// Calculate file length
int fileLength = bwriter.getLength();
// Tile-parts and packed packet headers
int pktspertp = j2kwparam.getPacketPerTilePart();
int ntiles = imgtiler.getNumTiles();
if (pktspertp>0 || pphTile || pphMain){
CodestreamManipulator cm =
new CodestreamManipulator(tmpFile, ntiles, pktspertp,
pphMain, pphTile, tempSop,
tempEph);