Re: display array in a frame wnd
Hi Joseph,
I think you are probably right in the fact that my first applications using
document/view
were not satisfying me and and I did not go further.
At the moment, I think it will take me long time to understand correctly
document/view architecture and use
it correctly.
I have also to reconsider my class architecture (vision system - grabbing
system - cameras - external communications - image processing.- api
sequence..),
which is not easy. Some display are corresponding to several cameras (global
display), others are only for cameras.
I can't spend too much time for self training, and I have difficulties to
evaluate necessary time.
That is the reason why I go on my work on CFrameWnd. But perhaps CView can
be used as a CFramWnd
wich permits me perhaps to migrate slowly.
Here is the code I have used to display my IplImage* (pointer on my image
structure).
It works and I think the method to display the image in a CView or a
CFrameWnd must be similar.
CDisplayImg is a subclass of CFrameWnd
I just have to create a CDisplay object and
use
pDisplayImg->ShowImage(pImg) ;
to get a window with my image.
But, I have a little problem and perhaps you will have an idea.
When I resize the window(with the mouse on the border frame), the
refreshment is uncomfortable because it
goes from image to blank to image etc (it is flashing).
I have put the fonction DrawToHDC in the on paint function of the window.
Is there a technique to avoid this flashing.
It is the same if I want to draw with the mouse a rectangle (simulation of
selecting area)
If I want to see the drawing, it is flashing.
I think it is due to refreshment but I have no idea to optimize it.
Do you see something wrong.
Thank you for your help
Jeff
void CDisplayImg::ShowImage(IplIMage* pImg)
{
m_pImg = pImg ;
CRect rect ;
GetClientRect(&rect) ;
DrawToHDC(this->GetDC()->m_hDC,rect) ;
}
void CDisplayImg::DrawToHDC( HDC hDCDst, RECT* pDstRect,bool bFlag )
{
if( pDstRect && m_pImg && m_pImg->depth == IPL_DEPTH_8U &&
m_pImg->imageData )
{
int bmp_w = m_pImg->width, bmp_h = m_pImg->height;
CvRect roi = cvGetImageROI( m_pImg );
CvRect dst = RectToCvRect( *pDstRect );
if( roi.width == dst.width && roi.height == dst.height )
{
Show( hDCDst, dst.x, dst.y, dst.width, dst.height, roi.x,
roi.y );
return;
}
if( roi.width > dst.width )
{
SetStretchBltMode(
hDCDst, // handle to device context
HALFTONE );
}
else
{
SetStretchBltMode(
hDCDst, // handle to device context
COLORONCOLOR );
}
FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_pImg->origin );
::StretchDIBits(
hDCDst,
dst.x, dst.y, dst.width, dst.height,
roi.x, roi.y, roi.width, roi.height,
m_pImg->imageData, bmi, DIB_RGB_COLORS, SRCCOPY );
}
}
void CDisplayImg::FillBitmapInfo( BITMAPINFO* bmi, int width, int height,
int bpp, int origin )
{
assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 ||
bpp == 32));
BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
memset( bmih, 0, sizeof(*bmih));
bmih->biSize = sizeof(BITMAPINFOHEADER);
bmih->biWidth = width;
bmih->biHeight = origin ? abs(height) : -abs(height);
bmih->biPlanes = 1;
bmih->biBitCount = (unsigned short)bpp;
bmih->biCompression = BI_RGB;
if( bpp == 8 )
{
RGBQUAD* palette = bmi->bmiColors;
int i;
for( i = 0; i < 256; i++ )
{
palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed =
(BYTE)i;
palette[i].rgbReserved = 0;
}
}
}