📄 extractpixeldatadoc.cpp
字号:
// ExtractPixelDataDoc.cpp : implementation of the CExtractPixelDataDoc class
//
#include "stdafx.h"
#include "ExtractPixelData.h"
#include "ExtractPixelDataDoc.h"
#include "DcmCompositeIOD.h"
//#include "..\dicomapi\DcmCompositeIOD.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CExtractPixelDataDoc
IMPLEMENT_DYNCREATE(CExtractPixelDataDoc, CDocument)
BEGIN_MESSAGE_MAP(CExtractPixelDataDoc, CDocument)
//{{AFX_MSG_MAP(CExtractPixelDataDoc)
ON_COMMAND(ID_BUTTON_BACK, OnButtonBack)
ON_COMMAND(ID_BUTTON_FORWARD, OnButtonForward)
ON_COMMAND(ID_ATTRIBUTES_FILEATTRIBUTES, OnAttributesFileAttributes)
ON_COMMAND(ID_ATTRIBUTES_IMAGEPIXELMODULE, OnAttributesImagePixelModule)
ON_COMMAND(ID_ATTRIBUTES_METAFILEHEADER, OnAttributesMetaFileHeader)
ON_COMMAND(ID_ATTRIBUTES_MODALITYLUTMODULE, OnAttributesModalityLutModule)
ON_COMMAND(ID_ATTRIBUTES_MULTIFRAMEMODULE, OnAttributesMultiFrameModule)
ON_COMMAND(ID_ATTRIBUTES_VIOLUTMODULE, OnAttributesVioLutModule)
ON_UPDATE_COMMAND_UI(ID_BUTTON_BACK, OnUpdateButtonBack)
ON_UPDATE_COMMAND_UI(ID_BUTTON_FORWARD, OnUpdateButtonForward)
ON_COMMAND(ID_CHOOSE_IMAGE, OnChooseImage)
ON_UPDATE_COMMAND_UI(ID_CHOOSE_IMAGE, OnUpdateChooseImage)
ON_COMMAND(ID_CREATE_SEL_DATASET, OnCreateSelDataset)
ON_UPDATE_COMMAND_UI(ID_CREATE_SEL_DATASET, OnUpdateCreateSelDataset)
ON_COMMAND(ID_EMPTY_CHOOSE, OnEmptyChoose)
ON_UPDATE_COMMAND_UI(ID_EMPTY_CHOOSE, OnUpdateEmptyChoose)
ON_COMMAND(ID_ATTRIBUTE_ANON_55, OnAttributeAnon55)
ON_UPDATE_COMMAND_UI(ID_ATTRIBUTE_ANON_55, OnUpdateAttributeAnon55)
ON_COMMAND(ID_IMPORT_SEL, OnImportSelection)
ON_UPDATE_COMMAND_UI(ID_IMPORT_SEL, OnUpdateImportSelection)
ON_COMMAND(ID_EXPORT_SEL, OnExportSel)
ON_UPDATE_COMMAND_UI(ID_EXPORT_SEL, OnUpdateExportSel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CExtractPixelDataDoc construction/destruction
CExtractPixelDataDoc::CExtractPixelDataDoc() :
m_ImagePixel( * new CDcmImagePixelModule() ),
m_MetaFile( * new CDcmMetaFileInformation() ),
m_MultiFrame( * new CDcmMultiFrameModule() ),
m_VioLut ( * new CDcmVioLutModule() ),
m_ModalityLut( * new CDcmModalityLUTModule() ),
m_BitsPerPixel(0), m_Width(0), m_Height(0),
m_ImageIndex( 0 ), m_IodSyntax(::CDcmRegistry::DcmUnDefinedUid),
m_Picture( NULL ), m_CurrentIndex(-1), m_anonymize_55( 0 )
{
m_CookedPixelData.SetSize( 0 );
m_jpegPixelData.SetSize( 0 );
m_SelectedImages.SetSize(0);
m_anonymize_55 = AfxGetApp()->GetProfileInt("DICOM Scribble", "m_anonymize_55", 0 );
}
CExtractPixelDataDoc::~CExtractPixelDataDoc()
{
for ( int i = 0; i < m_CookedPixelData.GetSize(); i++ )
{
delete m_CookedPixelData[i];
}
if ( m_Picture != NULL )
{
m_Picture->Release();
}
/* for ( i = 0; i < m_jpegPixelData.GetSize(); i++ )
{
LPPICTURE p = ( LPPICTURE )m_jpegPixelData[i];
p->Release();
} */
delete &m_ImagePixel; delete &m_MetaFile;
delete &m_MultiFrame; delete &m_VioLut;
delete &m_ModalityLut;
}
BOOL CExtractPixelDataDoc::OnNewDocument()
{
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CExtractPixelDataDoc serialization
void CExtractPixelDataDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CExtractPixelDataDoc diagnostics
#ifdef _DEBUG
void CExtractPixelDataDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CExtractPixelDataDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CExtractPixelDataDoc commands
BOOL CExtractPixelDataDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
CDcmRegistry registry;
if ( registry.DictionarySize() == 0 || registry.UidDictionarySize() == 0 )
{
CString DcmError;
DcmError.Format("The Dicom Dictionary(dict.txt and UidTable.txt) must be in the same directory as the Dicom Attribute Browser Application." );
AfxMessageBox(DcmError);
return false;
}
// Give the OS some time for open file dialog to hide with big files
::Sleep( 50 );
CDcmCompositeIOD iod;
TRY
{
{
CDialog dlg;
dlg.Create( IDD_DIALOG1 );
dlg.CenterWindow();
dlg.ShowWindow(SW_SHOW );
dlg.SetWindowText(CString("Loading " ) + lpszPathName );
CFile f( lpszPathName, CFile::modeRead );
CArchive ar( &f, CArchive::load );
iod.Serialize( ar );
iod >> m_MetaFile >> m_ImagePixel >>
m_VioLut >> m_ModalityLut >> m_MultiFrame;
// Save the CDcmCompositeIOD object transfer syntax
// Many files do not contain the 0x0002,0x0010 attribute
m_IodSyntax = iod.ParseTransferSyntax();
if ( m_IodSyntax != CDcmRegistry::DcmUnDefinedUid )
{
// CDcmCompositeIOD object has a successful parse
m_MetaFile.TransferSyntaxUID().TrimLeft();
m_MetaFile.TransferSyntaxUID().TrimRight();
// Inspect file Transfer syntax. Trim-up whitespace due to non-compliant padding
if ( m_MetaFile.TransferSyntaxUID().CompareNoCase( "1.2.840.10008.1.2.4.70" ) )
{
::AfxGetApp()->AddToRecentFileList( lpszPathName );
m_ImagePixel.Export( m_ImagePixelAttributes );
m_MetaFile.Export( m_MetaFileAttributes );
m_VioLut.Export(m_VioLutAttributes );
m_MultiFrame.Export( m_MultiFrameAttributes );
m_ModalityLut.Export( m_ModalityLutAttributes );
CStringArray tempArray;
iod.Export( tempArray );
m_FileAttributes.SetSize(0);
m_FileAttributes.Add("#SOURCE_CREATE=dicom scribble V1.01");
m_FileAttributes.Append( tempArray );
}
else
{
// No lossless decompression services
CString DcmError;
DcmError.Format("JPEG Lossless Decompression Services Unavailable" );
AfxMessageBox(DcmError);
return false;
}
}
else
{
// Unsuccessful parse of file
CString DcmError;
DcmError.Format("Cannot Read Attributes Of " + CString( lpszPathName ) );
AfxMessageBox(DcmError);
return false;
}
}
}
CATCH( CFileException, e )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << e->m_cause << "\n";
#endif
return false;
}
END_CATCH
return TRUE;
}
void CExtractPixelDataDoc::SetIndexedTitle( int index )
{
if ( index == 0 )
{
if ( IsSelected( index ) )
{
SetTitle( GetPathName() + " *" );
}
else
{
SetTitle( GetPathName() );
}
}
else
{
CString temp;
if ( IsSelected( index ) )
{
temp.Format("(%d*)", index );
}
else
{
temp.Format("(%d)", index );
}
SetTitle( GetPathName() + temp );
}
}
void CExtractPixelDataDoc::OnButtonBack()
{
if ( m_CookedPixelData.GetSize() != 0 && m_CookedPixelData.GetSize() > 1 )
{
if ( m_ImageIndex == 0 )
{
m_ImageIndex = m_CookedPixelData.GetSize()-1;
SetIndexedTitle(m_ImageIndex);
}
else
{
m_ImageIndex--;
SetIndexedTitle(m_ImageIndex);
}
UpdateAllViews(NULL);
}
else if ( m_jpegPixelData.GetSize() != 0 && m_jpegPixelData.GetSize() > 1 )
{
if ( m_ImageIndex == 0 )
{
m_ImageIndex = m_jpegPixelData.GetSize()-1;
SetIndexedTitle(m_ImageIndex);
}
else
{
m_ImageIndex--;
SetIndexedTitle(m_ImageIndex);
}
UpdateAllViews(NULL);
}
}
void CExtractPixelDataDoc::OnButtonForward()
{
if ( m_CookedPixelData.GetSize() != 0 && m_CookedPixelData.GetSize() > 1)
{
if ( m_ImageIndex == m_CookedPixelData.GetSize()-1 )
{
m_ImageIndex = 0;
SetIndexedTitle(m_ImageIndex);
}
else
{
m_ImageIndex++;
SetIndexedTitle(m_ImageIndex);
}
this->UpdateAllViews(NULL);
}
else if ( m_jpegPixelData.GetSize() != 0 && m_jpegPixelData.GetSize() > 1 )
{
if ( m_ImageIndex == m_jpegPixelData.GetSize()-1 )
{
m_ImageIndex = 0;
SetIndexedTitle(m_ImageIndex);
}
else
{
m_ImageIndex++;
SetIndexedTitle(m_ImageIndex);
}
this->UpdateAllViews(NULL);
}
}
void CExtractPixelDataDoc::OnAttributesFileAttributes()
{
CreateDcmExportFile(this->GetPathName(), m_FileAttributes );
}
void CExtractPixelDataDoc::OnAttributesImagePixelModule()
{
CreateDcmExportFile(this->GetPathName(), m_ImagePixelAttributes );
}
void CExtractPixelDataDoc::OnAttributesMetaFileHeader()
{
CreateDcmExportFile(this->GetPathName(), m_MetaFileAttributes );
}
void CExtractPixelDataDoc::OnAttributesModalityLutModule()
{
CreateDcmExportFile(this->GetPathName(), m_ModalityLutAttributes );
}
void CExtractPixelDataDoc::OnAttributesMultiFrameModule()
{
CreateDcmExportFile(this->GetPathName(), m_MultiFrameAttributes );
}
void CExtractPixelDataDoc::OnAttributesVioLutModule()
{
CreateDcmExportFile(this->GetPathName(), m_VioLutAttributes );
}
void CExtractPixelDataDoc::CreateDcmExportFile(const CString& pathnameEx, CStringArray& Attributes )
{
if ( Attributes.GetSize() == 0 )
return;
CString docname( pathnameEx);
CString pathname;
::GetTempPath(255, pathname.GetBufferSetLength(255) );
pathname.ReleaseBuffer();
CString temp;
while( docname.GetLength() )
{
temp = docname.SpanExcluding("\\");
docname = docname.Right( ( docname.GetLength() - temp.GetLength() - 1 ) );
}
docname = temp.SpanExcluding(".");
pathname += docname + ".txt";
TRY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -