📄 anwtfilterspec.java
字号:
// Check that default value has been specified
if(getDefault()==null){
int ndefspec = 0;
for(int t=nt-1; t>=0; t--){
for(int c=nc-1; c>=0 ; c--){
if(specValType[t][c] == SPEC_DEF){
ndefspec++;
}
}
}
// If some tile-component have received no specification, it takes
// the default value defined in ParameterList
if(ndefspec!=0){
if( ((String)qts.getDefault()).equals("reversible") )
setDefault(parseFilters(REV_FILTER_STR));
else
setDefault(parseFilters(NON_REV_FILTER_STR));
}
else{
// All tile-component have been specified, takes the first
// tile-component value as default.
setDefault(getTileCompVal(0,0));
switch(specValType[0][0]){
case SPEC_TILE_DEF:
for(int c=nc-1; c>=0; c--){
if(specValType[0][c]==SPEC_TILE_DEF)
specValType[0][c] = SPEC_DEF;
}
tileDef[0] = null;
break;
case SPEC_COMP_DEF:
for(int t=nt-1; t>=0; t--){
if(specValType[t][0]==SPEC_COMP_DEF)
specValType[t][0] = SPEC_DEF;
}
compDef[0] = null;
break;
case SPEC_TILE_COMP:
specValType[0][0] = SPEC_DEF;
tileCompVal.put("t0c0",null);
break;
}
}
}
// Check consistency between filter and quantization type
// specification
for(int t=nt-1;t>=0;t--){
for(int c=nc-1;c>=0;c--){
// Reversible quantization
if( ((String)qts.getTileCompVal(t,c)).equals("reversible")){
// If filter is reversible, it is OK
if(isReversible(t,c)) continue;
// If no filter has been defined, use reversible filter
if(!isFilterSpecified){
setTileCompVal(t,c,parseFilters(REV_FILTER_STR));
}
else{
// Non reversible filter specified -> Error
throw new IllegalArgumentException("Filter of "+
"tile-component"+
" ("+t+","+c+") does"+
" not allow "+
"reversible "+
"quantization. "+
"Specify '-Qtype "+
"expounded' or "+
"'-Qtype derived'"+
"in "+
"the command line.");
}
}
else{ // No reversible quantization
// No reversible filter -> OK
if(!isReversible(t,c)) continue;
// If no filter has been specified, use non-reversible
// filter
if(!isFilterSpecified){
setTileCompVal(t,c,parseFilters(NON_REV_FILTER_STR));
}
else{
// Reversible filter specified -> Error
throw new IllegalArgumentException("Filter of "+
"tile-component"+
" ("+t+","+c+") does"+
" not allow "+
"non-reversible "+
"quantization. "+
"Specify '-Qtype "+
"reversible' in "+
"the command line");
}
}
}
}
}
/**
* Parse filters from the given word
*
* @param word String to parse
*
* @return Analysis wavelet filter (first dimension: by direction,
* second dimension: by decomposition levels)
*/
private AnWTFilter[][] parseFilters(String word){
AnWTFilter[][] filt=new AnWTFilter[2][1];
if(word.equalsIgnoreCase("w5x3")){
filt[0][0]=new AnWTFilterIntLift5x3();
filt[1][0]=new AnWTFilterIntLift5x3();
return filt;
}
else if(word.equalsIgnoreCase("w9x7")){
filt[0][0]=new AnWTFilterFloatLift9x7();
filt[1][0]=new AnWTFilterFloatLift9x7();
return filt;
}
else{
throw new
IllegalArgumentException("Non JPEG 2000 part I filter: "
+word);
}
}
/**
* Returns the data type used by the filters in this object, as defined in
* the 'DataBlk' interface for specified tile-component.
*
* @param t Tile index
*
* @param c Component index
*
* @return The data type of the filters in this object
*
* @see jj2000.j2k.image.DataBlk
* */
public int getWTDataType(int t,int c){
AnWTFilter[][] an = (AnWTFilter[][])getSpec(t,c);
return an[0][0].getDataType();
}
/**
* Returns the horizontal analysis filters to be used in component 'n' and
* tile 't'.
*
* <P>The horizontal analysis filters are returned in an array of
* AnWTFilter. Each element contains the horizontal filter for each
* resolution level starting with resolution level 1 (i.e. the analysis
* filter to go from resolution level 1 to resolution level 0). If there
* are less elements than the maximum resolution level, then the last
* element is assumed to be repeated.
*
* @param t The tile index, in raster scan order
*
* @param c The component index.
*
* @return The array of horizontal analysis filters for component 'n' and
* tile 't'.
* */
public AnWTFilter[] getHFilters(int t, int c) {
AnWTFilter[][] an = (AnWTFilter[][])getSpec(t,c);
return an[0];
}
/**
* Returns the vertical analysis filters to be used in component 'n' and
* tile 't'.
*
* <P>The vertical analysis filters are returned in an array of
* AnWTFilter. Each element contains the vertical filter for each
* resolution level starting with resolution level 1 (i.e. the analysis
* filter to go from resolution level 1 to resolution level 0). If there
* are less elements than the maximum resolution level, then the last
* element is assumed to be repeated.
*
* @param t The tile index, in raster scan order
*
* @param c The component index.
*
* @return The array of horizontal analysis filters for component 'n' and
* tile 't'.
* */
public AnWTFilter[] getVFilters(int t,int c) {
AnWTFilter[][] an = (AnWTFilter[][])getSpec(t,c);
return an[1];
}
/** Debugging method */
public String toString(){
String str = "";
AnWTFilter[][] an;
str += "nTiles="+nTiles+"\nnComp="+nComp+"\n\n";
for(int t=0; t<nTiles; t++){
for(int c=0; c<nComp; c++){
an = (AnWTFilter[][])getSpec(t,c);
str += "(t:"+t+",c:"+c+")\n";
// Horizontal filters
str += "\tH:";
for(int i=0; i<an[0].length; i++)
str += " "+an[0][i];
// Horizontal filters
str += "\n\tV:";
for(int i=0; i<an[1].length; i++)
str += " "+an[1][i];
str += "\n";
}
}
return str;
}
/**
* Check the reversibility of filters contained is the given
* tile-component.
*
* @param t The index of the tile
*
* @param c The index of the component
* */
public boolean isReversible(int t,int c){
// Note: no need to buffer the result since this method is
// normally called once per tile-component.
AnWTFilter[]
hfilter = getHFilters(t,c),
vfilter = getVFilters(t,c);
// As soon as a filter is not reversible, false can be returned
for(int i=hfilter.length-1; i>=0; i--)
if(!hfilter[i].isReversible() || !vfilter[i].isReversible())
return false;
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -