我使用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结构。
bmBits为NULL ..这是不显示dicom图像的原因吗? 如何使用imebra lib显示DICOM图像?