開啟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使用 2(xml檔案 轉換為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