⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagedata.java

📁 客户端浏览医学图像的jsp源代码。可用于临床工作站。
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * ImageData.java - 夋憸偺忣曬傪曐帩偟偰偄傞僆僽僕僃僋僩
 *
 * Copyright(C) 2000, Nagoya Institute of Technology, Iwata laboratory and Takahiro Katoji
 * http://mars.elcom.nitech.ac.jp/dicom/
 *
 * @author	Takahiro Katoji(mailto:katoco@mars.elcom.nitech.ac.jp)
 * @version
 *
 */

package dicomviewer;

import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.lang.*;
import com.sun.image.codec.jpeg.*;
import java.io.ByteArrayInputStream;
import javax.imageio.ImageIO;

public class ImageData {

  int     debug_level = 5;

  boolean	blackANDwhite = true;				// 敀崟夋憸偺帪true
  boolean rgbMode = false;            // Dicom RGB -> true
  boolean	inv = false;								// 僱僈億僕斀揮
  int			pixel[];										// 夋憸偺奺僺僋僙儖
  int			orgPixel[];									// 僆儕僕僫儖偺夋慺抣
  int     pixLength;                  // 僆儕僕僫儖僺僋僙儖偺挿偝
  int			pixelMin;										// 夋憸嵟彫抣
  int			pixelMax;										// 夋憸嵟戝抣
  int			width;											// 僀儊乕僕暆
  int			height;											// 僀儊乕僕崅偝
  int			histogram[] = new int[256];	// 僸僗僩僌儔儉
  int			histMax;										// 僸僗僩僌儔儉偺嵟戝悢
  int			ww,wl;          						// WW/WL

  // 弶婜帪偺忬懺
  int			defaultPixel[];							// 弶婜帪偺夋慺抣
  int			defaultWidth;								// 弶婜帪偺僀儊乕僕暆
  int			defaultHeight;							// 弶婜帪偺僀儊乕僕崅偝
  int     defaultWW, defaultWL;       // 弶婜帪偺WW/WL

  boolean jpeg_flag = false;
  BufferedImage img;

  Image   image;
  Toolkit toolkit;
  MemoryImageSource source;
  ImageIO imageio;

