LEADTOOLS Medical (Leadtools.Dicom assembly)
LEAD Technologies, Inc

GetImage(DicomElement,Int32,Int32,DicomGetImageFlags) Method

Example 







An item in the Data Set.
The zero-based index of the frame to load.
Value that represents the resulting image pixel depth. Possible values are:
Value Meaning
0 Keep the original file's pixel depth (do not convert).
1 to 8 The specified bits per pixel in the resulting image.
12 12 bits per pixel in the resulting image.
16 16 bits per pixel in the resulting image.
24 24 bits per pixel in the resulting image.
32 32 bits per pixel in the resulting image.
Flags that control the behavior of this method.
Gets the image of a Pixel Data element. .NET support WinRT support
Syntax
public RasterImage GetImage( 
   DicomElement element,
   int index,
   int bitsPerPixel,
   DicomGetImageFlags flags
)
'Declaration
 
Public Overloads Function GetImage( _
   ByVal element As DicomElement, _
   ByVal index As Integer, _
   ByVal bitsPerPixel As Integer, _
   ByVal flags As DicomGetImageFlags _
) As RasterImage
'Usage
 
Dim instance As DicomDataSet
Dim element As DicomElement
Dim index As Integer
Dim bitsPerPixel As Integer
Dim flags As DicomGetImageFlags
Dim value As RasterImage
 
value = instance.GetImage(element, index, bitsPerPixel, flags)
public RasterImage GetImage( 
   DicomElement element,
   int index,
   int bitsPerPixel,
   DicomGetImageFlags flags
)
ObjectiveC Syntax
 function Leadtools.Dicom.DicomDataSet.GetImage(DicomElement,Int32,Int32,DicomGetImageFlags)( 
   element ,
   index ,
   bitsPerPixel ,
   flags 
)
public:
RasterImage^ GetImage( 
   DicomElement^ element,
   int index,
   int bitsPerPixel,
   DicomGetImageFlags flags
) 

Parameters

element
An item in the Data Set.
index
The zero-based index of the frame to load.
bitsPerPixel
Value that represents the resulting image pixel depth. Possible values are:
Value Meaning
0 Keep the original file's pixel depth (do not convert).
1 to 8 The specified bits per pixel in the resulting image.
12 12 bits per pixel in the resulting image.
16 16 bits per pixel in the resulting image.
24 24 bits per pixel in the resulting image.
32 32 bits per pixel in the resulting image.
flags
Flags that control the behavior of this method.

Return Value

The image of a Pixel Data element.
Remarks
If element is null, this method will load any image within the file, based on the index parameter.

If DicomGetImageFlags.AllowRangeExpansion is set in flag, consider the following example:

If the Data Set has the following attributes:

Bits allocated 16

Bits stored 12

Pixel Range 0 - +4095

Pixel Representation is unsigned (0)

Photometric Interpretation is MONOCHROME2

Rescale Slope 1

Rescale Intercept -1024

After applying the rescale slope and the intercept:

Output minimum pixel value = (0 * 1 +(-1024)) = -1024

Output maximum pixel value = (4095 * 1 + (-1024)) = 3071

The new pixel value range (-1024 to 3071) can not be represented with the current bits stored (12 bits), which can represent values in the range (-2048 to 2048). In this case the method will change the high bit inside the image object to be 12 instead of 11 (bits stored becomes 13), which can represent values in the range (-8192 to 8191).

Please note that the method will not be able to update the high bit and/or low bit if the number of bits stored was already equal to the number of bits allocated.

If the DICOM dataset has a Multi-frame Functional Groups module, some VOI LUT information will be read from the correspondingFrame VOI LUT Sequence, and some Modality LUT information will be read from the corresponding Pixel Value Transformation Sequence.

The specific elements that are read is shown below:
(0028,9132) Frame VOI LUT Sequence Child Elements
Tag Name
(0028,1050) Window Center
(0028,1051) Window Width
(0028,1055) Window Center & Width Explanation

(0028,9145) Pixel Value Transformation Sequence child elements
Tag Name
(0028,1052) Rescale Intercept
(0028,1053) Rescale Slope
(0028,1054) Rescale Type


