com.brownsoft.codec
Class KLTEncoder

java.lang.Object
  extended bycom.brownsoft.codec.KLTEncoder
All Implemented Interfaces:
KLTConstants

public class KLTEncoder
extends java.lang.Object
implements KLTConstants

Title: Proyecto Codificacion de Imagenes y Video

Description:

Esta clase implementa un codificador de imágenes a color y B/N aplicando la transformación de Karhunen-Loève

Copyright: Copyright (c) 2004

Company:

Version:
1.0
Author:
Gustavo Brown (alegus@adinet.com.uy)

Field Summary
protected  int BLOCK_SIZE
           
protected  int BLOCK_WIDTH
           
private  int cantBands
           
private  int coefficients
           
private  java.lang.String comment
           
private  int currentBand
           
private  int currentBandLeastUsedCoeff
           
private  java.io.DataOutputStream dataStream
           
static boolean DEBUG
           
private  boolean embedKLTVectors
           
private  java.lang.String externalKLTBaseInputName
           
private  java.lang.String externalKLTBaseOutputName
           
private  HuffmanMultiplexerBitInputStream externalKLTReader
           
private  HuffmanMultiplexerBitStream externalKLTWriter
           
private  HuffmanMultiplexerBitStream huffmanMultiplexer
           
private  java.awt.Image image
           
private  int imageHeight
           
private  double[][][] imageMatrix
           
private  double[][][] imageMatrixYCrCb
           
private  byte imageType
           
private  int[] imageVector
           
private  int imageWidth
           
private  byte outputImageType
           
private  int quality
           
private  boolean showBands
           
private  boolean showProgress
           
private  java.io.ByteArrayOutputStream stream
           
private  boolean useExternalKLTBase
           
private  boolean writeExternalKLTBase
           
 
Fields inherited from interface com.brownsoft.codec.KLTConstants
AC_CHANNEL_BASE, AC_QUANTIZER, AC_QUANTIZER_CrCb, AC_QUANTIZER_FACTOR, AXIS_Cb, AXIS_Cr, AXIS_Y, BLUE, DC_CHANNEL, DC_QUANTIZER, EOB, FORMAT_STRING, FRACTION_MULTIPLIER, GRAY, GREEN, IMAGE_DEFAULT, IMAGE_GRAY, IMAGE_RGB, IMAGE_YCrCb, KLT_COEFF_MULTIPLIER, LOG_2, QUALITY_BEST, QUALITY_BETTER, QUALITY_GOOD, QUALITY_LOW, RED, subsampling_x, subsampling_y
 
Constructor Summary
KLTEncoder(java.awt.Image image)
          Crea una instancia de KLTEncoder
 
Method Summary
private  void compressImage()
          Aplica la KLT a la imagen con el factor de calidad deseado y obtiene los coeficientes tanto de la base como de la propia transformación
private  double dequantizeAC(double value, int curCoef)
          Decuantifica un componente de alterna
private  double dequantizeDC(double value)
          Decuantifica el componente de continua
private  byte[] encode()
          Codifica la imagen y retorna un bytearray con el contenido
private  double encodeBlock(double[] vector, double lastDC)
          Codifica un bloque de la imagen
 byte[] encodeImage()
          Codifica la imagen retornando un array de bytes
 void encodeImage(java.lang.String outputFileName)
          Codifica la imagen y escribe el archivo de salida
private  java.lang.String getBandName(int band)
          Obtiene el nombre asociado a un canal
 int getBlockSize()
          Obtiene el tamaño(lado) de los bloques
private  int getCantBitsNeeded(double value)
          Retorna la cantidad de bits que se necesita para expresar una magnitud
 java.lang.String getComment()
          Obtiene el comentario de la imagen
private  double getDoubleFromVLI(HuffmanMultiplexerBitInputStream huffmanDecoder, int cantBitsNeeded)
          Obtiene un double a partir de un VariableLengthInteger
 boolean getEmbedKLTVectors()
          Retorna si embeber los vectores de la base de la KLT
private  byte getFlags()
          Obtiene las flags de la imagen
protected  double[][] getImageMatrix(int band)
          Obtiene la matriz de un canal de la imagen
 java.lang.String getKLTBaseInputName()
          Obtiene el nombre del archivo de donde obtener la base de la KLT o null si debe ser calculado
 java.lang.String getKLTBaseOutputName()
          Obtiene el nombre del archivo donde almacenar la base de la KLT
 int getNumberOfCoefficients()
          Retorna la cantidad de coeficientes de la base a utilizar
 byte getOutputImageType()
          Indica el tipo de imagen de salida
 int getQuality()
          Obtiene la calidad de compresion de la imagen
 boolean getShowBands()
          Retorna si se mostraran las bandas al codificar la imagen
 boolean getShowProgress()
          Indica si se va a mostrar progreso de la codificacion
private  int getVLI(int cantBitsNeeded, double value)
          Obtiene un VariableLengthInteger
private  boolean isZero(double value)
          Retorna true si el valor pasado por argumento se considera nulo