  // DicomData偐傜奺曄悢偵抣傪僙僢僩偡傞
  public void setData(DicomData dicomData){
    //ImageIO.setUseCache(false);
    // 僨僶僢僌梡
    if (debug_level > 3) System.out.println("Now set width and height....");
    // DicomData偐傜僀儊乕僕偺暆偲崅偝傪媮傔傞
    // String宆傪int宆偵僉儍僗僩偟偰偄傞
    width		= Integer.parseInt(dicomData.getAnalyzedValue("(0028,0011)"));
    height	= Integer.parseInt(dicomData.getAnalyzedValue("(0028,0010)"));
    defaultWidth = width;
    defaultHeight = height;
    // 僨僶僢僌梡
    if (debug_level > 3) System.out.println("Image width  : " + width);
    if (debug_level > 3) System.out.println("Image heigth : " + height);

    // 僨僶僢僌梡
    if (debug_level > 3) System.out.print("Now set byte[] to int[]....");
    // DicomData偺夋慺抣偺byte[]傪int[]偵曄姺偡傞
    orgPixel        = new int[width * height];
    pixLength       = orgPixel.length;
    pixel           = new int[pixLength];
    defaultPixel    = new int[pixLength];

    //jpeg偐偳偆偐
    if(dicomData.getValue("(7fe0,0010)").length <= 10){jpeg_flag = true;}
    byte[] tmpValue;
    
    if(!jpeg_flag){
      tmpValue = new byte[dicomData.getValue("(7fe0,0010)").length];
      System.arraycopy(dicomData.getValue("(7fe0,0010)"), 0, tmpValue, 0, tmpValue.length);
    }else{
      tmpValue = new byte[dicomData.getValue("(fffe,e000)").length];
      System.arraycopy(dicomData.getValue("(fffe,e000)"), 0, tmpValue, 0, tmpValue.length);

      try{
        ByteArrayInputStream bainS = new ByteArrayInputStream(tmpValue);
        //JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(bainS);
        //img = decoder.decodeAsBufferedImage();
        img = imageio.read(bainS);
      }catch(EOFException eof){
        System.out.println("ImageData.EOFException: " + eof.getMessage() );
      }
      catch(IOException ioe){
        System.out.println("ImageData.IOException: " + ioe.getMessage() );
      }
      catch(Exception e){
        System.out.println("ImageData.Exception: " + e.getMessage() );
      }
    }

   if(jpeg_flag){
     int k = 0;
     if(dicomData.isContain("(0028,0004)") && dicomData.getAnalyzedValue("(0028,0004)").trim().equals("RGB")) {
       rgbMode = true;
       for(int i=0;i<height;i++){
         for(int j=0;j<width;j++){
           orgPixel[k] = img.getRGB(j,i)&0x00ffffff;
           k++;
         }
       }
     }else{
       if(dicomData.getAnalyzedValue("(0028,0100)").trim().equals("16")) {
         for(int i=0;i<height;i++){
           for(int j=0;j<width;j++){
             orgPixel[k] = img.getRGB(j,i)&0x0000ffff;
             k++;
           }
         }
       }else{
         for(int i=0;i<height;i++){
           for(int j=0;j<width;j++){
             orgPixel[k] = img.getRGB(j,i)&0x000000ff;
             k++;
           }
         }
       }
     }
   }else{
   
    // 尰嵼僒億乕僩偟偰偄傞偺偼,
    // (0028,0004)Photometric Interpretation 偑RGB
    if(dicomData.isContain("(0028,0004)") &&
        dicomData.getAnalyzedValue("(0028,0004)").trim().equals("RGB")) {
      rgbMode = true;
      for(int i=0; i<pixLength; i++){
        orgPixel[i] = ((255 << 24) |
                       (0xff & tmpValue[3*i]) << 16 |
                       (0xff & tmpValue[(3*i)+1]) << 8 |
                       (0xff & tmpValue[(3*i)+2]) );
      }
    // 傕偟偔偼丄MONOCHROME2偺偲偒丅
    } else {
      // 妱傝摉偰價僢僩偑16bit偺帪
      if(dicomData.getAnalyzedValue("(0028,0100)").trim().equals("16")) {
        short shValue = 0;
        for(int i=0; i<pixLength; i++){
          shValue = (short)((0xff & tmpValue[(2*i)+1]) << 8 |
                            (0xff & tmpValue[2*i]) );
          orgPixel[i] = (int)shValue;
  
        }
      // 妱傝摉偰價僢僩偑8bit偺帪
      }else {
        for(int i=0; i<pixLength; i++)
          orgPixel[i] = (int)(0xff & tmpValue[i]);
      }
      // 奿擺價僢僩丄崅埵價僢僩偺曗惓
      int bit_stored = Integer.parseInt(dicomData.getAnalyzedValue("(0028,0101)"));
      int bit_hight  = Integer.parseInt(dicomData.getAnalyzedValue("(0028,0102)"));
      int bit_gap    = bit_hight - bit_stored +1;
      if(bit_gap > 0) {
        for(int i=0; i<pixLength; i++) orgPixel[i] = (orgPixel[i] >> bit_gap);
      }
    }
   }//aaaaaaaaaaaaaa
    // 弶婜忬懺偺曐懚
    System.arraycopy(orgPixel, 0, defaultPixel, 0, pixLength);
    
    tmpValue = null;

    // 僨僶僢僌梡
    if (debug_level > 3) System.out.print("Now set pixelMin and pixelMax....");
    // 夋憸偺嵟戝抣偲嵟彫抣傪媮傔傞丅
    pixelMin = 0;
    pixelMax = 0;
    for(int i=0; i<pixLength; i++){
      if(pixelMin > orgPixel[i])
      	pixelMin = orgPixel[i];
      if(pixelMax < orgPixel[i])
      	pixelMax = orgPixel[i];
    }
    // 僨僶僢僌梡
    if (debug_level > 3) System.out.println(" OK!");

    // 僨僶僢僌梡
    if (debug_level > 3) System.out.print("Now set WW/WL....");
    // 僨僼僅儖僩WW乛WL偺愝掕
    // DICOM僨乕僞偺拞偵WW/WL偑偁傞偲偒偼丄偦偺抣傪巊偆丅
    if(dicomData.isContain("(0028,1051)") && !jpeg_flag) {
      try {
        ww = Integer.parseInt(dicomData.getAnalyzedValue("(0028,1051)").replace('+', ' ').trim());
      }catch(NumberFormatException e) {
        // 偆傑偔抣傪庢傝弌偣側偄偲偒偼丄寁嶼偱媮傔傞丅
        ww = pixelMax - pixelMin;
      }
    } else {
      ww = pixelMax - pixelMin;
    }
    if(dicomData.isContain("(0028,1050)") && !jpeg_flag) {
      try {
        wl = Integer.parseInt(dicomData.getAnalyzedValue("(0028,1050)").replace('+', ' ').trim());
      }catch(NumberFormatException e) {
        // 偆傑偔抣傪庢傝弌偣側偄偲偒偼丄寁嶼偱媮傔傞丅
        wl = (ww >> 1) + pixelMin;
      }
    } else {
      wl = (ww >> 1) + pixelMin;
    }
    defaultWW = ww;
    defaultWL = wl;
    // 僨僶僢僌梡
    if (debug_level > 3) System.out.println(" OK!");
    if (debug_level > 3) System.out.println("WW :" + ww + " WL :" + wl);

    // 嬻偺僀儊乕僕傪嶌偭偰偍偔丅
    for(int i=0; i < pixel.length; i++) pixel[i] = 0xff000000;
    source = new MemoryImageSource(width, height, pixel, 0, width);
    source.setAnimated(true);
    toolkit = Toolkit.getDefaultToolkit();
    image = toolkit.createImage(source);
     

  }