For a detailed discussion on Multi-frame Functional Groups see the topic Multi-frame Functional Groups.
Example
Copy CodeCopy Code  
Public Sub TestDicomImage()
      Dim dicomFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "IMAGE3.dcm")
      'Make sure to initialize the DICOM engine, this needs to be done only once 
      'In the whole application
      DicomEngine.Startup()

      Dim ds As DicomDataSet = New DicomDataSet()
      Using (ds)
         'Load DICOM File
         ds.Load(dicomFileName, DicomDataSetLoadFlags.None)

         Dim pixelDataElement As DicomElement = ds.FindFirstElement(Nothing, DicomTag.PixelData, True)
         If pixelDataElement Is Nothing Then
            MessageBox.Show("This dataset is missing the pixel data element", "Sample")
            Return
         End If

         If ds.GetImageCount(pixelDataElement) = 0 Then
            MessageBox.Show("This dataset has no images", "Sample")
            Return
         End If

         Dim imageInformation As DicomImageInformation = ds.GetImageInformation(pixelDataElement, 0)
         If imageInformation Is Nothing Then
            MessageBox.Show("Can't retrieve image information", "Sample")
            Return
         End If
         ' Over here we can access the different properties of the DicomImageInformation class to get some
         ' of the image attributes such as bits allocated (DicomImageInformation. BitsAllocated)
         Dim image As RasterImage = ds.GetImage(pixelDataElement, 0, 0, RasterByteOrder.Gray, DicomGetImageFlags.AllowRangeExpansion Or _
                                                DicomGetImageFlags.AutoApplyModalityLut Or DicomGetImageFlags.AutoApplyVoiLut)

         If image Is Nothing Then
            MessageBox.Show("Can't retrieve image", "Sample")
            Return
         End If

         'If the image has more than one frame then we can call DicomDataSet.GetImages to get all the frames

         Dim ds1 As DicomDataSet = New DicomDataSet()
         Using (ds1)

            ds1.Initialize(DicomClassType.DXImageStoragePresentation, DicomDataSetInitializeType.ExplicitVRLittleEndian)
            Dim pixelDataElement1 As DicomElement = ds1.FindFirstElement(Nothing, DicomTag.PixelData, True)
            If Not pixelDataElement1 Is Nothing Then
               ds1.SetImage(pixelDataElement1, image, DicomImageCompressionType.None, DicomImagePhotometricInterpretationType.Monochrome2, 16, 2, _
                            DicomSetImageFlags.AutoSetVoiLut)
               'If we have more than one frame then we can call DicomDataSet.SetImages

               'This is an alternative way to set the image, I will first delete the
               'existing image and then call DicomDataSet.InsertImage
               ds1.DeleteImage(pixelDataElement1, 0, 1)
               pixelDataElement1 = ds1.InsertElement(Nothing, False, DicomTag.PixelData, DicomVRType.UN, False, 0)
               ds1.InsertImage(pixelDataElement1, image, 0, DicomImageCompressionType.None, DicomImagePhotometricInterpretationType.Monochrome2, 16, 2, _
                               DicomSetImageFlags.AutoSetVoiLut)
               'If we have more than one frame then we can call DicomDataSet.InsertImages

               ds1.Save(Path.Combine(LEAD_VARS.ImagesDir, "Test.dcm"), DicomDataSetSaveFlags.None)

            End If
         End Using

         'Load DICOM File
         ds.Load(dicomFileName, DicomDataSetLoadFlags.None)
      End Using

      DicomEngine.Shutdown()
   End Sub


Public NotInheritable Class LEAD_VARS
   Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
