2017-01-06 6 views
0

Я могу загрузить изображение dicom с помощью imebra и хочу изменить цвета изображения, но не могу найти способ. Я хочу достичь функциональности, как в приложении Dicomite.Imebra - Изменение цветовых контрастов

Ниже мой код:

public void loadDCM() { 

    com.imebra.DataSet loadedDataSet = com.imebra.CodecFactory.load(dicomPath.getPath()); 

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

    com.imebra.Image image = loadedDataSet.getImageApplyModalityTransform(0); 
    //  com.imebra.Image image = loadedDataSet.getImage(0); 
    String colorSpace = image.getColorSpace(); 


    long width = image.getWidth(); 
    long height = image.getHeight(); 

    TransformsChain transformsChain = new TransformsChain(); 
    com.imebra.DrawBitmap drawBitmap = new com.imebra.DrawBitmap(transformsChain); 


    com.imebra.TransformsChain chain = new com.imebra.TransformsChain(); 
    if (com.imebra.ColorTransformsFactory.isMonochrome(image.getColorSpace())) { 
    // Allocate a VOILUT transform. If the DataSet does not contain any pre-defined 
    // settings then we will find the optimal ones. 
    VOILUT voilutTransform = new VOILUT(); 

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

    // Retrieve the LUTs 
    List <LUT> luts = new ArrayList <LUT>(); 
    for (long scanLUTs = 0;; scanLUTs++) { 
    try { 
    luts.add(loadedDataSet.getLUT(new com.imebra.TagId(0x0028, 0x3010), scanLUTs)); 
    } catch (Exception e) { 
    break; 
    } 
    } 

    if (!vois.isEmpty()) { 
    voilutTransform.setCenterWidth(vois.get(0).getCenter(), vois.get(0).getWidth()); 
    } else if (!luts.isEmpty()) { 
    voilutTransform.setLUT(luts.get(0)); 
    } else { 
    voilutTransform.applyOptimalVOI(image, 0, 0, width, height); 
    } 

    chain.addTransform(voilutTransform); 

    com.imebra.DrawBitmap draw = new com.imebra.DrawBitmap(chain); 

    // Ask for the size of the buffer (in bytes) 

    long requestedBufferSize = draw.getBitmap(image, drawBitmapType_t.drawBitmapRGBA, 4, new byte[0]); 

    byte buffer[] = new byte[(int) requestedBufferSize]; // Ideally you want to reuse this in subsequent calls to getBitmap() 
    ByteBuffer byteBuffer = ByteBuffer.wrap(buffer); 

    // Now fill the buffer with the image data and create a bitmap from it 
    drawBitmap.getBitmap(image, drawBitmapType_t.drawBitmapRGBA, 4, buffer); 
    Bitmap renderBitmap = Bitmap.createBitmap((int) image.getWidth(), (int) image.getHeight(), Bitmap.Config.ARGB_8888); 
    renderBitmap.copyPixelsFromBuffer(byteBuffer); 

    image_view.setImageBitmap(renderBitmap); 

    } 
+0

показать полный код :) –

ответ

0

Если вы имеете дело с монохромным изображением, и вы хотите изменить представление светимости/контраст, то вы должны изменить параметры VOILUT преобразования (переменную voilutTransform в ваш код).

Вы можете получить центр и ширину, которые преобразование применяется к изображению, прежде чем вычислять растровое изображение, которое будет отображаться, а затем изменить их перед повторным вызовом drawBitmap.getBitmap.

Например, чтобы удвоить контрастность:.

voilutTransform.setCenterWidth(voilutTransform.getCenter(), voilutTransform.getWidth()/2); 

// Now fill the buffer with the image data and create a bitmap from it 
drawBitmap.getBitmap(image, drawBitmapType_t.drawBitmapRGBA, 4, buffer); 

См this answer для получения более подробной информации о центре/ширина

+0

Там нет метода с именем setWidth() в объекте voilutTransform – user7382820

+0

Мой плохой метод был установленCenterWidth. Я обновил ответ –

+0

Я попытался изменить до 1000 следующим образом: voilutTransform.setCenterWidth (voilutTransform.getCenter(), voilutTransform.getWidth()/1000); Но ничего не изменил – user7382820

 Смежные вопросы

  • Нет связанных вопросов^_^