2009-06-07 4 views
1

Ich zeichne Bitmap-Bilder auf Grafikobjekt mit DrawImage-Methode Aber die Bilder sind in großer Zahl, so dass es zu viel Zeit für das Zeichnen dauert. Ich habe in diesem Forum gelesen, dass die Verwendung von StretchDIBits weniger Zeit für das Zeichnen benötigt. Ich skaliere das Bild durch Aufruf von Drawimage, aber ich möchte eine andere effiziente Methode. Ich habe einen Vektor von Bitmap * & Ich möchte jedes Bitmap auf Grafiken zeichnen.Zeichnen auf GDI + -Grafik-Objekt ein Bitmap mit StretchDIBits zum Skalieren

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

m_vImgFrames ist Bild Vektor containg Bitmap*. Ich habe HBITMAP von Bitmap* genommen.

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

Mit diesem HBITMAP i auf Grafiken & schließlich auf orghDC zeichnen möchten. Ich möchte also wissen, wie StretchDIBits zum Skalieren der Bitmap und schließlich zum Zeichnen auf Graphics Object verwendet werden kann.

Ich bin neu in diesem forum.Any Ideen oder Code kann

Antwort

1

Anstelle der Verwendung von StretchDIBits hilfreich sein, verwenden warum nicht die GDI + API direkt auf die Bitmap-Skalierung ?:

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

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

Vielen Dank für Ihre Antwort.Ich habe bereits versucht mit DrawImage, aber es ist sehr langsam.Ich habe den Weg gefunden, um StretchDIBits zu verwenden, und ich habe sehr gute Leistung. – VideoDev

+0

Ich wollte deine Frage kommentieren, aber VideoDev hat mich dazu gebracht. Sie möchten DrawImage nicht verwenden, da es sehr langsam ist. –

0

StretchDIBits nutzen zu können, mit Gdiplus::Bitmap könnten Sie wie folgt vorgehen:

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

das sieht aber nicht viel schneller auf meiner Maschine als einfache Graphics::DrawImage .