LDicomDS::LoadDSMemory

#include "Ltdic.h"

L_UINT16 EXT_FUNCTION LDicomDS::LoadDSMemory(pBuffer, uBufferSize, nFlags)

L_UCHAR * pBuffer;

/* pointer to the file in memory to be loaded */

L_UINT32 uBufferSize;

/* size of the file in memory (in bytes) */

L_UINT16 nFlags;

/* flags that indicate file characteristics */

Loads a DICOM Data Set from memory.

Parameter

Description

pBuffer

Pointer to the file in memory to be loaded.

uBufferSize

Size of the file in memory (in bytes).

nFlags

Meta-header flags, Transfer Syntax flags and other flags that indicate the file characteristics to use when loading the file. Possible values for the Meta-header flags are:

 

Value

Meaning

 

0

[0x0000] LEADTOOLS will automatically determine the presence or absence of the Meta-header.

 

DS_METAHEADER_PRESENT

[0x0001] The header is present.

 

DS_METAHEADER_ABSENT

[0x0002] The header is absent.

 

Possible values and combinations for the Transfer Syntax flags are:

 

0

[0x0000] LEADTOOLS will automatically determine the Transfer Syntax.

 

DS_LITTLE_ENDIAN

[0x0004] Byte order is Little Endian.

 

DS_BIG_ENDIAN

[0x0008] Byte order is Big Endian.

 

DS_IMPLICIT_VR

[0x0010] The Value Representation is implicit.

 

DS_EXPLICIT_VR

[0x0020] The Value Representation is explicit.

 

DS_LOAD_CLOSE

[0x0200] The complete dataset will be loaded into memory and the file handle closed.

 

Any of the available Meta-header flags given above may be combined with any of the available values or combinations of values for the Transfer Syntax flags given above. For example, you may combine DS_METAHEADER_ABSENT with DS_EXPLICIT_VR, or you may combine DS_METAHEADER_PRESENT with DS_BIG_ENDIAN | DS_EXPLICIT_VR, etc.

Returns

0

SUCCESS

>0

An error occurred. Refer to Return Codes.

Comments

Unless you pass the DS_LOAD_CLOSE flag, this function DOES NOT make a copy of the memory pointed to by pBuffer. Therefore, DO NOT free this memory as long as you are using the dataset referenced by this instance of the class, or until you have reset the dataset by calling LDicomDS::ResetDS.

Once you have called LDicomDS::ResetDS, you can repopulate the data set by calling LDicomDS::InitDS, LDicomDS::LoadDS, or LDicomDS::LoadDSMemory.

If you know certain characteristics of the DICOM file in memory, you can set those in nFlags. Any characteristic that you dont set will be automatically determined. For example, if you know that the metaheader is present, but you do not know the byte order, or whether the Value Representation is implicit or explicit, you can set only DS_METAHEADER_PRESENT in nFlags. During loading LEADTOOLS will determine the byte order and whether the byte order is implicit or explicit.

If you do not know any of the characteristics of the DICOM file in memory, set nFlags to 0 and LEADTOOLS will automatically determine all the file characteristics and load the file accordingly.

Required DLLs and Libraries

LTDIC

For a listing of the exact DLLs and Libraries needed, based on the toolkit version, refer to Files To Be Included With Your Application.

Platforms

Win32, x64

See Also

Functions:

LDicomDS::LoadDS, LDicomDS::SaveDS, LDicomDS::ResetDS

Topics:

Data Sets: Creating, Initializing, Loading, and Saving Data Sets

 

Working with Data Sets

 

How to Disable the Automatic Loading of the default DICOM IOD Table

Example

#define MAKE_IMAGE_PATH(pFileName) TEXT("C:\\Users\\Public\\Documents\\LEADTOOLS Images\\")pFileName
L_INT LDicomDS_LoadDSMemoryExample()
{
   LDicomDS    Dataset;
   HANDLE      hFile; 
   L_UCHAR*    pBuffer = NULL;
   L_UINT32    uBufferSize = 0;
   L_BOOL      bResult;
   L_UINT32    NumberOfBytesRead;
   L_UINT16    uDICOMRet;
   L_UINT32    nClass;
   L_UINT16    nFlags;
   L_TCHAR     szUnknown[]=TEXT("Unknown Class");
   L_TCHAR*    pClassName;
   pDICOMIOD   pIOD;
   //Create a handle to the DICOM file on disk
   hFile = CreateFile( MAKE_IMAGE_PATH(TEXT("IMAGE2.dcm")),
                       GENERIC_READ,
                       FILE_SHARE_READ,
                       NULL,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL,
                       NULL);
   if (hFile == INVALID_HANDLE_VALUE)
   {
      return -1;
   }
   //Get the file size
   uBufferSize = GetFileSize(hFile, NULL);
   if(uBufferSize == INVALID_FILE_SIZE)
   {
      CloseHandle(hFile); 
      return -1;
   }
   //Allocate a buffer that will hold the data in the file
   pBuffer = (L_UCHAR*) malloc(uBufferSize);
   if(pBuffer == NULL)
   {
      CloseHandle(hFile); 
      return -1;
   }
   //Read the file data into a buffer
   bResult = ReadFile(hFile, pBuffer, uBufferSize, (LPDWORD) (&NumberOfBytesRead), NULL); 
   if(bResult == FALSE)
   {
      free(pBuffer);
      CloseHandle(hFile); 
      return -1;
   }
   //Load DICOM file from memory
   uDICOMRet = Dataset.LoadDSMemory(pBuffer, uBufferSize, 0);
   if(uDICOMRet != DICOM_SUCCESS)
   {
      free(pBuffer);
      CloseHandle(hFile);
      return -1;
   }
   //Get the information about the DICOM file.
   Dataset.GetInfoDS(&nClass, &nFlags);
   pIOD = LDicomIOD::FindClass(nClass);
   if (pIOD != NULL)
   {
      pClassName = pIOD->pszName;
   }
   else
   {
      pClassName = szUnknown;
   }
   MessageBox(NULL, pClassName, TEXT("Notice"), MB_OK);
   //Make sure to cleanup
   free(pBuffer);
   CloseHandle(hFile);
   return DICOM_SUCCESS;
}