📄 imagedata.java
字号:
/*
* 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 + -