private  void openExternalKLTBase()
          Abre un archivo de base de la KLT (.kltc)
private  double quantizeAC(double value, int curCoef)
          Cuantifica un componente de alterna
private  double quantizeDC(double value)
          Cuantifica el componente de continua
 void setBlockSize(int blockSize)
          Setea el tamaño(lado) de los bloques
 void setComment(java.lang.String comment)
          Setea el comentario de la imagen
 void setEmbedKLTVectors(boolean embedKLTVectors)
          Indica si embeber los vectores de la base de la KLT
private  void setImageMatrix()
          Setea la informacion sobre la imagen de entrada y su matriz asociada
private  void setImageMatrixYCrCb()
          Calcula la matrix en el espacio YCrCb
 void setKLTBaseName(java.lang.String kltBaseName)
          Indica que utilice la base de la klt a partir del archivo pasado por argumento
 void setKLTBaseOutputName(java.lang.String externalKLTBase)
          Setea si se desea crear la base de la KLT en un archivo separado
 void setNumberOfCoefficients(int coefficients)
          Setea la cantidad de coeficientes de la base a utilizar
 void setOutputImageType(byte outputImageType)
          Setea el tipo de la imagen de salida
 void setQuality(int quality)
          Setea la calidad de la compresión
 void setShowBands(boolean showBands)
          Indica si se desea mostrar las bandas que se van codificando
 void setShowProgress(boolean showProgress)
          Setea si se desea ir mostrando un progreso de la codificación
private  void writeHeader()
          Escribe el header
private  void writeString(java.lang.String str)
          Escribe un String en el stream
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

BLOCK_SIZE

protected int BLOCK_SIZE

BLOCK_WIDTH

protected int BLOCK_WIDTH

cantBands

private int cantBands

coefficients

private int coefficients

comment

private java.lang.String comment

currentBand

private int currentBand

currentBandLeastUsedCoeff

private int currentBandLeastUsedCoeff

dataStream

private java.io.DataOutputStream dataStream

DEBUG

public static final boolean DEBUG
See Also:
Constant Field Values

embedKLTVectors

private boolean embedKLTVectors

externalKLTBaseInputName

private java.lang.String externalKLTBaseInputName

externalKLTBaseOutputName

private java.lang.String externalKLTBaseOutputName

externalKLTReader

private HuffmanMultiplexerBitInputStream externalKLTReader

externalKLTWriter

private HuffmanMultiplexerBitStream externalKLTWriter

huffmanMultiplexer

private HuffmanMultiplexerBitStream huffmanMultiplexer

image

private java.awt.Image image

imageHeight

private int imageHeight

imageMatrix

private double[][][] imageMatrix

imageMatrixYCrCb

private double[][][] imageMatrixYCrCb

imageType

private byte imageType

imageVector

private int[] imageVector

imageWidth

private int imageWidth

outputImageType

private byte outputImageType

quality

private int quality

showBands

private boolean showBands

showProgress

private boolean showProgress

stream

private java.io.ByteArrayOutputStream stream

useExternalKLTBase

private boolean useExternalKLTBase

writeExternalKLTBase

private boolean writeExternalKLTBase
Constructor Detail

KLTEncoder

public KLTEncoder(java.awt.Image image)
Crea una instancia de KLTEncoder

Parameters:
image - La imagen a codificar
Method Detail

compressImage

private void compressImage()
                    throws java.io.IOException
Aplica la KLT a la imagen con el factor de calidad deseado y obtiene los coeficientes tanto de la base como de la propia transformación

Throws:
java.io.IOException

dequantizeAC

private double dequantizeAC(double value,
                            int curCoef)
Decuantifica un componente de alterna


dequantizeDC

private double dequantizeDC(double value)
Decuantifica el componente de continua


encode

private byte[] encode()
               throws java.io.IOException
Codifica la imagen y retorna un bytearray con el contenido

Throws:
java.io.IOException

encodeBlock

private double encodeBlock(double[] vector,
                           double lastDC)
Codifica un bloque de la imagen

Parameters:
vector - Vector de coeficientes del bloque
lastDC - el coeficiente de continua del bloque anterior
Returns:
double El coeficiente de continua actual

encodeImage

public byte[] encodeImage()
                   throws KLTException,
                          java.io.IOException
Codifica la imagen retornando un array de bytes

Throws:
KLTException
java.io.IOException

encodeImage

public void encodeImage(java.lang.String outputFileName)
                 throws KLTException,
                        java.io.IOException
Codifica la imagen y escribe el archivo de salida

Throws:
KLTException
java.io.IOException

getBandName

private java.lang.String getBandName(int band)
Obtiene el nombre asociado a un canal

Parameters:
band - Canal
Returns:
Nombre asociado a un canal

getBlockSize

public int getBlockSize()
Obtiene el tamaño(lado) de los bloques


getCantBitsNeeded

private int getCantBitsNeeded(double value)
Retorna la cantidad de bits que se necesita para expresar una magnitud


getComment

public java.lang.String getComment()
Obtiene el comentario de la imagen


