⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extractpixeldatadoc.cpp

📁 DICOM专用的显示源代码,国外的一位高手写的 我贡献出来给大家学习学习
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -