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

Renaud Isabelle renauisa at yahoo.fr
Tue May 24 20:11:57 EDT 2005


Hi,
 
I tried SetParentId() from vtkImageViewer to make my 2D image displayed in the window I pass. It works well. 
 
However, my image is still displayed with its own dimensions, not the window's one. Could someone suggest me a way to stretch my image to the window size like I used to do with StretchBlt(for HBITMAP).
 
By the way, what's the difference between vtkImageViewer and vtkImageViewer2?
 
Thanks a lot,
 
ISabelle 

Mark Wyszomierski <markww at gmail.com> a écrit :
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 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
> 
> 
>

		
---------------------------------
 Découvrez le nouveau Yahoo! Mail : 1 Go d'espace de stockage pour vos mails, photos et vidéos !
Créez votre Yahoo! Mail  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://public.kitware.com/pipermail/insight-users/attachments/20050525/99562a59/attachment.html


More information about the Insight-users mailing list