現在,画像処理でDICOM画像の処理を行っています.
ヘッダのサイズが条件によって変化する為,一度ファイル全体を読み込んだ後,
ファイルの終わりから輝度値を取得するプログラムを作成しました.
しかし,画像が正しく表示されません(真っ黒になるor読み込む位置がずれる).
ファイルポインタの取得方法が間違っているのでしょうか?
どなたか,よろしくお願いします.
void CDICOM2View::FileOpen1()
{
LPCTSTR FilePath;
CString FileName;
DWORD number, fSize, offset;
LPBYTE lpBuf;
int a, b, c;
CFileDialog FileDlg(TRUE, NULL, *.dcm,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,dicomファイル(*.dcm)|*.dcm||);
if(FileDlg.DoModal() == IDOK){
FilePath = FileDlg.GetPathName();
FileName = FileDlg.GetFileName();
HANDLE hFile = CreateFile(FileName, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
fSize = GetFileSize(hFile, NULL);
lpBuf = new BYTE[fSize];
ReadFile(hFile, lpBuf, fSize, &number, NULL);//ファイルをすべて読み込む
CloseHandle(hFile);
img = new int*[size_y];
for(int i=0;i<size_y;i++)
img[i] = new int[size_x];
offset = fSize - 1;
for(i=0;i<size_y;i++){
for(int j=0;j<size_x;j++){
a = *(lpBuf+offset);
b = *(lpBuf+offset-1);
c = a << 8;
img[size_y-1-i][size_x-1-j] = b | c;
offset -= 2;
}
}
delete [] lpBuf;
Invalidate(FALSE);
}
}
動作環境はWindows ME,VisualC++6.0です.
DICOMは随分昔にかじっただけなのであまり参考になりませんが...。
> ヘッダのサイズが条件によって変化する為,...
> ファイルの終わりから輝度値を取得する...
随分乱暴な方法に見えますが、そんなやり方でいいんですか?
DICOMはヘッダを丁寧に読まないとデータを理解できないハズなんですが、
データの条件が非常に限定されたシステムでの話なのでしょうか?
画像サイズは縦×横が2330×1770pixelで固定されています.
メーカさんから,DICOMのヘッダサイズが必ずしも一定でないということを
聞いたので,乱暴ですがファイルの末端から読み込んでいます.
http://homepage3.nifty.com/ishidate/vcpp6_g16/vcpp6_g16.htm
でも取り上げられているのですが,
CArchiveの概念がよく分からないこともあってこのように作成しました.
画像が表示されない原因は,別の関数(OnDraw関数)によるものでした.
ご迷惑をおかけしました.