Рисование на графическом объекте GDI + растрового изображения с использованием StretchDIBits для масштабирования - PullRequest
1 голос
/ 07 июня 2009

Я рисую растровые изображения на графическом объекте с помощью метода DrawImage, но изображений в большом количестве, поэтому рисование занимает слишком много времени. Я читал на этом форуме, что использование StretchDIBits занимает меньше времени для рисования. Я масштабирую изображение, вызывая Drawimage, но я хочу любой другой эффективный метод. У меня есть вектор растрового изображения *, и я хочу нарисовать каждое растровое изображение на графике.

HDC orghDC = graphics.GetHDC();
CDC *dc = CDC::FromHandle(orghDC);

m_vImgFrames - вектор изображения, связывающийся с Bitmap*. Я взял HBITMAP от Bitmap*.

HBITMAP hBitmap;
m_vImgFrames[0]->GetHBITMAP(Color(255,0,0),&hBitmap);

Используя эту HBITMAP, я хочу нарисовать на orghDC и, наконец, на графике. Поэтому я хочу знать, как StretchDIBits можно использовать для масштабирования растрового изображения и, наконец, для рисования на графическом объекте.

Я новичок в этом форуме. Любые идеи или код могут быть полезны

Ответы [ 2 ]

1 голос
/ 09 июля 2009

Вместо использования StretchDIBits, почему бы не использовать GDI + API напрямую для масштабирования растрового изображения?:

CRect rc( 0, 0, 20, 30 );

graphics.DrawImage( (Image*)m_vImgFrames[0], 
    rc.left, rc.top, rc.Width(), rc.Height() );
0 голосов
/ 15 июня 2010

Чтобы использовать StretchDIBits с Gdiplus::Bitmap, вы можете сделать следующее:

// get HBITMAP
HBITMAP hBitmap;
m_vImgFrames[0]->GetHBITMAP( Gdiplus::Color(), &hBitmap );
// get bits and additional info
BITMAP bmp = {};
::GetObject( hBitmap, sizeof(bmp), &bmp );
// prepare BITMAPINFO
BITMAPINFO bminfo = {};
bminfo.bmiHeader.biSize = sizeof( BITMAPINFO );
bminfo.bmiHeader.biWidth = bmp.bmWidth;
bminfo.bmiHeader.biHeight = bmp.bmHeight;
bminfo.bmiHeader.biBitCount = bmp.bmBitsPixel;
bminfo.bmiHeader.biCompression = BI_RGB;
bminfo.bmiHeader.biPlanes = bmp.bmPlanes;
bminfo.bmiHeader.biSizeImage = bmp.bmWidthBytes*bmp.bmHeight*4; // 4 stands for 32bpp
// select stretch mode
::SetStretchBltMode( HALFTONE );
// draw
::StretchDIBits( hDC, 0, 0, new_cx, new_cy, 0, 0,
  m_vImgFrames[0]->GetWidth(), m_vImgFrames[0]->GetHeight(), 
  bmp.bmBits, &bminfo, DIB_RGB_COLORS, SRCCOPY );

Но на моей машине это выглядит не намного быстрее, чем просто Graphics::DrawImage.

...