package fr.unistra.pelican.util.remotesensing; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import fr.unistra.pelican.ByteImage; import fr.unistra.pelican.DoubleImage; import fr.unistra.pelican.Image; import fr.unistra.pelican.IntegerImage; /** * Loads an image (in BIL format) into an Image * @author Clément Hengy */ public final class BILReader extends BinReader { public BILReader(HdrReader h, String p){ this.hr = h; this.path = new File(p).getAbsoluteFile(); } public Image getPelicanImage() { int xi, yi, bi, bytesNumber, blockLenght; File[] subFiles; byte[] tab; File binaryFile = null; String hdrPathRadical; FileInputStream fis; ByteBuffer bf; xi = hr.getCols(); yi = hr.getLines(); bi = hr.getBands(); bytesNumber = hr.getBytesNumber(); blockLenght = xi*bi; hdrPathRadical = this.path.getName().substring(0, this.path.getName().length()-4); subFiles = this.path.getParentFile().listFiles(); for(int i = 0; i < subFiles.length && (null == binaryFile); ++i){ String fileName = subFiles[i].getName(); if(fileName.equals(hdrPathRadical) || fileName.equals(hdrPathRadical+".img") || fileName.endsWith(hdrPathRadical+".IMG") || fileName.endsWith(hdrPathRadical+".bil") || fileName.endsWith(hdrPathRadical+".BIL")) binaryFile = subFiles[i]; } if(null == binaryFile){ System.err.println("getPelicanImage() : Unable to find the associated binary file"); return null; } try{ fis = new FileInputStream(binaryFile); } catch(FileNotFoundException ex){ System.err.println("getPelicanImage() : Unable to open the associated binary file"); return null; } tab = new byte[xi*yi*bi*bytesNumber]; try{ if(fis.read(tab) != tab.length){ System.err.println("getPelicanImage() : Error while reading file, unexpected length"); return null; } } catch(IOException ex){ System.err.println("getPelicanImage() : I/O error"); return null; } bf = ByteBuffer.wrap(tab); if(!hr.getByteOrder()) bf.order(ByteOrder.LITTLE_ENDIAN); switch(hr.getDataType()){ case 1: ByteImage imgcase1 = new ByteImage(xi, yi, 1, 1, bi); for(int b = 0; b < bi; ++b){ for(int y = 0; y < yi; ++y){ for(int x = 0; x < xi; ++x){ byte value = bf.get((b*xi + y*blockLenght + x)*bytesNumber); imgcase1.setPixelXYBByte(x, y, b, value); } } } img=imgcase1; break; case 2: IntegerImage imgcase2 = new IntegerImage(xi, yi, 1, 1, bi); for(int b = 0; b < bi; ++b){ for(int y = 0; y < yi; ++y){ for(int x = 0; x < xi; ++x){ short value = bf.getShort((b*xi + y*blockLenght + x)*bytesNumber); imgcase2.setPixelXYBInt(x, y, b, value); } } } img=imgcase2; break; case 3: IntegerImage imgcase3 = new IntegerImage(xi, yi, 1, 1, bi); for(int b = 0; b < bi; ++b){ for(int y = 0; y < yi; ++y){ for(int x = 0; x < xi; ++x){ int value = bf.getInt((b*xi + y*blockLenght + x)*bytesNumber); imgcase3.setPixelXYBInt(x, y, b, value); } } } img=imgcase3; break; case 4: DoubleImage imgcase4 = new DoubleImage(xi, yi, 1, 1, bi); for(int b = 0; b < bi; ++b){ for(int y = 0; y < yi; ++y){ for(int x = 0; x < xi; ++x){ float value = bf.getFloat((b*xi + y*blockLenght + x)*bytesNumber); imgcase4.setPixelXYBDouble(x, y, b, value); } } } img=imgcase4; break; case 5: DoubleImage imgcase5 = new DoubleImage(xi, yi, 1, 1, bi); for(int b = 0; b < bi; ++b){ for(int y = 0; y < yi; ++y){ for(int x = 0; x < xi; ++x){ double value = bf.getDouble((b*xi + y*blockLenght + x)*bytesNumber); imgcase5.setPixelXYBDouble(x, y, b, value); } } } img=imgcase5; break; case 12: IntegerImage imgcase12 = new IntegerImage(xi, yi, 1, 1, bi); for(int b = 0; b < bi; ++b){ for(int y = 0; y < yi; ++y){ for(int x = 0; x < xi; ++x){ char value = bf.getChar((b*xi + y*blockLenght + x)*bytesNumber); imgcase12.setPixelXYBInt(x, y, b, value); } } } img=imgcase12; break; } super.setProperties(); return img; } public Image getPelicanImage(int sx, int sy, int ex, int ey) { throw new RuntimeException("Not implemented"); } }