1. 程式人生 > >開啟DICOM圖片(影象內容轉換為BMP格式)

開啟DICOM圖片(影象內容轉換為BMP格式)

很久前寫的,也其實就實現一個簡單顯示的問題,對於“窗位”,“窗寬”的取值問題,以前在CSDN上提問過,卻沒有得到很好的解決方案。

對與DICOM圖片的開啟也就實現了,“窗位”,“窗寬”標明的。把顯示部分的程式碼放上來,希望對剛接觸DICOM圖片格式的人有點幫助,若有高手希望指點下,“窗寬”,“窗位”的取值問題。

我碰到過三種DICOM圖片:1.窗位,窗寬的標識位後直接標明直接用就行,2.雖然有值確實一個很大的數值,直接引用顯示效果不理想,3、沒有標明數值。

程式碼是VS2003 C++ 寫 的:

void CKlsMsgClientDlg::showdicom(CString filepath)//
{
 unsigned char  *m_pDibBits,*m_pDibBits_Save;
 long DicomData,max,min,k,height,width;
 BITMAPINFOHEADER *m_pBIH;
 BITMAPFILEHEADER * m_pB;
 CFile file;
    CFileException fe;
    if (!file.Open(filepath, CFile::modeRead | CFile::shareDenyWrite, &fe))
    {//以“讀”的方式開啟檔案;
        AfxMessageBox("影象檔案打不開!");

        return;
    }
 if(GetFileAttributes(filepath)  ==  FILE_ATTRIBUTE_DIRECTORY)
 {
  MessageBox("選擇錯誤");

return;
 }
 DWORD dwDibSize;
 dwDibSize = file.GetLength();
 unsigned char *pDib;
 
 
 pDib = new unsigned char[dwDibSize];
 int w_c= 0;
 int w_w =0;
 try
 {
  if (file.Read(pDib, dwDibSize) != dwDibSize)
  {
   delete []pDib;

return;
  }
 }
 catch (CFileException *e)
 {
  e->Delete();
  delete []pDib;

return;
 }
 unsigned char tag1,tag2,tag3,tag4;
 unsigned char *Info;

 
 DWORD win;
 DWORD winWidth;
 int NameLen;
 unsigned char *Name;

 tag1 = 0xe0;
 tag2 = 0x7f;
 tag3 = 0x10;
 tag4 = 0x00;
 for(int i=0;i< dwDibSize;i++)
 {
  if(*(pDib+i) == tag1 && *(pDib+i+1) == tag2 && *(pDib+i+2) == tag3 && *(pDib+i+3) == tag4)
  {
//   InfoLen = (*(pDib+i+6))*65536+(*(pDib+i+5))*256+(*(pDib+i+4));
   Info = pDib+i+8;
   break;
  }
 }
 dwDibSize -= i;

 tag1 = 0x10;
 tag2 = 0x00;
 tag3 = 0x10;
 tag4 = 0x00;
 for(i=0;i<dwDibSize;i++)
 {
  if(*(pDib+i) == tag1 && *(pDib+i+1) == tag2 && *(pDib+i+2) == tag3 && *(pDib+i+3) == tag4)
  {
   //NameLen = (*(pDib+i+6))*65536+(*(pDib+i+5))*256+(*(pDib+i+4));
   Name = (pDib+i+8);
   break;
  }
 }
 CString sname(Name);
 CClientDC dc(this);
// dc.TextOut(400,10,sname);

 tag1 =0x28;
 tag2 = 0x00;
 tag3 = 0x10;
 tag4 = 0x00;//行數
 for(i=0;i<dwDibSize;i++)
 {
  if(*(pDib+i) == tag1 && *(pDib+i+1) == tag2 && *(pDib+i+2) == tag3 && *(pDib+i+3) == tag4)
  {
   height = (*(pDib+i+9))*256+(*(pDib+i+8));
   break;
  }
 }
 tag1 =0x28;
 tag2 = 0x00;
 tag3 = 0x11;
 tag4 = 0x00;//列數
 for(i=0;i<dwDibSize;i++)
 {
  if(*(pDib+i) == tag1 && *(pDib+i+1) == tag2 && *(pDib+i+2) == tag3 && *(pDib+i+3) == tag4)
  {
   width = (*(pDib+i+9))*256+(*(pDib+i+8));
   break;
  }
 }
 tag1 =0x28;
 tag2 = 0x00;
 tag3 = 0x50;
 tag4 = 0x10;//窗位
 long datesize=0;
 win=0;
 for(int i=0;i<dwDibSize;i++)
 {
  if(*(pDib+i) == tag1 && *(pDib+i+1) == tag2 && *(pDib+i+2) == tag3 && *(pDib+i+3) == tag4)
  {
   NameLen=(*(pDib+i+7))*256+(*(pDib+i+6));
   for(int j = 0;j<NameLen ;j++)
   {
    
    if(*(pDib+i+8+j) == 0x2E)
    {
     break;
    }
    w_c ++;
   }
   for(int j=0;j<w_c;j++)
   {
    win= win + ((*(pDib + i+8+j)-48) * pow(10,(w_c-1-j)));
   }
   break;
  }
 }
 w_c=0;
 /////////////
 tag1 =0x28;
 tag2 = 0x00;
 tag3 = 0x51;
 winWidth=0;
 tag4 = 0x10;//窗寬
 for(i=0;i<dwDibSize;i++)
 {
  if(*(pDib+i) == tag1 && *(pDib+i+1) == tag2 && *(pDib+i+2) == tag3 && *(pDib+i+3) == tag4)
  {
   NameLen=(*(pDib+i+7))*256+(*(pDib+i+6));
   for(int j = 0;j<NameLen ;j++)
   {
    
    if(*(pDib+i+8+j) == 0x2E)
    {
     break;
    }
    w_w ++;
   }
   for(int j=0;j<w_w;j++)
   {
    winWidth= winWidth + ((*(pDib + i+8+j)-48) * pow(10,(w_w-1-j)));
   }
   break;
  }
 }
 w_w=0;
 //if(width>1024)
 //{
 // height = height/4;
 // width = width/4;
 //}
 m_pDibBits = new unsigned char [width*height*3];
 m_pDibBits_Save = new unsigned char[width*height*3];
 m_pBIH = new BITMAPINFOHEADER;
 m_pB = new BITMAPFILEHEADER;
 m_pBIH->biSize = 40;
 m_pBIH->biWidth = width;
 m_pBIH->biHeight = height;
 m_pBIH->biPlanes = 1;
 m_pBIH->biBitCount = 24;
 m_pBIH->biSizeImage = 0;
 m_pBIH->biClrUsed = 0;
 m_pBIH->biClrImportant = 0;
 m_pBIH->biCompression = 0;                            //BI_RGB;
 m_pBIH->biXPelsPerMeter = 3780;
 m_pBIH->biYPelsPerMeter = 3780;
 m_pB->bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
 m_pB->bfReserved1=0;
 m_pB->bfReserved2=0;
 m_pB->bfSize =width*height*3 + (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
 m_pB->bfType=0x4d42;

 max=win+winWidth/2;
 min=win-winWidth/2;
    for(k=0;k<width*height;k++)
 {
  DicomData = (*(Info+k*2))+(*(Info+k*2+1))*256;
  if(DicomData < min)
  {
   *(m_pDibBits+k*3) =   0;
   *(m_pDibBits+k*3+1) = 0;
   *(m_pDibBits+k*3+2) = 0;
  }
  else if(DicomData >max)
  {
   *(m_pDibBits+k*3) = 255;
   *(m_pDibBits+k*3+1) = 255;
   *(m_pDibBits+k*3+2) = 255;
  }
  else
  {
   *(m_pDibBits+k*3) =   (DicomData+winWidth/2-win)*256/winWidth;
   *(m_pDibBits+k*3+1) = (DicomData+winWidth/2-win)*256/winWidth;
   *(m_pDibBits+k*3+2) = (DicomData+winWidth/2-win)*256/winWidth;
  }
 }
 for(int i=0;i<height;i++)
 {
  for(int j=0;j<width*3;j++)
  {
   *(m_pDibBits_Save+height*width*3-width*3-i*width*3+j)=*(m_pDibBits+i*width*3 + j);
  }
 }
 int nSize = sizeof(BITMAPFILEHEADER) + (width*height*3) +40;
 BYTE* pBuffer = new BYTE[nSize];
 memcpy(pBuffer,m_pB,sizeof(BITMAPFILEHEADER));
 memcpy(pBuffer + sizeof(BITMAPFILEHEADER),m_pBIH,40);
 memcpy(pBuffer +sizeof(BITMAPFILEHEADER) +40,m_pDibBits_Save,width*height*3);
 CString sFilePathName = "d:\\AF.bmp";
 CFile PictureFile;
 CFileException e;
 if(PictureFile.Open(sFilePathName, CFile::modeWrite |CFile::modeCreate| CFile::typeBinary, &e))
 {
  PictureFile.Write(pBuffer, nSize) ;
  PictureFile.Close();
  delete [] pBuffer;
 }else
 {
  MessageBox("儲存檔案出錯!");
 }
 m_PicShow.ShowPic(sFilePathName);
 m_csPicPath = sFilePathName;
}

相關推薦

開啟DICOM圖片影象內容轉換BMP格式

很久前寫的,也其實就實現一個簡單顯示的問題,對於“窗位”,“窗寬”的取值問題,以前在CSDN上提問過,卻沒有得到很好的解決方案。 對與DICOM圖片的開啟也就實現了,“窗位”,“窗寬”標明的。把顯示部分的程式碼放上來,希望對剛接觸DICOM圖片格式的人有點幫助,若有高手希望

html2canvas 無法渲染網路圖片 JS把圖片轉換base64格式

1、canvas需要本地的圖片 2、在使用html2canvas。大多數時候想動態載入網路的圖片,可是經常在PC端能顯示圖片,到了手機端就顯示不出來了。就是因為圖片跨域的問題引起的 html2canvas不是有配置可以解決跨域了嗎(useCORS: true,allowTaint: tr

python利用百度API進行地理編碼將地名轉換經緯度資訊

更新時間:2018-3-28 更新內容:優化部分程式碼,新增mongodb部分的內容 本文章通過講解如何在百度地圖API申請金鑰,然後在python中呼叫API介面將自有資料中的地名轉換為經緯度座標。 執行環境: python3 一、註冊金鑰

PHP將資料庫查詢內容轉換JSON格式且顯示中文

最近寫android,開始寫伺服器了。最終伺服器的語言就先定為PHP,因為以前寫過一陣子網頁,所以就先用PHP試試水。 那麼首先為了實現android前端與伺服器互動,那麼我們伺服器傳輸的資料就要先變為JSON格式。 那麼如何將資料庫中的內容查詢出來,並且使其轉變為JSON格式呢?程式碼如下

python中,如何將字串轉換數字將數字轉換整型,字串的10轉換整型的10,10.5轉換10

說明:   在實際的應用過程中,有的時候可能會遇到字串的10,需要將字串的10轉換為數字的10   在此記錄下,通過int函式轉換的過程。 操作過程: 1.將字串轉換為整型的10 >>> str1 = "10" #將一個字串的10賦給變數str1 >&g

windows+label使用 2xml檔案 轉換txt檔案

1 在本部落格上篇windows+label使用1後可以生成label的xml檔案後: 2 在darket.exe所在的當前目錄下,新建VOCdevkit資料夾 然後在VOCdevkit資料夾下新建資料夾VOC2018 然後在VOC2018資料夾下新建以下四個資料夾

HTML內容轉換PDF格式------java

為網頁提供PDF檔案支援摘要:在這篇文章裡,Nick Afshartous描述了一種把HTML的內容轉換為PDF格式的方法。這種方法相當有用,比如說,一個web程式可以在它的頁面上提供如“下載為PDF”的功能。這種功能方便了列印和儲存,以供日後使用。Afshartous的轉換

關於時間格式轉換時間戳轉換標準格式/標準格式轉換時間戳

1.將標準時間格式轉化為時間戳 getTimeStamp(str){     var date = new Date(str);     // 可以準確精確到毫秒     var time1 = date.getTime(date);     // 可以準確精確到毫秒  

VS2015 編譯DCMTK,讀取CT影象轉換OpenCV格式

一、DCMTK編譯(-mD/-mDd模式) 0. 材料: DCMTK3.6.2原始碼 CMake VS2015 1. DCMTK原始碼下載 2. CMake下載 3. 編譯 3.1定位原始碼 開啟CMake,選擇

將png轉換bmp格式

<?php $im = imagecreatefrompng("ok.png"); imagebmp($im,'ok.bmp',24); //imagedestroy($im); /** * 建立bmp格式圖片 * * @author: legend([

Aandroid上的時間轉換將時間轉換成各種格式

沒事又來分享點乾貨,在開發過程中時間的轉換還是經常被用到的,話不多說直接上貨; @SuppressLint("SimpleDateFormat") public class TimeUtils { public static final SimpleDateFormat

sql語句常用功能null值轉換0

span stock left coalesce 產品 post and 客戶 sel COALESCE(規格,‘ ‘) 或者 COALESCE(規格,0) select * from ( SELECT p2.name_template 產品, p3.pname 材料

python文件中內容轉換字典

class col 文件中 lin AS open strip pre python 例1:根據文件中內容的格式可以將其轉換為字典: 文件名:word.txt, 其內容如下: wwww  12345        123344  謾語        往往   來來 1

Javascript將圖片的絕對路徑轉換base64編碼

我需要在vue裡將圖片的絕對路徑轉換為base64編碼,去網上找了順便改了一下程式碼。 參考他人的程式碼 https://www.cnblogs.com/tugenhua0707/p/4666076.html 我們可以使用canvas.toDataURL的方法將圖片的絕對路徑轉換為

.vbb格式轉換txt格式matlab實現),在此以Caltech Pedestrian Dataset資料集的annotations

%% 下載matlab的vbb工具庫 連結:https://pan.baidu.com/s/1GVvimekjNh4M_D4grM0Btw 提取碼:ymfn   %% clc  clear all addpath(genpath('自己存放code3.2.1資料夾

gd庫處理圖片將正方形轉換圓形) 調整 頭像大小(文字圖片合併)建立畫布

/* 正方形轉換圓形圖片 * $url 小圖 (絕對路徑) * $background 背景圖 (絕對路徑) * */ function circular($url,$background){ $w = $h = 56;/* 頭像大小 */ $c = imagecolora

當需要輸入較長的整數,int型別又不夠長時如何將字元型別數字轉換int型別

1.將需要輸入的長整數以字串型別存入; 2.將整數放入陣列; 3.進行其他操作; public static void main(String[] args) { Scanner a=new Scanner(System.in); String input= a.nextLin

如何快速的將圖片裏的內容轉換成文字

按鈕 點擊 文字識別軟件 .com ron 等待 process 將在 方便 有時候我們在電腦中瀏覽到了一些帶有文字的圖片,覺得上面的文字寫的很好想要將其保存下來,這時候為了偷懶不去打字的話就需要使用到圖片轉文字的方法了,具體怎樣去操作呢?下面小編將在圖片文字識別軟件中為大

CENTOS 7+PHP7使用imagemagick 將webp格式圖片轉換jpeg格式

瀏覽器 cti gem sta pre 簡單 type mage 便在 項目中用到的。需要將webp格式的圖片轉換為普通格式的圖片。方便在所有的瀏覽器中正常顯示。項目中使用到了imagemagic 這個庫。 安裝好以後,看下是否支持webp格式,支持的話轉換起來就很簡單了。

jquery將form表單內容轉換json字串

  var formObject = {}; var formArray = $("#form").serializeArray(); $.each(formArray, function (i, item) { formObject[item.name] = item.val