getDoubleFromVLI

private double getDoubleFromVLI(HuffmanMultiplexerBitInputStream huffmanDecoder,
                                int cantBitsNeeded)
                         throws java.io.IOException
Obtiene un double a partir de un VariableLengthInteger

Parameters:
huffmanDecoder - el HuffmanMultiplexerBitInputStream con el stream de entrada
cantBitsNeeded - cantidad de bits de este VLI
Throws:
java.io.IOException

getEmbedKLTVectors

public boolean getEmbedKLTVectors()
Retorna si embeber los vectores de la base de la KLT


getFlags

private byte getFlags()
Obtiene las flags de la imagen


getImageMatrix

protected double[][] getImageMatrix(int band)
Obtiene la matriz de un canal de la imagen

Parameters:
band - Canal a obtener
Returns:
double[][] con la matriz de ese canal

getKLTBaseInputName

public java.lang.String getKLTBaseInputName()
Obtiene el nombre del archivo de donde obtener la base de la KLT o null si debe ser calculado

Returns:
Nombre del archivo de donde obtener la base de la KLT o null si la misma debe ser calculada

getKLTBaseOutputName

public java.lang.String getKLTBaseOutputName()
Obtiene el nombre del archivo donde almacenar la base de la KLT

Returns:
Nombre del archivo donde se almacenara la base de la KLT
See Also:
setEmbedKLTVectors

getNumberOfCoefficients

public int getNumberOfCoefficients()
Retorna la cantidad de coeficientes de la base a utilizar

Returns:
cantidad de coeficientes de la base a utilizar

getOutputImageType

public byte getOutputImageType()
Indica el tipo de imagen de salida

Returns:
Una de las constantes IMAGE_DEFAULT, IMAGE_GRAY, IMAGE_RGB o IMAGE_YCrCb

getQuality

public int getQuality()
Obtiene la calidad de compresion de la imagen


getShowBands

public boolean getShowBands()
Retorna si se mostraran las bandas al codificar la imagen


getShowProgress

public boolean getShowProgress()
Indica si se va a mostrar progreso de la codificacion


getVLI

private int getVLI(int cantBitsNeeded,
                   double value)
Obtiene un VariableLengthInteger


isZero

private boolean isZero(double value)
Retorna true si el valor pasado por argumento se considera nulo


openExternalKLTBase

private void openExternalKLTBase()
                          throws java.io.IOException
Abre un archivo de base de la KLT (.kltc)

Throws:
java.io.IOException

quantizeAC

private double quantizeAC(double value,
                          int curCoef)
Cuantifica un componente de alterna


quantizeDC

private double quantizeDC(double value)
Cuantifica el componente de continua


setBlockSize

public void setBlockSize(int blockSize)
                  throws KLTException
Setea el tamaño(lado) de los bloques

Throws:
KLTException

setComment

public void setComment(java.lang.String comment)
Setea el comentario de la imagen


setEmbedKLTVectors

public void setEmbedKLTVectors(boolean embedKLTVectors)
Indica si embeber los vectores de la base de la KLT


setImageMatrix

private void setImageMatrix()
Setea la informacion sobre la imagen de entrada y su matriz asociada


setImageMatrixYCrCb

private void setImageMatrixYCrCb()
Calcula la matrix en el espacio YCrCb


setKLTBaseName

public void setKLTBaseName(java.lang.String kltBaseName)
Indica que utilice la base de la klt a partir del archivo pasado por argumento


setKLTBaseOutputName

public void setKLTBaseOutputName(java.lang.String externalKLTBase)
Setea si se desea crear la base de la KLT en un archivo separado

Parameters:
externalKLTBase - Nombre del archivo donde almacenar la base de la KLT
See Also:
setEmbedKLTVectors

setNumberOfCoefficients

public void setNumberOfCoefficients(int coefficients)
                             throws KLTException
Setea la cantidad de coeficientes de la base a utilizar

Parameters:
coefficients - Cantidad de coeficientes a utilizar
Throws:
KLTException

setOutputImageType

public void setOutputImageType(byte outputImageType)
                        throws KLTException
Setea el tipo de la imagen de salida

Parameters:
outputImageType - tipo de la imagen de salida (IMAGE_DEFAULT, IMAGE_GRAY, IMAGE_RGB o IMAGE_YCrCb)
Throws:
KLTException

setQuality

public void setQuality(int quality)
                throws KLTException
Setea la calidad de la compresión

Throws:
KLTException

setShowBands

public void setShowBands(boolean showBands)
Indica si se desea mostrar las bandas que se van codificando


setShowProgress

public void setShowProgress(boolean showProgress)
Setea si se desea ir mostrando un progreso de la codificación

Parameters:
showProgress - boolean que indica si mostrar progreso

writeHeader

private void writeHeader()
                  throws java.io.IOException
Escribe el header

Throws:
java.io.IOException

writeString

private void writeString(java.lang.String str)
                  throws java.io.IOException
Escribe un String en el stream

Throws:
java.io.IOException