End Class
public void TestDicomImage()
   {
      string dicomFileName = Path.Combine(LEAD_VARS.ImagesDir, "IMAGE3.dcm");
      //Make sure to initialize the DICOM engine, this needs to be done only once 
      //In the whole application
      DicomEngine.Startup();
      using (DicomDataSet ds = new DicomDataSet())
      {
         //Load DICOM File
         ds.Load(dicomFileName, DicomDataSetLoadFlags.None);

         DicomElement pixelDataElement = ds.FindFirstElement(null, DicomTag.PixelData, true);
         if (pixelDataElement == null)
         {
            MessageBox.Show("This dataset is missing the pixel data element", "Sample");
            return;
         }

         if (ds.GetImageCount(pixelDataElement) == 0)
         {
            MessageBox.Show("This dataset has no images", "Sample");
            return;
         }

         DicomImageInformation imageInformation = ds.GetImageInformation(pixelDataElement, 0);
         if (imageInformation == null)
         {
            MessageBox.Show("Can't retrieve image information", "Sample");
            return;
         }
         // Over here we can access the different properties of the DicomImageInformation class to get some
         // of the image attributes such as bits allocated (DicomImageInformation. BitsAllocated)
         RasterImage image = ds.GetImage(pixelDataElement,
            0,
            0,
            RasterByteOrder.Gray,
            DicomGetImageFlags.AllowRangeExpansion | DicomGetImageFlags.AutoApplyModalityLut | DicomGetImageFlags.AutoApplyVoiLut);

         if (image == null)
         {
            MessageBox.Show("Can't retrieve image", "Sample");
            return;
         }

         //If the image has more than one frame then we can call DicomDataSet.GetImages to get all the frames
         using (DicomDataSet ds1 = new DicomDataSet())
         {
            ds1.Initialize(DicomClassType.DXImageStoragePresentation, DicomDataSetInitializeType.ExplicitVRLittleEndian);
            DicomElement pixelDataElement1 = ds1.FindFirstElement(null, DicomTag.PixelData, true);
            if (pixelDataElement1 != null)
            {
               ds1.SetImage(pixelDataElement1,
                  image,
                  DicomImageCompressionType.None,
                  DicomImagePhotometricInterpretationType.Monochrome2,
                  16,
                  2,
                  DicomSetImageFlags.AutoSetVoiLut);
               //If we have more than one frame then we can call DicomDataSet.SetImages

               //This is an alternative way to set the image, I will first delete the
               //existing image and then call DicomDataSet.InsertImage
               ds1.DeleteElement(pixelDataElement1);
               pixelDataElement1 = ds1.InsertElement(null, false, DicomTag.PixelData, DicomVRType.UN, false, 0);
               ds1.InsertImage(pixelDataElement1,
                  image,
                  0,
                  DicomImageCompressionType.None,
                  DicomImagePhotometricInterpretationType.Monochrome2,
                  16,
                  2,
                  DicomSetImageFlags.AutoSetVoiLut);
               //If we have more than one frame then we can call DicomDataSet.InsertImages

               ds1.Save(Path.Combine(LEAD_VARS.ImagesDir, "Test.dcm"), DicomDataSetSaveFlags.None);

            }
         }
         //Load DICOM File
         ds.Load(dicomFileName, DicomDataSetLoadFlags.None);
      }
      DicomEngine.Shutdown();
   }

static class LEAD_VARS
{
   public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
}
[TestMethod]
public async Task TestDicomImage()
{
   //Make sure to initialize the DICOM engine, this needs to be done only once 
   //In the whole application
   DicomEngine.Startup();
   using (DicomDataSet ds = new DicomDataSet())
   {
      //Load DICOM File
      string filePath = @"Assets\IMAGE3.dcm";
      StorageFile file = await Tools.AppInstallFolder.GetFileAsync(filePath);
      ILeadStream stream = LeadStreamFactory.Create(file);
      bool success = await ds.LoadAsync(stream, DicomDataSetLoadFlags.None);
      Debug.Assert(success); 
      ds.DeleteVoiLut();
      DicomElement pixelDataElement = ds.FindFirstElement(null, DicomTagConstants.PixelData, true);
      if (pixelDataElement == null)
      {
         Debug.WriteLine("TestDicomImage: This dataset is missing the pixel data element");
         return;
      }

      if (ds.GetImageCount(pixelDataElement) == 0)
      {
         Debug.WriteLine("TestDicomImage: This dataset has no images");
         return;
      }

      DicomImageInformation imageInformation = ds.GetImageInformation(pixelDataElement, 0);
      if (imageInformation == null)
      {
         Debug.WriteLine("TestDicomImage: Can't retrieve image information");
         return;
      }
      // Over here we can access the different properties of the DicomImageInformation class to get some
      // of the image attributes such as bits allocated (DicomImageInformation. BitsAllocated)
      RasterImage image = ds.GetImage(pixelDataElement,
         0,
         0,
         DicomGetImageFlags.AllowRangeExpansion | DicomGetImageFlags.AutoApplyModalityLut | DicomGetImageFlags.AutoApplyVoiLut);

      if (image == null)
      {
         Debug.WriteLine("Can't retrieve image");
         return;
      }

      //If the image has more than one frame then we can call DicomDataSet.GetImages to get all the frames
      using (DicomDataSet ds1 = new DicomDataSet())
      {
         ds1.Initialize(DicomClassType.DXImageStoragePresentation, DicomDataSetInitializeType.ExplicitVRLittleEndian);
         DicomElement pixelDataElement1 = ds1.FindFirstElement(null, DicomTagConstants.PixelData, true);
         if (pixelDataElement1 != null)
         {
            ds1.SetImage(pixelDataElement1,
               image,
               DicomImageCompressionType.None,
               DicomImagePhotometricInterpretationType.Monochrome2,
               16,
               2,
               DicomSetImageFlags.AutoSetVoiLut);
            //If we have more than one frame then we can call DicomDataSet.SetImages

            //This is an alternative way to set the image, I will first delete the
            //existing image and then call DicomDataSet.InsertImage
            ds1.DeleteElement(pixelDataElement1);
            pixelDataElement1 = ds1.InsertElement(null, false, DicomTagConstants.PixelData, DicomVRType.UN, false, 0);
            ds1.InsertImage(pixelDataElement1,
               image,
               0,
               DicomImageCompressionType.None,
               DicomImagePhotometricInterpretationType.Monochrome2,
               16,
               2,
               DicomSetImageFlags.AutoSetVoiLut);
            //If we have more than one frame then we can call DicomDataSet.InsertImages

            string dicomFileNameOutput = "Test.dcm";
            StorageFile saveFile = await Tools.AppLocalFolder.CreateFileAsync(dicomFileNameOutput);
            ILeadStream streamOutput = LeadStreamFactory.Create(saveFile);
            using (IDisposable disposableOUT = streamOutput as IDisposable)
            {
               await ds.SaveAsync(streamOutput, DicomDataSetSaveFlags.None);
            }

         }
      }
      //Load DICOM File
      filePath = @"Test.dcm";
      file = await Tools.AppLocalFolder.GetFileAsync(filePath);
      stream = LeadStreamFactory.Create(file);
      success = await ds.LoadAsync(stream, DicomDataSetLoadFlags.None);
      Debug.Assert(success); ds.DeleteVoiLut();
   }
   DicomEngine.Shutdown();
}
public void TestDicomImage(Stream dicomStream, Stream outputStream)
{
   //Make sure to initialize the DICOM engine, this needs to be done only once 
   //In the whole application
   DicomEngine.Startup();
   using (DicomDataSet ds = new DicomDataSet())
   {
      //Load DICOM File
      ds.Load(dicomStream, DicomDataSetLoadFlags.None);
      DicomElement pixelDataElement = ds.FindFirstElement(null, DicomTag.PixelData, true);
      if (pixelDataElement == null)
      {
         Debug.WriteLine("This dataset is missing the pixel data element", "Sample");
         return;
      }

      if (ds.GetImageCount(pixelDataElement) == 0)
      {
         Debug.WriteLine("This dataset has no images", "Sample");
         return;
      }

      DicomImageInformation imageInformation = ds.GetImageInformation(pixelDataElement, 0);
      if (imageInformation == null)
      {
         Debug.WriteLine("Can't retrieve image information", "Sample");
         return;
      }
      // Over here we can access the different properties of the DicomImageInformation class to get some
      // of the image attributes such as bits allocated (DicomImageInformation. BitsAllocated)
      RasterImage image = ds.GetImage(pixelDataElement,
         0,
         0,
         RasterByteOrder.Gray,
         DicomGetImageFlags.AllowRangeExpansion | DicomGetImageFlags.AutoApplyModalityLut | DicomGetImageFlags.AutoApplyVoiLut);

      if (image == null)
      {
         Debug.WriteLine("Can't retrieve image", "Sample");
         return;
      }

      //If the image has more than one frame then we can call DicomDataSet.GetImages to get all the frames
      using (DicomDataSet ds1 = new DicomDataSet())
      {
         ds1.Initialize(DicomClassType.DXImageStoragePresentation, DicomDataSetInitializeType.ExplicitVRLittleEndian);
         DicomElement pixelDataElement1 = ds1.FindFirstElement(null, DicomTag.PixelData, true);
         if (pixelDataElement1 != null)
         {
            ds1.SetImage(pixelDataElement1,
               image,
               DicomImageCompressionType.None,
               DicomImagePhotometricInterpretationType.Monochrome2,
               16,
               2,
               DicomSetImageFlags.AutoSetVoiLut);
            //If we have more than one frame then we can call DicomDataSet.SetImages

            //This is an alternative way to set the image, I will first delete the
            //existing image and then call DicomDataSet.InsertImage
            ds1.DeleteImage(pixelDataElement1, 0, 1);
            pixelDataElement1 = ds1.InsertElement(null, false, DicomTag.PixelData, DicomVRType.UN, false, 0);
            ds1.InsertImage(pixelDataElement1,
               image,
               0,
               DicomImageCompressionType.None,
               DicomImagePhotometricInterpretationType.Monochrome2,
               16,
               2,
               DicomSetImageFlags.AutoSetVoiLut);
            //If we have more than one frame then we can call DicomDataSet.InsertImages

            ds1.Save(outputStream, DicomDataSetSaveFlags.None);

         }
      }
      //Load DICOM File
      ds.Load(dicomStream, DicomDataSetLoadFlags.None);
   }
   DicomEngine.Shutdown();
}
Public Sub TestDicomImage(ByVal dicomStream As Stream, ByVal outputStream As Stream)
   'Make sure to initialize the DICOM engine, this needs to be done only once 
   'In the whole application
   DicomEngine.Startup()
   Using ds As DicomDataSet = New DicomDataSet()
      'Load DICOM File
      ds.Load(dicomStream, DicomDataSetLoadFlags.None)
      Dim pixelDataElement As DicomElement = ds.FindFirstElement(Nothing, DicomTag.PixelData, True)
      If pixelDataElement Is Nothing Then
         Debug.WriteLine("This dataset is missing the pixel data element", "Sample")
         Return
      End If

      If ds.GetImageCount(pixelDataElement) = 0 Then
         Debug.WriteLine("This dataset has no images", "Sample")
         Return
      End If

      Dim imageInformation As DicomImageInformation = ds.GetImageInformation(pixelDataElement, 0)
      If imageInformation Is Nothing Then
         Debug.WriteLine("Can't retrieve image information", "Sample")
         Return
      End If
      ' Over here we can access the different properties of the DicomImageInformation class to get some
      ' of the image attributes such as bits allocated (DicomImageInformation. BitsAllocated)
          Dim image As RasterImage = ds.GetImage(pixelDataElement, 0, 0, RasterByteOrder.Gray, DicomGetImageFlags.AllowRangeExpansion Or _
                                                 DicomGetImageFlags.AutoApplyModalityLut Or _
                                                 DicomGetImageFlags.AutoApplyVoiLut)

      If image Is Nothing Then
         Debug.WriteLine("Can't retrieve image", "Sample")
         Return
      End If

      'If the image has more than one frame then we can call DicomDataSet.GetImages to get all the frames
      Using ds1 As DicomDataSet = New DicomDataSet()
         ds1.Initialize(DicomClassType.DXImageStoragePresentation, DicomDataSetInitializeType.ExplicitVRLittleEndian)
         Dim pixelDataElement1 As DicomElement = ds1.FindFirstElement(Nothing, DicomTag.PixelData, True)
         If Not pixelDataElement1 Is Nothing Then
                  ds1.SetImage(pixelDataElement1, _
                               image, _
                               DicomImageCompressionType.None, _
                               DicomImagePhotometricInterpretationType.Monochrome2, _
                               16, _
                               2, _
                               DicomSetImageFlags.AutoSetVoiLut)
            'If we have more than one frame then we can call DicomDataSet.SetImages

            'This is an alternative way to set the image, I will first delete the
            'existing image and then call DicomDataSet.InsertImage
            ds1.DeleteImage(pixelDataElement1, 0, 1)
            pixelDataElement1 = ds1.InsertElement(Nothing, False, DicomTag.PixelData, DicomVRType.UN, False, 0)
                  ds1.InsertImage(pixelDataElement1, _
                                  image, _
                                  0, _
                                  DicomImageCompressionType.None, _
                                  DicomImagePhotometricInterpretationType.Monochrome2, _
                                  16, _
                                  2, _
                                  DicomSetImageFlags.AutoSetVoiLut)
            'If we have more than one frame then we can call DicomDataSet.InsertImages

            ds1.Save(outputStream, DicomDataSetSaveFlags.None)

         End If
      End Using
      'Load DICOM File
      ds.Load(dicomStream, DicomDataSetLoadFlags.None)
   End Using
   DicomEngine.Shutdown()
End Sub
Requirements

Target Platforms: Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

See Also

Reference

DicomDataSet Class
DicomDataSet Members
Overload List
GetImageCount Method
GetImages(DicomElement,Int32,Int32,Int32,RasterByteOrder,DicomGetImageFlags) Method

 

 


Products | Support | Contact Us | Copyright Notices

© 2006-2012 All Rights Reserved. LEAD Technologies, Inc.

Leadtools.Dicom requires a Medical toolkit server license and unlock key. For more information, refer to: Imaging Pro/Document/Medical Features