Changeset 2971 for trunk


Ignore:
Timestamp:
07/13/07 11:53:48 (13 years ago)
Author:
melissa
Message:

Fixed how non-standard pixel types are handled (no longer throws an exception if bits per sample is not 8, 16 or 32).

File:
1 edited

Legend:

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

    r2905 r2971  
    807807      samplesPerPixel = 3; 
    808808    } 
    809     int bpp = getBitsPerSample(ifd)[0] / 8; 
     809    int bpp = getBitsPerSample(ifd)[0]; 
     810    while ((bpp % 8) != 0) bpp++; 
     811    bpp /= 8; 
    810812    long width = getImageWidth(ifd); 
    811813    long length = getImageLength(ifd); 
     
    12521254      undifference(data, bitsPerSample, imageWidth, planarConfig, predictor); 
    12531255      unpackBytes(samples, 0, data, bitsPerSample, photoInterp, colorMap, 
    1254         littleEndian, maxValue, planarConfig, 0, 1); 
     1256        littleEndian, maxValue, planarConfig, 0, 1, imageWidth); 
    12551257    } 
    12561258    else { 
     
    12801282            unpackBytes(samples, offset, bytes, bitsPerSample, 
    12811283              photoInterp, colorMap, littleEndian, maxValue, planarConfig, 
    1282               strip, (int) numStrips); 
     1284              strip, (int) numStrips, imageWidth); 
    12831285            overallOffset += bytes.length / bitsPerSample.length; 
    12841286          } 
     
    13051307          unpackBytes(samples, offset, bytes, bitsPerSample, photoInterp, 
    13061308            colorMap, littleEndian, maxValue, planarConfig, 
    1307             strip, (int) numStrips); 
     1309            strip, (int) numStrips, imageWidth); 
    13081310          overallOffset += bytes.length / bitsPerSample.length; 
    13091311        } 
     
    13171319        imageWidth, planarConfig, predictor); 
    13181320      unpackBytes(samples, (int) imageWidth, altBytes, bitsPerSample, 
    1319         photoInterp, colorMap, littleEndian, maxValue, planarConfig, 0, 1); 
     1321        photoInterp, colorMap, littleEndian, maxValue, planarConfig, 0, 1, 
     1322        imageWidth); 
    13201323    } 
    13211324 
     
    14001403        (int) imageWidth, (int) imageLength, validBits); 
    14011404    } 
     1405    else if (bitsPerSample[0] == 24) { 
     1406      int[][] intData = new int[samplesPerPixel][samples[0].length / 3]; 
     1407      for (int i=0; i<samplesPerPixel; i++) { 
     1408        for (int j=0; j<intData[i].length; j++) { 
     1409          intData[i][j] = DataTools.bytesToInt(samples[i], j*3, 3,  
     1410            isLittleEndian(ifd));  
     1411        } 
     1412      } 
     1413      return ImageTools.makeImage(intData, (int) imageWidth, (int) imageLength); 
     1414    } 
    14021415    else if (bitsPerSample[0] == 32) { 
    14031416      int type = getIFDIntValue(ifd, SAMPLE_FORMAT); 
     
    15581571  public static void unpackBytes(short[][] samples, int startIndex, 
    15591572    byte[] bytes, int[] bitsPerSample, int photoInterp, int[] colorMap, 
    1560     boolean littleEndian, long maxValue, int planar, int strip, int numStrips) 
    1561     throws FormatException 
     1573    boolean littleEndian, long maxValue, int planar, int strip, int numStrips, 
     1574    long imageWidth) throws FormatException 
    15621575  { 
    15631576    if (planar == 2) { 
     
    15961609    boolean bps16 = bps0 == 16; 
    15971610 
    1598     int width = 0; 
    15991611    int height = 0; 
    16001612    if (photoInterp == CFA_ARRAY) { 
    1601       width = colorMap[colorMap.length - 2]; 
     1613      imageWidth = colorMap[colorMap.length - 2]; 
    16021614      height = colorMap[colorMap.length - 1]; 
    16031615    } 
     1616    else height = (int) (samples[0].length / imageWidth); 
    16041617 
    16051618    int row = 0, col = 0; 
    16061619 
    1607     if (width != 0) row = startIndex / width; 
     1620    if (imageWidth != 0) row = startIndex / (int) imageWidth; 
    16081621 
    16091622    int cw = 0; 
     
    16471660          { 
    16481661            s = (short) bb.getBits(bps0); 
     1662            if ((ndx % imageWidth) == imageWidth - 1) { 
     1663              bb.skipBits((imageWidth * bps0 * sampleCount) % 8);  
     1664            } 
    16491665          } 
    16501666          short b = s; 
    1651  
    16521667          if (photoInterp != CFA_ARRAY) samples[i][ndx] = s; 
    16531668 
     
    16681683          else if (photoInterp == CFA_ARRAY) { 
    16691684            if (i == 0) { 
    1670               int pixelIndex = (row + (count / cw))*width + col + (count % cw); 
     1685              int pixelIndex = (int) ((row + (count / cw))*imageWidth + col +  
     1686                (count % cw)); 
    16711687 
    16721688              samples[colorMap[count]][pixelIndex] = s; 
     
    16761692                count = 0; 
    16771693                col += cw*ch; 
    1678                 if (col == width) col = cw; 
    1679                 else if (col > width) { 
     1694                if (col == imageWidth) col = cw; 
     1695                else if (col > imageWidth) { 
    16801696                  row += ch; 
    16811697                  col = 0; 
     
    17541770        else { 
    17551771          if (numBytes + index < bytes.length) { 
    1756               System.arraycopy(bytes, index, copyByteArray, 0, numBytes); 
    1757           } else { 
    1758               System.arraycopy(bytes, bytes.length - numBytes, copyByteArray, 0, numBytes); 
     1772            System.arraycopy(bytes, index, copyByteArray, 0, numBytes); 
     1773          }  
     1774          else { 
     1775            System.arraycopy(bytes, bytes.length - numBytes, copyByteArray,  
     1776              0, numBytes); 
    17591777          } 
    17601778          index += numBytes; 
Note: See TracChangeset for help on using the changeset viewer.