Changeset 3189


Ignore:
Timestamp:
09/21/07 09:12:06 (12 years ago)
Author:
melissa
Message:

Added support for JPEG and RLE-compressed DICOM images.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/DicomReader.java

    r3184 r3189  
    2929import java.util.*; 
    3030import loci.formats.*; 
     31import loci.formats.codec.*; 
     32 
     33import javax.imageio.ImageIO; 
     34import javax.imageio.stream.*; 
    3135 
    3236/** 
     
    9397  private byte[][] lut; 
    9498 
     99  private boolean isJPEG = false; 
     100  private boolean isRLE = false; 
     101 
    95102  // -- Constructor -- 
    96103 
     
    143150    } 
    144151 
     152    int plane = core.sizeX[0] * core.sizeY[0] * core.sizeC[0]; 
    145153    int bytes = core.sizeX[0] * core.sizeY[0] * (bitsPerPixel / 8); 
    146154    if (!indexed) bytes *= core.sizeC[0]; 
     
    151159 
    152160    in.seek(offsets + bytes * no); 
     161    if (isRLE) { 
     162      in.skipBytes(67); 
     163      while (in.read() == 0); 
     164      in.seek(in.getFilePointer() - 1); 
     165    } 
    153166    in.read(buf); 
     167 
     168    if (isRLE) { 
     169      PackbitsCodec codec = new PackbitsCodec(); 
     170      buf = codec.decompress(buf); 
     171 
     172      int b = FormatTools.getBytesPerPixel(core.pixelType[0]); 
     173      if (b > 1) { 
     174        byte[][] tmp = new byte[b][plane]; 
     175        for (int i=0; i<b; i++) { 
     176          System.arraycopy(buf, i*plane, tmp[i], 0, plane); 
     177        } 
     178        for (int i=0; i<plane; i++) { 
     179          for (int j=0; j<b; j++) { 
     180            buf[i*b + j] = core.littleEndian[0] ? tmp[b - j - 1][i] : tmp[j][i]; 
     181          } 
     182        } 
     183      } 
     184 
     185      if (buf.length < plane * b) { 
     186        byte[] tmp = buf; 
     187        buf = new byte[plane * b]; 
     188        System.arraycopy(tmp, 0, buf, 0, tmp.length); 
     189      } 
     190    } 
     191 
     192    if (isJPEG) { 
     193      JPEGCodec codec = new JPEGCodec(); 
     194      buf = codec.decompress(buf); 
     195    } 
     196 
    154197    return buf; 
    155198  } 
     
    202245          s = in.readString(elementLength); 
    203246          addInfo(tag, s); 
    204           if (s.indexOf("1.2.4") > -1 || s.indexOf("1.2.5") > -1) { 
     247          if (s.startsWith("1.2.840.10008.1.2.4")) isJPEG = true; 
     248          else if (s.startsWith("1.2.840.10008.1.2.5")) isRLE = true; 
     249          else if (s.indexOf("1.2.4") > -1 || s.indexOf("1.2.5") > -1) { 
    205250            throw new FormatException("Sorry, compressed DICOM images not " + 
    206251              "supported"); 
     
    283328    core.sizeT[0] = 1; 
    284329    core.currentOrder[0] = "XYCZT"; 
    285     core.interleaved[0] = true; 
     330    core.interleaved[0] = !(isJPEG || isRLE); 
    286331 
    287332    // The metadata store we're working with. 
     
    342387    long oldFp = in.getFilePointer(); 
    343388    String info = getHeaderInfo(tag, value); 
     389 
    344390    if (inSequence && info != null && vr != SQ) info = ">" + info; 
    345391    if (info != null && tag != ITEM) { 
     
    524570    int elementWord = in.readShort(); 
    525571    int tag = ((groupWord << 16) & 0xffff0000) | (elementWord & 0xffff); 
     572 
     573    if (tag == PIXEL_DATA && (isRLE || isJPEG)) { 
     574      in.skipBytes(20); 
     575    } 
     576 
    526577    elementLength = getLength(); 
    527578 
Note: See TracChangeset for help on using the changeset viewer.