Re: StretchBlt() and memory usage
William schrieb:
My app need to deal with large DIB bitmap(256color, cx=4000, cy=4000)
with scale(x8) and mask display function.
I did as follows,
hdcImage = CreateCompatibleDC(hdcParent);
hbmImage = Create256DIBitmap(hdcParent, cxImage, cyImage, FALSE );
SelectObject(hdcImage, hbmImage);
hdcMask = CreateCompatibleDC(hdcImage);
hbmMask = Create256DIBitmap(hdcParent, cxImage, cyImage, TRUE);
SelectObject(hdcMask, hbmMask);
hdcShow = CreateCompatibleDC(hdcImage);
hbmShow = CreateCompatibleBitmap(hdcImage, cxScale, cyScale);
SelectObject(hdcShow, hbmShow);
To show the image, we call the following function
void CDIBView::OnDrawScaleImage(CDC* pDC)
{
BYTE MaskByte = 0x00~0xFF;
memset(pvBitsMask, MaskByte, nSizeOfColorBitMask);
BitBlt( hdcMask, 0, 0, cxImage, cyImage, hdcImage, 0, 0, SRCAND);
StretchBlt( hdcShow, 0, 0, cxScale, cyScale, hdcMask, 0, 0, cxImage,
cyImage, SRCCOPY);
// Copy the bits to the screen.
BitBlt(pDC->m_hDC, 0, 0, cxScale, cyScale, hdcShow, 0, 0, SRCCOPY);
}
I find that StretchBlt() will use quite a lot of system memory when
cxScale=cxImage*8, cyScale=cyImage*8.
Yes sure. You are creating a hbmShow bitmap of up to 4000*8*4000*8 byte (nearly
a gig), what did you expect where it goes if not into system memory?
There is no need to generate such a large bitmap. All BitBlt and StrechBlt
operations can usually be used directly on your paint DC. So why don't you
remove the hdcShow and StrechBlt directly onto your screen? Or if you need the
double buffering for some reason, make hdcShow to be the same size as your window.
Norbert