2009-07-23 7 views
2

Wie konvertiert man eine Bitmap-ähnliche Struktur in eine HDC?Wie konvertiert man eine gdi + Bitmap-ähnliche Struktur in eine HDC?

Ich schreibe jetzt Bildverarbeitungsprogramm in C++, GDI.

Wenn ich einen HDC habe. Ich kann auf dem HDC in GDI zeichnen, was ich mag, durch den folgenden Code.

// HDC is handy. 
HDC dc; 
dc.DrawXXX  // I can draw using gdi method. 
Graphics gr(dc); // now I can also draw on the dc using gdi+ method. 

Meine Anwendung basiert auf FreeImage. Ich mache von fipImage. (benutze Datenstruktur wie Bitmap)

Wenn ich jedoch auf fipWinImage zeichnen möchte, muss ich jetzt fipWinImageto Bitmap kopieren, dann auf die Bitmap zeichnen und schließlich die Bitmap wieder in fipImage konvertieren, was zeitaufwendig und mühsam ist .

Convert fipImage zu Bitmap -> auf der Bitmap-Draw -> konvertieren Bitmap fipWinImage

fipWinImage imagefip; 
Bitmap* tempImg = new Bitmap(imagefip->GetWidth(), imagefip.GetHeigt(), PixelFormat24bppRGB); // memory comsuming is image is large 
Graphics *pGr = Graphics::FromImage(tempImg); 

HDC dc = pGr->GetHDC(); 

RECT rec; 
rec.left = 0; 
rec.top = 0; 
rec.right = imagefip.GetWidth(); 
rec.bottom = imagefip.GetHeight(); 
fipImage.draw(dc, rec); // using stretchdibits() 
pGr->ReleaseHDC(dc); 

Graphics gr(tempImg); 
HDC dc = gr.GetHDC();   // Get an Hdc, draw using gdi method 
gr.ReleaseHDC(tempDC);  // 
gr.drawXXX       // Draw using gdi+ method. 


fipWinImage fipImg;    // final result fipWinImage. 
HBITMAP temp; 
Color color; 
tempImg->GetHBITMAP(color, &temp); 
fipImg->copyFromBitmap(temp); 

ich einen HDC direkt von fipImage bauen will. und zeichne direkt auf fipWinImage Wie kann ich das tun?

Antwort

0

Ich weiß nicht FreeImage, aber wenn Sie einen Zeiger auf die tatsächlichen Pixeldaten (DIB-Abschnitt) erhalten können, könnten Sie einfach eine HBITMAP erstellen, die es teilt, ohne die Daten jedes Mal zu kopieren.

2

zunächst einige Erläuterungen:

A Device Context ist im Grunde eine Struktur, die Dinge wie Vorder- und Hintergrundfarben, Pinsel, Schriftinformationen und die physikalische Zeichenfläche (Bitmap) erinnert.

Dies ist eine praktische Sache, so dass Sie alle diese Dinge nicht halten müssen angeben, wenn Sie nach dem anderen Grafik Betrieb tun. Sie können auch alle diese Einstellungen auf diese Weise leichter umgehen. Das ist alles, was ein DC wirklich ist - nur eine Sammlung von Zeichnungsparametern, einschließlich der Oberfläche, auf die man zurückgreifen kann.

An „HDC“ ist nur ein Handgriff (Referenz) auf eine dieser Strukturen. Ein "Handle" zu sein, lässt das Fenster die Struktur im Speicher verschieben, um freien Speicherplatz zu verwalten, ohne dass die Zeiger darauf herumlaufen.

Wenn Sie den Zugriff auf den Quellcode für die Bibliothek haben Sie verwenden, überprüfen Sie die fipWinImage :: draw (...) -Methode. Wenn sie StretchDIBits verwenden, müssen sie ihre Rohbitmap-Daten irgendwann in ein kompatibles Format konvertieren. Es ist auch möglich, dass die fipWinImage Klasse einer zugrunde liegenden Bitmap- oder DIB wickelt usw.

Der letzte Schritt Ihre eigene HDC zu bekommen ...

Eine Bitmap in einen Gerätekontext ist „ausgewählt“, und kann nur in einem einzigen DC auf einmal ausgewählt werden. Wenn Sie das interne HBITMAP von fipWinImage abrufen können, können Sie es in einem anderen Domänencontroller auswählen (unter der Annahme, dass es noch nicht in einem anderen HC ausgewählt ist).

Wenn Sie eine DC erstellen, erstellt Windows automatisch eine 1x1 Bitmap für sie (da ein DC eine ausgewählte Bitmap zu allen Zeiten haben muss). Wenn Sie in einer neuen Bitmap auswählen, erhalten Sie das Handle für die zuvor ausgewählte Bitmap, die Ihnen zurückgegeben wird. Bleib dran, denn du musst es zurückstellen, wenn du fertig bist.

Hoffe, dass hilft.