Changeset 3281


Ignore:
Timestamp:
10/17/07 08:02:47 (12 years ago)
Author:
melissa
Message:

Finished logic to correctly handle signed data.

Location:
trunk/loci
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/DataTools.java

    r3265 r3281  
    395395  } 
    396396 
     397  /** Convert a byte array to a signed byte array. */ 
     398  public static byte[] makeSigned(byte[] b) { 
     399    for (int i=0; i<b.length; i++) { 
     400      b[i] = (byte) (b[i] + 128); 
     401    } 
     402    return b; 
     403  } 
     404 
     405  /** Convert a short array to a signed short array. */ 
     406  public static short[] makeSigned(short[] s) { 
     407    for (int i=0; i<s.length; i++) { 
     408      s[i] = (short) (s[i] + 32768); 
     409    } 
     410    return s; 
     411  } 
     412 
     413  /** Convert an int array to a signed int array. */ 
     414  public static int[] makeSigned(int[] i) { 
     415    for (int j=0; j<i.length; j++) { 
     416      i[j] = (int) (i[j] + 2147483648L); 
     417    } 
     418    return i; 
     419  } 
     420 
    397421  /** 
    398422   * Convert a byte array to the appropriate primitive type array. 
  • trunk/loci/formats/FormatReader.java

    r3278 r3281  
    351351    byte[] buf = openBytes(no); 
    352352 
    353     if (getPixelType() == FormatTools.FLOAT) { 
     353    int pixelType = getPixelType(); 
     354    if (pixelType == FormatTools.FLOAT) { 
    354355      float[] f = 
    355356        (float[]) DataTools.makeDataArray(buf, 4, true, isLittleEndian()); 
     
    358359      return ImageTools.makeImage(f, core.sizeX[series], core.sizeY[series], 
    359360        getRGBChannelCount(), true); 
     361    } 
     362 
     363    boolean signed = pixelType == FormatTools.INT8 || 
     364      pixelType == FormatTools.INT16 || pixelType == FormatTools.INT32; 
     365 
     366    if (signed) { 
     367      if (pixelType == FormatTools.INT8) { 
     368        buf = DataTools.makeSigned(buf); 
     369      } 
     370      else if (pixelType == FormatTools.INT16) { 
     371        short[] s = 
     372          (short[]) DataTools.makeDataArray(buf, 2, false, isLittleEndian()); 
     373        s = DataTools.makeSigned(s); 
     374        for (int i=0; i<s.length; i++) { 
     375          byte high = (byte) (s[i] >> 8); 
     376          byte low = (byte) s[i]; 
     377          buf[i*2] = isLittleEndian() ? low : high; 
     378          buf[i*2 + 1] = isLittleEndian() ? high : low; 
     379        } 
     380      } 
     381      else if (pixelType == FormatTools.INT32) { 
     382        int[] ii = 
     383          (int[]) DataTools.makeDataArray(buf, 4, false, isLittleEndian()); 
     384        ii = DataTools.makeSigned(ii); 
     385        for (int i=0; i<ii.length; i++) { 
     386          buf[i*4] = (byte) (isLittleEndian() ? ii[i] : ii[i] >> 24); 
     387          buf[i*4 + 1] = (byte) (isLittleEndian() ? ii[i] >> 8 : ii[i] >> 16); 
     388          buf[i*4 + 2] = (byte) (isLittleEndian() ? ii[i] >> 16 : ii[i] >> 8); 
     389          buf[i*4 + 3] = (byte) (isLittleEndian() ? ii[i] >> 24 : ii[i]); 
     390        } 
     391      } 
    360392    } 
    361393 
  • trunk/loci/formats/MinMaxCalculator.java

    r3197 r3281  
    251251    } 
    252252 
     253    int pixelType = getPixelType(); 
     254    int bytes = FormatTools.getBytesPerPixel(pixelType); 
     255 
     256    boolean signed = pixelType == FormatTools.INT8 || 
     257      pixelType == FormatTools.INT16 || pixelType == FormatTools.INT32; 
     258 
    253259    WritableRaster pixels = b.getRaster(); 
    254260    for (int x=0; x<b.getWidth(); x++) { 
     
    256262        for (int c=0; c<numRGB; c++) { 
    257263          double v = pixels.getSampleDouble(x, y, c); 
     264          if (signed) { 
     265            long threshold = (long) Math.pow(2, bytes * 8 - 1); 
     266            v -= threshold; 
     267          } 
     268 
    258269          if (v > chanMax[series][cBase + c]) { 
    259270            chanMax[series][cBase + c] = v; 
     
    312323    } 
    313324 
    314     boolean fp = getPixelType() == FormatTools.FLOAT || 
    315       getPixelType() == FormatTools.DOUBLE; 
     325    int pixelType = getPixelType(); 
     326 
     327    boolean fp = pixelType == FormatTools.FLOAT || 
     328      pixelType == FormatTools.DOUBLE; 
     329    boolean signed = pixelType == FormatTools.INT8 || 
     330      pixelType == FormatTools.INT16 || pixelType == FormatTools.INT32; 
    316331 
    317332    for (int i=0; i<pixels; i++) { 
     
    319334        int idx = bytes * (interleaved ? i * numRGB + c : c * pixels + i); 
    320335        long bits = DataTools.bytesToLong(b, idx, bytes, little); 
     336        if (signed) { 
     337          long threshold = (long) Math.pow(2, bytes * 8 - 1); 
     338          if (bits >= threshold) bits -= 2*threshold; 
     339        } 
    321340        double v = fp ? Double.longBitsToDouble(bits) : (double) bits; 
     341 
    322342        if (v > chanMax[series][cBase + c]) { 
    323343          chanMax[series][cBase + c] = v; 
  • trunk/loci/formats/in/DicomReader.java

    r3279 r3281  
    9393  private byte[][] lut; 
    9494  private long[] offsets; 
     95  private int scale; 
    9596 
    9697  private boolean isJPEG = false; 
     
    165166    } 
    166167 
     168    // TODO : correct pixel values according to value of 'scale' 
     169 
    167170    return buf; 
    168171  } 
     
    199202 
    200203    boolean decodingTags = true; 
     204    boolean signed = false; 
    201205 
    202206    while (decodingTags) { 
     
    264268          break; 
    265269        case PIXEL_REPRESENTATION: 
    266           addInfo(tag, in.readShort()); 
     270          short ss = in.readShort(); 
     271          signed = ss == 1; 
     272          addInfo(tag, ss); 
    267273          break; 
    268274        case 537262910: 
     
    270276        case WINDOW_WIDTH: 
    271277        case RESCALE_INTERCEPT: 
     278          String intercept = in.readString(elementLength); 
     279          scale = Integer.parseInt(intercept.trim()); 
     280          addInfo(tag, intercept); 
     281          break; 
    272282        case RESCALE_SLOPE: 
    273283          addInfo(tag, in.readString(elementLength)); 
     
    332342    core.sizeT[0] = 1; 
    333343    core.currentOrder[0] = "XYCZT"; 
    334     //core.interleaved[0] = core.interleaved[0] || !(isJPEG || isRLE); 
    335344    core.metadataComplete[0] = true; 
    336345    core.falseColor[0] = false; 
     
    344353    switch (bitsPerPixel) { 
    345354      case 8: 
    346         core.pixelType[0] = FormatTools.UINT8; 
     355        core.pixelType[0] = signed ? FormatTools.INT8 : FormatTools.UINT8; 
    347356        break; 
    348357      case 16: 
    349         core.pixelType[0] = FormatTools.UINT16; 
     358        core.pixelType[0] = signed ? FormatTools.INT16 : FormatTools.UINT16; 
    350359        break; 
    351360      case 32: 
    352         core.pixelType[0] = FormatTools.UINT32; 
     361        core.pixelType[0] = signed ? FormatTools.INT32 : FormatTools.UINT32; 
    353362        break; 
    354363    } 
  • trunk/loci/formats/tools/ImageInfo.java

    r3201 r3281  
    440440        // check for pixel type mismatch 
    441441        int pixType = ImageTools.getPixelType(images[i - start]); 
    442         if (pixType != pixelType && !fastBlit) { 
     442        if (pixType != pixelType && pixType != pixelType + 1 && !fastBlit) { 
    443443          if (!mismatch) { 
    444444            LogTools.println(); 
  • trunk/loci/plugins/Util.java

    r3280 r3281  
    139139      } 
    140140 
    141       if (signed) { 
    142         for (int i=0; i<q.length; i++) { 
    143           q[i] = (byte) (q[i] - 128); 
    144         } 
    145       } 
     141      if (signed) q = DataTools.makeSigned(q); 
    146142 
    147143      ip = new ByteProcessor(w, h, q, null); 
     
    156152      } 
    157153 
    158       if (signed) { 
    159         for (int i=0; i<q.length; i++) { 
    160           q[i] = (short) (q[i] - 32768); 
    161         } 
    162       } 
     154      if (signed) q = DataTools.makeSigned(q); 
    163155 
    164156      ip = new ShortProcessor(w, h, q, model); 
     
    172164      } 
    173165 
    174       if (signed) { 
    175         for (int i=0; i<q.length; i++) { 
    176           q[i] = (int) (q[i] - 2147483648L); 
    177         } 
    178       } 
     166      if (signed) q = DataTools.makeSigned(q); 
    179167 
    180168      ip = new FloatProcessor(w, h, q); 
Note: See TracChangeset for help on using the changeset viewer.