C ++如何将Imebra图像(char缓冲区)显示为图像?

时间:2016-10-05 09:09:16

标签: c++ image bitmap mfc dicom

我使用Imebra库来读取DICOM文件。我需要显示DICOM图像。 Imebra库在缓冲区中给我一个图像(我遵循这个documentation):

加载文件

std::unique_ptr<DataSet> MyDataSet(CodecFactory::load("IM1"));

检索图像

Image* image(MyDataSet->getImageApplyModalityTransform(0));

int iWidth = image->getWidth();
int iHeight = image->getHeight();

TransformsChain chain;
if (ColorTransformsFactory::isMonochrome(image->getColorSpace()))
{
    VOILUT voilutTransform;

    vois_t vois = MyDataSet->getVOIs();
    list<LUT*> luts;
    for (size_t scanLUTs(0); ; ++scanLUTs)
    {
        try { luts.push_back(MyDataSet->getLUT(TagId(tagId_t::VOILUTSequence_0028_3010), scanLUTs)); }
        catch (const MissingDataElementError&) { break; }
    }

    if (!vois.empty())  voilutTransform.setCenterWidth(vois[0].center, vois[0].width);
    else if (!luts.empty()) voilutTransform.setLUT(*(luts.front()));
    else  voilutTransform.applyOptimalVOI(*image, 0, 0, iWidth, iHeight);

    DrawBitmap draw(chain);
    size_t requestedBufSize = draw.getBitmap(*image, drawBitmapType_t::drawBitmapRGBA, 4, 0, 0);
    string buffer(requestedBufSize, char(0));
    draw.getBitmap(*image, drawBitmapType_t::drawBitmapRGBA, 4, &buffer.at(0), requestedBufSize);

所以我在里面有一个带位图的缓冲区。 (遵循文件的每一个字)。

然后我从这个缓冲区获取位图:

hBitmap = CreateBitmap(iWidth, iHeight, 1, 24, buffer);

现在我正在尝试在MFC PictureControl(在对话框窗口中)中显示它:

void CImebraDlg::OnPaint()
{
    CPaintDC dc(this); 
    CDC memdc;
    BITMAP b;

    //m_DicomImage - CStatic variable of PictureControl
    m_DicomImage.GetClientRect(&rect);
    ::GetObject(theApp.hBitmap, sizeof(BITMAP), &b);

    memdc.CreateCompatibleDC(&dc);
    memdc.SelectObject(&bmp);
    dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &memdc,
        0, 0, b.bmWidth, b.bmHeight, SRCCOPY);
    dc.MoveTo(0, 0);
}

并且没有发生,PictureControl中没有图像。

尝试这样:

void CImebraDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    SetImageToRictureControl(theApp.hBitmap);
} 

void CImebraDlg::SetImageToRictureControl(HBITMAP hbmp)
{
    m_DicomImage.SetBitmap(hbmp);
    UpdateData(FALSE);
}

同样的结果...... 您可以在屏幕截图中看到BITMAP结构。

enter image description here

bmBits为NULL ..这是不显示dicom图像的原因吗? 如何使用imebra lib显示DICOM图像?

0 个答案:

没有答案