1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| /**
* Extension du LookupOp de la bibliothèque standard qui gère :
* - les canaux alpha
* - les ColorModel de type IndexColorModel
*
* @author florent
*
*/
public class LookupOperator extends SimpleOperator {
short[][] mLutTable;
short[] sLutTable;
public LookupOperator(short[][] mLutTable) {
this.mLutTable = mLutTable;
}
public LookupOperator(short[] sLutTable) {
this.sLutTable = sLutTable;
}
public void compute(BufferedImage output, BufferedImage input) {
if(input.getWidth()!=output.getWidth()||input.getHeight()!=output.getHeight())
throw new IllegalArgumentException("Width and Height for input/output different");
int nbComponents= input.getColorModel().getNumComponents();
boolean hasAlpha = input.getColorModel().hasAlpha();
if(mLutTable==null) {
if(hasAlpha)
mLutTable = new short[][] {sLutTable, sLutTable, sLutTable, PredefinedLUT.getIdemLUT()};
else
mLutTable = new short[][] {sLutTable, sLutTable, sLutTable};
}
if(input.getColorModel() instanceof IndexColorModel) {
for(int y=0; y<output.getHeight(); y++)
for(int x=0; x<output.getWidth(); x++) {
int rgb = input.getRGB(x, y);
int iR;
int iG;
int iB;
if(nbComponents>=3) {
iR = mLutTable[0][(rgb >> 16) & 0xFF];
iG = mLutTable[1][(rgb >> 8) & 0xFF];
iB = mLutTable[2][rgb & 0xFF];
}
else {
iR = iG = iB = mLutTable[0][rgb&0xFF];
}
if(hasAlpha)
output.setRGB(x,y, (rgb>>24&0xFF)<<24 + (iR<<16)+(iG<<8)+iB);
else
output.setRGB(x,y, (iR<<16)+(iG<<8)+iB);
}
}
else {
LookupOp op = new LookupOp(new ShortLookupTable(0,mLutTable), null);
op.filter(input, output);
}
}
} |
Partager