/* * $Id: $ * * Copyright (c) 1999-2007 Telemis SA. All Rights Reserved * * Author: Patrick Piscaglia, Telemis s.a. */ package org.openJpeg; import java.io.File; import java.util.Vector; /** This class encodes one image into the J2K format, * using the OpenJPEG.org library. * To be able to log messages, the called must register a IJavaJ2KEncoderLogger object. */ public class OpenJPEGJavaEncoder { public interface IJavaJ2KEncoderLogger { public void logEncoderMessage(String message); public void logEncoderError(String message); } private static boolean isInitialized = false; // ===== Compression parameters =============> // These value may be changed for each image private String[] encoder_arguments = null; /** number of resolutions decompositions */ private int nbResolutions = -1; /** the quality layers, expressed as compression rate */ private float[] ratioLayers = null; /** the quality layers, expressed as PSNR values. This variable, if defined, has priority over the ratioLayers variable */ private float[] psnrLayers = null; /** Contains the 8 bpp version of the image. May NOT be filled together with image16 or image24.
* We store the 8 or 16 bpp version of the original image while the encoder uses a 32 bpp version, because
* It returns the compressed J2K codestream into the compressedStream byte[].
* It also returns the compression index as a compressed form, into the compressedIndex byte[].
* One of the image8, image16 or image24 arrays must be correctly initialized and filled.
* The width, height and depth variables must be correctly filled.
* The nbResolutions, nbLayers and if needed the float[] psnrLayers or ratioLayers must also be filled before calling this method.
*/
public void encodeImageToJ2K() {
// Need to allocate / reallocate the compressed stream buffer ? (size = max possible size = original image size)
if (compressedStream== null || (compressedStream.length != width*height*depth/8)) {
logMessage("OpenJPEGJavaEncoder.encodeImageToJ2K: (re-)allocating " + (width*height*depth/8) + " bytes for the compressedStream");
compressedStream = new byte[width*height*depth/8];
}
// Arguments =
// - number of resolutions "-n 5" : 2
// - size of tile "-t 512,512" : 2
//
// Image width, height, depth and pixels are directly fetched by C from the Java class
int nbArgs = 2 + (tileSize == -1 ? 0 : 2) + (encoder_arguments != null ? encoder_arguments.length : 0);
if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0] != 0)
// If psnrLayers is defined and doesn't just express "lossless"
nbArgs += 2;
else if (ratioLayers != null && ratioLayers.length>0 && ratioLayers[0]!=0.0)
nbArgs += 2;
String[] arguments = new String[nbArgs];
int offset = 0;
arguments[offset] = "-n"; arguments[offset+1] = "" + nbResolutions; offset += 2;
if (tileSize!= -1) {
arguments[offset++] = "-t";
arguments[offset++] = "" + tileSize + "," + tileSize;
}
// If PSNR layers are defined, use them to encode the images
if (psnrLayers != null && psnrLayers.length>0 && psnrLayers[0]!=-1) {
arguments[offset++] = "-q";
String s = "";
for (int i=0; i