Imebra library shows completely gray image for transfer syntax 1.2.840.10008.1.2.1

228 Views Asked by At

Iam trying to use Imebra library to display DICOM images in android. Iam using version 5.0 of the library. The bitmap shown is completely gray, transfer syntax for image is 1.2.840.10008.1.2.1.For other supported transfer syntax i.e JPEG it works fine.

enter image description here

Also I am unable to add VOILUT transform functionality as mentioned in documentation it gives error cons tructor not found for VOILUT.

enter image description here

Below is the code Iam using, VOILUT transform part is giving constructor not found. if i remove VOILUT transform part things work fine but for image with transfer syntax 1.2.840.10008.1.2.1 it shows completely grey image

    private Bitmap fromDicom(String filePath, int frameNumber){

    // have been applied).
    Image dicomImage = loadedDataSet.getImageApplyModalityTransform(frameNumber);

    // Use a DrawBitmap to build a stream of bytes that can be handled by the
    // Android Bitmap class.
    com.imebra.TransformsChain chain = new com.imebra.TransformsChain();


    if( com.imebra.ColorTransformsFactory.isMonochrome(dicomImage.getColorSpace()))
    {
        // Retrieve the VOIs (center/width pairs)

        com.imebra.VOIs vois = loadedDataSet.getVOIs();

        if(!vois.isEmpty())
        {
            // Get the first VOI setting from the dataset
            chain.addTransform(new VOILUT(vois.get(0)));
        }
        else
        {
            // The dataset does not have any VOI setting, find the optimal one
            com.imebra.SWIGTYPE_p_imebra__VOIDescription voiDescription = VOILUT.getOptimalVOI(dicomImage, 0, 0, dicomImage.getWidth(), dicomImage.getHeight());
            chain.addTransform(new VOILUT(voiDescription));
        }

    }

    DrawBitmap drawBitmap = new DrawBitmap(chain);
    Memory memory = drawBitmap.getBitmap(dicomImage, drawBitmapType_t.drawBitmapRGBA, 4);

    // Build the Android Bitmap from the raw bytes returned by DrawBitmap.
    Bitmap renderBitmap = Bitmap.createBitmap((int)dicomImage.getWidth(), (int)dicomImage.getHeight(), Bitmap.Config.ARGB_8888);
    byte[] memoryByte = new byte[(int)memory.size()];
    memory.data(memoryByte);
    ByteBuffer byteBuffer = ByteBuffer.wrap(memoryByte);
    renderBitmap.copyPixelsFromBuffer(byteBuffer);
    // Update the image
    return renderBitmap;

}

After changing the code suggested by you, I don't find classes mentioned

VOIDescription instead i see class SWIGTYPE_p_imebra__VOIDescription should i use that class

enter image description here

There is one more error no getWidth() method available with vois.get(0).getWidth

enter image description here

One last Error i don't see class vois_t instead there is a class VOIs should VOIs be used

Thanks for the reponse

1

There are 1 best solutions below

1
On BEST ANSWER

The VOILUT must be initialized with the proper contrast settings from the dataset like in the code below.

However, the dataset contains a VOI setting that is wrong (the window width is 0) so this file will be displayed correctly only if you use custom VOI settings or just use automatic settings when width is zero (see alternative code below which checks for width > 0).

Code that does not check for width:

if(com.imebra.ColorTransformsFactory.isMonochrome(dicomImage.getColorSpace());
{
    // Retrieve the VOIs (center/width pairs)
    com.imebra.vois_t vois = loadedDataSet.getVOIs();

    if(!vois.isEmpty())
    {
        // Get the first VOI setting from the dataset
        chain.addTransform(new VOILUT(vois.get(0)));
    }
    else
    {
        // The dataset does not have any VOI setting, find the optimal one
        com.imebra.VOIDescription voiDescription = VOILUT.getOptimalVOI(dataSetImage, 0, 0, width, height);
        chain.addTransform(new VOILUT(voiDescription));
    }

}

Alternative code that checks if width is 0:

if(com.imebra.ColorTransformsFactory.isMonochrome(dicomImage.getColorSpace());

{
    // Retrieve the VOIs (center/width pairs)
    com.imebra.vois_t vois = loadedDataSet.getVOIs();

    if(!vois.isEmpty() && vois.get(0).getWidth() > 0.1)
    {
        // Get the first VOI setting from the dataset
        chain.addTransform(new VOILUT(vois.get(0)));
    }
    else
    {
        // The dataset does not have any VOI setting, find the optimal one
        com.imebra.VOIDescription voiDescription = VOILUT.getOptimalVOI(dataSetImage, 0, 0, width, height);
        chain.addTransform(new VOILUT(voiDescription));
    }

}