Changeset 4281


Ignore:
Timestamp:
08/04/08 11:00:18 (12 years ago)
Author:
melissa
Message:

Fixed bug that caused BufferedImages with type TYPE_INT_RGB to be treated as single channel, 32 bits per channel images (they should be 3 channel, 8 bits per channel images).

File:
1 edited

Legend:

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

    r4203 r4281  
    689689  public static byte[][] getPixelBytes(BufferedImage img, boolean little) { 
    690690    Object pixels = getPixels(img); 
     691    int imageType = img.getType(); 
    691692 
    692693    if (pixels instanceof byte[][]) { 
     
    712713    } 
    713714    else if (pixels instanceof int[][]) { 
     715      byte[][] b = null; 
    714716      int[][] in = (int[][]) pixels; 
    715       byte[][] b = new byte[in.length][in[0].length * 4]; 
    716       for (int i=0; i<b.length; i++) { 
    717         for (int j=0; j<in[0].length; j++) { 
    718           int v = in[i][j]; 
    719           if (little) { 
    720             b[i][j*4] = (byte) (v & 0xff); 
    721             b[i][j*4+1] = (byte) ((v >> 8) & 0xff); 
    722             b[i][j*4+2] = (byte) ((v >> 16) & 0xff); 
    723             b[i][j*4+3] = (byte) ((v >> 24) & 0xff); 
     717 
     718      if (imageType == BufferedImage.TYPE_INT_RGB || 
     719        imageType == BufferedImage.TYPE_INT_BGR || 
     720        imageType == BufferedImage.TYPE_INT_ARGB) 
     721      { 
     722        b = new byte[in.length][in[0].length]; 
     723        for (int c=0; c<in.length; c++) { 
     724          for (int i=0; i<in[0].length; i++) { 
     725            if (imageType != BufferedImage.TYPE_INT_BGR) { 
     726              b[c][i] = (byte) (in[c][i] & 0xff); 
     727            } 
     728            else { 
     729              b[in.length - c - 1][i] = (byte) (in[c][i] & 0xff); 
     730            } 
    724731          } 
    725           else { 
    726             b[i][j*4] = (byte) ((v >> 24) & 0xff); 
    727             b[i][j*4+1] = (byte) ((v >> 16) & 0xff); 
    728             b[i][j*4+2] = (byte) ((v >> 8) & 0xff); 
    729             b[i][j*4+3] = (byte) (v & 0xff); 
     732        } 
     733      } 
     734      else { 
     735        b = new byte[in.length][in[0].length * 4]; 
     736        for (int i=0; i<b.length; i++) { 
     737          for (int j=0; j<in[0].length; j++) { 
     738            int v = in[i][j]; 
     739            if (little) { 
     740              b[i][j*4] = (byte) (v & 0xff); b[i][j*4+1] = 
     741                (byte) ((v >> 8) & 0xff); 
     742              b[i][j*4+2] = (byte) ((v >> 16) & 0xff); 
     743              b[i][j*4+3] = (byte) ((v >> 24) & 0xff); 
     744            } 
     745            else { 
     746              b[i][j*4] = (byte) ((v >> 24) & 0xff); 
     747              b[i][j*4+1] = (byte) ((v >> 16) & 0xff); 
     748              b[i][j*4+2] = (byte) ((v >> 8) & 0xff); 
     749              b[i][j*4+3] = (byte) (v & 0xff); 
     750            } 
    730751          } 
    731752        } 
     
    777798  public static int getPixelType(BufferedImage image) { 
    778799    int type = image.getRaster().getDataBuffer().getDataType(); 
     800    int imageType = image.getType(); 
    779801    switch (type) { 
    780802      case DataBuffer.TYPE_BYTE: 
     
    785807        return FormatTools.FLOAT; 
    786808      case DataBuffer.TYPE_INT: 
     809        if (imageType == BufferedImage.TYPE_INT_RGB || 
     810          imageType == BufferedImage.TYPE_INT_BGR || 
     811          imageType == BufferedImage.TYPE_INT_ARGB) 
     812        { 
     813          return FormatTools.UINT8; 
     814        } 
    787815        return FormatTools.INT32; 
    788816      case DataBuffer.TYPE_SHORT: 
    789817        return FormatTools.INT16; 
    790818      case DataBuffer.TYPE_USHORT: 
     819        if (imageType == BufferedImage.TYPE_USHORT_555_RGB || 
     820          imageType == BufferedImage.TYPE_USHORT_565_RGB) 
     821        { 
     822          return FormatTools.UINT8; 
     823        } 
    791824        return FormatTools.UINT16; 
    792825      default: 
Note: See TracChangeset for help on using the changeset viewer.