直接上代碼:
DicomFile dcmFile = DicomFile.Open(filename);
var name = dcmFile.Dataset.GetString(DicomTag.PatientName);
ushort bitStore = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.BitsStored);
ushort bitAlloced = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.BitsAllocated);
ushort simplePerPixel = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.SamplesPerPixel);
ushort width = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.Columns);
ushort height = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.Rows);
int windowCenter = dcmFile.Dataset.GetSingleValue<int>(DicomTag.WindowCenter);
int windowWidth = dcmFile.Dataset.GetSingleValue<int>(DicomTag.WindowWidth);
string modality = dcmFile.Dataset.GetString(DicomTag.Modality);
var gdiImg = new Bitmap(width, height);
if (bitStore > 8)
{
ushort[] datass = dcmFile.Dataset.GetValues<ushort>(DicomTag.PixelData);
ushort maxVal = datass.Max();
ushort minVal = datass.Min();
double compressFactor = byte.MaxValue / (double)(maxVal - minVal) - 0.00000000001;
if (simplePerPixel == 1) // gray
{
System.Drawing.Color c = System.Drawing.Color.Empty;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int grayGDI;
double gray = datass[i*width + j];
//int grayStart = (windowCenter - windowWidth / 2);
//int grayEnd = (windowCenter + windowWidth / 2);
//if (gray < grayStart)
//{
// grayGDI = 0;
//}
//else if (gray > grayEnd)
//{
// grayGDI = 255;
//}
//else
//{
// grayGDI = (int)((gray - grayStart) * 255 / windowWidth);
//}
//if (grayGDI > 255)
//{
// grayGDI = 255;
//}
//else if (grayGDI < 0)
//{
// grayGDI = 0;
//}
//if (modality == "CT")
//{
// grayGDI = 255 - grayGDI;
//}
grayGDI = (int)(gray*compressFactor);
c = System.Drawing.Color.FromArgb(grayGDI, grayGDI, grayGDI);
gdiImg.SetPixel(j,i,c);
}
}
gdiImg.Save(@"e:\dicom2bmp.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
}
else if (simplePerPixel == 3) //RGB
{
//c = Color.FromArgb(pixData[0], pixData[1], pixData[2]);
}
}
else
{
byte[] datas = dcmFile.Dataset.GetValues<byte>(DicomTag.PixelData);
if (simplePerPixel == 1) // gray
{
}
else if (simplePerPixel == 3) //RGB
{
}
}
代碼隻實作了灰階圖像轉換(圖像存儲為OW,OB的代碼基本相同),彩色圖像轉換更簡單。
目前代碼存在的問題是轉為DICOM圖像後失真較嚴重,和直接檢視DICOM檔案有一定的差别。僅供學習參考。
同時圖像存儲的TAG不僅有7FE0,0010,還有7FE0,0008和7FE0,0009,這兩種格式存儲的DICOM檔案暫時還沒有。關于DICOM标準的研究也是在逐漸進行中。
fo-dicom是一個跨平台的DICOM開源庫,目前支援Android,iOS還有電腦。是值得學習的一個開源庫。