2009-07-23 22 views
2

Comment convertir une structure de type bitmap en HDC?Comment convertir une structure de type gdi + bitmap en HDC?

Je suis en train d'écrire un programme de traitement d'image en C++, gdi.

Si j'ai un HDC. Je peux dessiner ce que je veux sur le HDC en gdi par le code suivant.

// 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. 

Mon application est basée sur FreeImage. Je fais de fipImage. (utiliser la structure de données comme Bitmap)

Cependant, si je veux dessiner sur fipWinImage, maintenant je dois copier fipWinImageto Bitmap, puis dessiner sur le bitmap, et enfin convertir le bitmap en fipImage à nouveau, ce qui est temps comsuming et mémoire comsuming .

Convertir fipImage à Bitmap -> Dessiner sur le bitmap -> convertir 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); 

Je veux construire un HDC directement à partir fipImage. et dessiner directement sur fipWinImage Comment est-ce que je peux faire ceci?

Répondre

0

Je ne connais pas FreeImage, mais si vous pouvez obtenir un pointeur sur les données de pixels réelles (section DIB), vous pouvez simplement créer un HBITMAP qui le partage sans avoir à copier les données à chaque fois.

2

D'abord quelques précisions:

Un contexte de périphérique est essentiellement une structure qui se souvient des choses comme des couleurs de premier plan et arrière-plan, des brosses, des informations sur les polices, et la surface de dessin physique (bitmap).

Ceci est une chose pratique, de sorte que vous ne devez pas continuer à spécifier toutes ces choses lorsque vous effectuez une opération graphique après l'autre. Vous pouvez également passer tous ces paramètres plus facilement de cette façon. C'est tout ce qu'un DC est vraiment - juste une collection de paramètres de dessin, y compris la surface à dessiner.

Un "HDC" est juste une poignée (référence) à l'un de ces structs. Être un "Handle" permet à la fenêtre de déplacer la structure autour de la mémoire pour gérer l'espace libre sans que vos pointeurs ne se fâchent.

Si vous avez accès au code source de la bibliothèque que vous utilisez, examinez la méthode fipWinImage :: draw (...). S'ils utilisent StretchDIBits, ils doivent obtenir leurs données bitmap brutes dans un format compatible à un moment donné. Il est également possible que la classe fipWinImage est enveloppait un BITMAP sous-jacente ou DIB, etc.

L'étape finale pour obtenir votre propre HDC ...

Un bitmap est « donné » dans un contexte de l'appareil, et ne peut être sélectionné dans un seul DC en même temps. Si vous pouvez obtenir le HBITMAP interne à partir de fipWinImage, vous pouvez le sélectionner dans un autre DC (en supposant qu'il n'est pas encore sélectionné dans un autre HC). Lorsque vous créez un contrôleur de domaine, Windows crée automatiquement un bitmap 1 x 1 (car un contrôleur de domaine doit disposer d'un bitmap sélectionné à tout moment). Lorsque vous sélectionnez dans un nouveau bitmap, vous récupérez le handle vers le bitmap précédemment sélectionné. Accrochez-vous à cela, car vous aurez besoin de le remettre lorsque vous avez terminé.

Espérons que ça aide.