[Insight-users] ITK VTK MFC - create bitmap from ITK image

Mark Wyszomierski markww at gmail.com
Fri May 20 14:21:24 EDT 2005


Renaud,

If you call SetParentId() from vtkImageViewer, or vtkImageViewer2, the
render context will be 'framed' within the window you passed as its
parent, it works really well, and you don't need to deal with HBITMAPs
etc.

If you don't want to do that, you are already using MFC, so look at
the MFC class CImage. It really simplifies working with bitmaps at
getting them painted to your dc.

Mark

On 5/20/05, Renaud Isabelle <renauisa at yahoo.fr> wrote:
> 
> Dear users,
>  
> I have to build an user interface by using MS VC++ for medical image
> processing. Instead of having to compute reading of image files, I am using
> ITK-VTK but I am quite new in this.
>  
> - I read a raw 3D image using ITK and, as you suggested in
> "http://public.kitware.com/pipermail/insight-users/2003-April/003345.html",
>  I use itkExtractImageFilter to create a 2D image from the 3D volume and get
> the pixel data in a buffer with: 
> extractFilter->GetOutput()->GetBufferPointer().
>  
> - I would like to create a bitmap  from this data using MFC classes to show
> the image in a frame of my user interface already built. To do so, I use
> HBitmap and CreateDIBitmap, but HBITMAP returned is NULL and nothing
> happens. 
>  
> - Can you suggest me a way to use VTK to display my image not in a modal
> window apart as implemented in vtkImageViewer, but in a frame of my
> interface?
>  
> I joined a part of my code below. Please help me.
>  
> Thanks in advance,
>  
> Isabelle Renaud
>  
> //-------code----------------------
>  if(extension == "raw")
>  {
>    //declarations
>   typedef itk::Image< short, 3> ImageType;
>   typedef itk::ImageFileReader< ImageType > ReaderType;
>     
>   //initialisations
>   ReaderType::Pointer reader = ReaderType::New();
>    
>   //provide minimum info
>   reader->SetFileName("myImage.mhd");
>  
>   try
>   {
>    reader->Update();
>   }
>   catch(itk::ExceptionObject &exception)
>   {
>    CString msg;
>    msg.Format("Erreur: %s", exception.GetDescription());
>    AfxMessageBox(msg, MB_ICONERROR);
>   }
>  
>   //Create a device context to load the bitmap into
>   CPaintDC dc(this); 
>   dcMem.CreateCompatibleDC(&dc);
>   if(GrabRAWFrame(1) != NULL) Invalidate();
>   else AfxMessageBox("erreur a creation de image BMP\n");
>  }
> }
>  
> HBITMAP CSequenceAvi::GrabRAWFrame(int frame)
> {
>  //declarations
>  typedef short PixelType;
>  typedef itk::Image< PixelType, 2 > ImageType2D;
>  typedef itk::Image< PixelType, 3 > ImageType3D;
>   
>  typedef itk::ImageFileReader< ImageType3D > ReaderType;
>  typedef itk::ExtractImageFilter< ImageType3D, ImageType2D > ExtractType;
>  
>  //initialisations
>  ReaderType::Pointer reader = ReaderType::New();
>  ExtractType::Pointer extractFilter = ExtractType::New();
>  reader->SetFileName("myImage.mhd");
>  reader->Update();
>  ImageType3D::RegionType inputRegion = 
>   reader->GetOutput()->GetLargestPossibleRegion();
>  ImageType3D::SizeType size = inputRegion.GetSize();
>  size[2] = 0;
>  ImageType3D::IndexType start = inputRegion.GetIndex();
>  start[2] = frame;
>  //creation of an image region
>  ImageType3D::RegionType desiredRegion;
>  desiredRegion.SetSize(size);
>  desiredRegion.SetIndex(start);
>  //region passed to filter to extract
>  extractFilter->SetExtractionRegion(desiredRegion);
>  //connect an d execute
>  extractFilter->SetInput(reader->GetOutput());
>  try{
>   extractFilter->Update();
>  }
>  catch(itk::ExceptionObject &exception)
>  {
>   CString msg;
>   msg.Format("Erreur: %s", exception.GetDescription());
>   AfxMessageBox(msg, MB_ICONERROR);
>  }
>  
>  //get the data
>  ImageType2D::Pointer image = extractFilter->GetOutput();
>  short* pData =
> extractFilter->GetOutput()->GetBufferPointer();
>  
>  BITMAPINFOHEADER bih;
>  memset(&bih, 0, sizeof(BITMAPINFOHEADER));
>  bih.biBitCount=24; //16 bits per pixel
>  bih.biClrImportant=0;
>  bih.biClrUsed=0;
>  bih.biCompression=BI_RGB;//uncompressed format
>  bih.biPlanes=1;//always
>  bih.biSize= 40; //nb of bytes required by the structure BITMAPINFOHEADER
>  bih.biWidth=width;
>  bih.biHeight=height;
>  bih.biXPelsPerMeter=0;
>  bih.biYPelsPerMeter=0;
>  bih.biSizeImage=((((bih.biWidth * bih.biBitCount)+31)& ~31)
> >>3)*bih.biHeight;
>  //0 for uncompressed images
>  
>  //on cree l image
>  CPaintDC dc(this);
>  HBITMAP hBitmap = CreateDIBitmap(dc,//handle of device context
>      (BITMAPINFOHEADER*)&bih,//address of bitmap size and
> format data
>      CBM_INIT,//initialization flag
>      pData,//address of initialization data
>      (BITMAPINFO*)&bih,//address of bitmap color format data
>      DIB_RGB_COLORS);//color data usage
>  return hBitmap;
> }
> 
> void CSequenceAvi::OnPaint() 
> {
>  CPaintDC dc(this); // device context for painting
>  
>  // TODO: Add your message handler code here
>  ShowBitmap(&dc);
>  //Draw rectangle
>  SetPenBrush(&dc);
>  dc.Rectangle(rect_roi);
>  ResetPenBrush(&dc);
> }
> 
> void CSequenceAvi::ShowBitmap(CPaintDC *pDC)
> {
>    //Sélectionner 1 nouvel objet en memoire, détruire l'ancien 
>  HGDIOBJ pOldObj = SelectObject(dcMem,hBitmap);
>  if(pOldObj) DeleteObject(pOldObj);
>  
>  //draw avi file in a fixed rectangle
>  CRect rect;
>  GetDlgItem(IDC_RECT)->GetWindowRect(rect);
>  ScreenToClient(rect);//convert coord of rect on screen to client area coord
>  
>  //move the bitmap from the memory to the screen
>  pDC->StretchBlt(0,0,rect.Width(),rect.Height(),
>         &dcMem, 0,0,
>         width, height,SRCCOPY);
> }
> 
> ________________________________
> Découvrez le nouveau Yahoo! Mail : 1 Go d'espace de stockage pour vos mails,
> photos et vidéos !
> Créez votre Yahoo! Mail 
> 
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
> 
> 
>


More information about the Insight-users mailing list