2009-06-07 9 views
1

Je dessine des images bitmap sur un objet graphique en utilisant la méthode DrawImage Mais les images sont en grand nombre, donc cela prend trop de temps pour le dessin. J'ai lu dans ce forum que l'utilisation de StretchDIBits prend moins de temps pour le dessin. Je met à l'échelle l'image en appelant Drawimage mais je veux une autre méthode efficace. J'ai un vecteur de Bitmap * & Je veux dessiner chaque bitmap sur les graphiques.Dessiner sur un objet graphique GDI + un bitmap utilisant StretchDIBits pour la mise à l'échelle

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

m_vImgFrames est vecteur d'image containg Bitmap*. J'ai pris HBITMAP de Bitmap*.

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

En utilisant cette HBITMAP je veux tirer sur orghDC & enfin sur les graphiques. Donc, je veux savoir comment StretchDIBits peut être utilisé pour mettre à l'échelle le Bitmap et enfin dessiner sur l'objet graphique.

Je suis nouveau à cette idées forum.Any ou le code peut être utile

Répondre

1

Au lieu d'utiliser StretchDIBits, pourquoi ne pas utiliser l'API GDI + directement à l'échelle du bitmap ?:

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

graphics.DrawImage((Image*)m_vImgFrames[0], 
    rc.left, rc.top, rc.Width(), rc.Height()); 
+0

Merci pour votre réponse.J'ai déjà essayé d'utiliser DrawImage mais il est très lent.J'ai trouvé le moyen d'utiliser StretchDIBits & j'ai eu de très bonnes performances. – VideoDev

+0

J'allais commenter sur votre question, mais VideoDev m'a battu. Vous ne voulez pas utiliser DrawImage, car il est très lent. –

0

Pour utiliser StretchDIBits avec Gdiplus::Bitmap vous pouvez effectuer les opérations suivantes:

// 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); 

Mais cela ne semble pas beaucoup plus vite sur ma machine que la simple Graphics::DrawImage .

Questions connexes