  // WW/WL偺寁嶼,僇儔乕偺愝掕,僱僈億僕斀揮
  private void contrast() {

    // 僐儞僩儔僗僩曄壔偍傛傃僇儔乕曄壔丅
    if(!rgbMode){
      //int tmp = (int)(ww * 0.5);
      int tmp = ww >> 1;
      int contrastMin = wl - tmp;
      int contrastMax = wl + tmp;

      if(blackANDwhite) {
    	  // 敀崟夋憸
        double invWW = 255d / (double)ww;
        int pix;

        for(int i=0; i<pixLength; i++){
          pix = orgPixel[i];
          if(pix <= contrastMin) pix = 0;
          else if(pix >= contrastMax) pix = 255;
          else
            // 偙傟偑惓偟偄幃
            // pix = (int)Math.round((255*(pix - contrastMin))/ww);
        	  pix = (int)((pix - contrastMin) * invWW);
          pixel[i] = (0xff000000 | (pix << 16) | (pix << 8) | pix);
          // 僱僈億僕斀揮
          if(inv) pixel[i] = ((~pixel[i] & 0x00ffffff) | (pixel[i] & 0xff000000));
        }
      }else {
        // 媅帡僇儔乕
        float invWW = 0.67f / (float)ww;
        int pminWW = ww + contrastMin;
        int pix;
        float hue;

        for(int i=0; i<pixLength; i++){
          pix = orgPixel[i];
          if(pix <= contrastMin) hue = 0.67f;     // 惵(怓憡:4/6)偐傜
          else if(pix >= contrastMax) hue = 0.0f; // 愒傑偱
          else
            // 偙傟偑惓偟偄幃
            // hue = (1.0f - (pix - contrastMin)/ww) * 0.67f;
            hue = (float)(pminWW - pix) * invWW;
          pixel[i] = hue2RGB(hue);
          // 僱僈億僕斀揮
          if(inv) pixel[i] = ((~pixel[i] & 0x00ffffff) | (pixel[i] & 0xff000000));
        }
      }
    }else {
      // Dicom RGB Mode偺偲偒
      System.arraycopy(orgPixel, 0, pixel, 0, pixel.length);
    }
  }

  /**
   * HSB(嵤搙偲柧搙偼1.0偲偡傞)偐傜RGB僇儔乕傪嶌傞儊僜僢僪
   *
   * HSB
   *      0     1/6     2/6     3/6     4/6     5/6     1
   * 怓憡 |------|-------|-------|-------|-------|------|
   *      愒     墿      椢    僔傾儞    惵   儅僛儞僞
   *      0                                             1
   * 嵤搙 |---------------------------------------------|
   *      僌儗乕    扺偄仼          仺弮悎側怓
   *      0                                             1
   * 柧搙 |---------------------------------------------|
   *      崟        埫偄仼          仺柧傞偄
   *
   * @param hue - 怓憡

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -