Leadtools.Dicom Namespace > DicomDataSet Class > GetImage Method : GetImage(DicomElement,Int32,Int32,DicomGetImageFlags) Method |
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. |
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 )
public RasterImage getImage(DicomElement element, int index, int bitsPerPixel, int flags)
function Leadtools.Dicom.DicomDataSet.GetImage(DicomElement,Int32,Int32,DicomGetImageFlags)( element , index , bitsPerPixel , flags )
public: RasterImage^ GetImage( DicomElement^ element, int index, int bitsPerPixel, DicomGetImageFlags flags )
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. |
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.Tag | Name |
(0028,1050) | Window Center |
(0028,1051) | Window Width |
(0028,1055) | Window Center & Width Explanation |
Tag | Name |
(0028,1052) | Rescale Intercept |
(0028,1053) | Rescale Slope |
(0028,1054) | Rescale Type |
Imports Leadtools Imports Leadtools.Dicom 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
using Leadtools; using Leadtools.Dicom; 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"; }
using Leadtools.Dicom.Constants; using Leadtools; using Leadtools.Dicom; 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(); }
using Leadtools; using Leadtools.Dicom; using Leadtools.Examples; 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(); }
Imports Leadtools Imports Leadtools.Dicom 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