Sets the attributes that describe the VOI LUT.
#include "ltdic.h"
L_UINT16 LDicomDS::SetVOILUT(uVOILUTIndex, pVOILUTAttributes, pLUTData, uDataSize,uFlags)
Index to the VOI LUT to be set. According to the DICOM standard one or more items could exist under one VOI LUT Sequence (0028,3010), use this index to specify which item to update. This index is zero-based.
Pointer to a structure containing the VOI LUT attributes to set.
Pointer to the buffer that holds the "LUT Data" (0028,3006) to set. This pointer cant be NULL.
Size of the buffer pointed to by pLUTData, cant be 0.This value should at least equal pVOILUTAttributes->LUTDescriptor.uNumberOfEntries.
Reserved for future use. Pass 0.
Value | Meaning |
---|---|
0 | The function was successful. |
> 0 | An error occurred. Refer to Return Codes. |
Before calling this function, initialize pVOILUTAttributes->uStructSize to be sizeof(DICOMVOILUTATTRIBS) and initialize all the members of the structure.
The size of the input buffer should at least equal the number of entries in the lookup table.
According to the DICOM standard pVOILUTAttributes->LUTDescriptor. uNumberOfEntries should be set to 0 if the number of entries in the lookup table is 2^16, however you should NOT do that when calling this function. This function will handle correctly setting the value inside the dataset.
Win32, x64
This example will add a new VOI LUT to the dataset or replace the existing one(s).
L_INT LDicomDS_SetVOILUTExample( LDicomDS &InDS, L_BOOL bAdd )
{
L_INT nRet;
DICOMVOILUTATTRIBS VOILUTAttribs ={0};
L_UINT uVOILUTCount=0;
L_UINT16 *pVOILUTData = NULL;
L_UINT uDataSize = 0;
L_INT nLUTIndex;
L_UINT uNewLUTIndex = 0;
// Remember to set the size for each structure
VOILUTAttribs.uStructSize = sizeof(DICOMVOILUTATTRIBS);
VOILUTAttribs.LUTDescriptor.uStructSize = sizeof(DICOMLUTDESCRIPTOR);
// Get the number of VOI LUT(s) in the file
nRet = InDS.GetVOILUTCount (&uVOILUTCount);
if(nRet != DICOM_SUCCESS)
{
return nRet;
}
if(uVOILUTCount>0)
{
// Get he attributes of the first VOI LUT
nRet = InDS.GetVOILUT (0,&VOILUTAttribs,sizeof(DICOMVOILUTATTRIBS),0);
if(nRet != DICOM_SUCCESS)
{
return nRet;
}
uDataSize = VOILUTAttribs.LUTDescriptor.uNumberOfEntries;
pVOILUTData = (L_UINT16*)malloc(uDataSize* sizeof(L_UINT16));
if(!pVOILUTData)
{
return DICOM_ERROR_MEMORY;
}
// Get the LUT data
nRet = InDS.GetVOILUTData (0,pVOILUTData,uDataSize,0);
if(nRet != DICOM_SUCCESS)
{
free(pVOILUTData);
return nRet;
}
// Remap the data
for(nLUTIndex = 0; nLUTIndex <= (L_INT)(uDataSize-1); nLUTIndex++)
{
pVOILUTData[nLUTIndex] = pVOILUTData[nLUTIndex]/2;
}
}
else
{
// Define our own LUT
VOILUTAttribs.LUTDescriptor.nFirstStoredPixelValueMapped = 0;
VOILUTAttribs.LUTDescriptor.uEntryBits = 16;
VOILUTAttribs.LUTDescriptor.uNumberOfEntries = 0x10000;
uDataSize = VOILUTAttribs.LUTDescriptor.uNumberOfEntries;
pVOILUTData = (L_UINT16*)malloc(uDataSize* sizeof(L_UINT16));
if(!pVOILUTData)
{
return DICOM_ERROR_MEMORY;
}
memset(pVOILUTData,0,uDataSize* sizeof(L_UINT16));
for(nLUTIndex = 0; nLUTIndex <= (L_INT)(uDataSize-1); nLUTIndex++)
{
pVOILUTData[nLUTIndex] = (L_UINT16)nLUTIndex;
}
}
uNewLUTIndex = uVOILUTCount;
if(!bAdd)
{
// Delete existing LUT
nRet = InDS.DeleteVOILUT (0);
if(nRet != DICOM_SUCCESS)
{
free(pVOILUTData);
return nRet;
}
uNewLUTIndex = 0 ;
}
// Set the new LUT
nRet = InDS.SetVOILUT(uNewLUTIndex,&VOILUTAttribs,pVOILUTData,uDataSize,0);
if(nRet != DICOM_SUCCESS)
{
free(pVOILUTData);
return nRet;
}
if(pVOILUTData)
{
free(pVOILUTData);
}
return DICOM_SUCCESS;
}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document