begin process at 2008 07 05 00:51:03
1 205 021 membres
10 nouveaux aujourd'hui
14 118 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Surlignage semi transparent dans un Bitmap ? [ Archives / Graphique ] (TigWdz)

Surlignage semi transparent dans un Bitmap ? le 02/01/2005 15:15:44

TigWdz
Bonjour, je voudrais faire du surlignage dans une bitmap. Je m'explique : J'ai une bitmap qui représente du texte, et je veux, à la manière d'un marqueur fluo, surligner des lignes du texte, en semi transparence. Comment faire ?
Je pense qu'il faut utilmiser AlphaBlend. J'arrvie a rendre ma bitmap semi transparente (ce qui n'est pas le but), mais je n'arrive pas a faire un rectangle de couleur semi transparent dans ma bitmap.

Mon code : (que j'ai plus attrapé sur le net à la base, au quelle j'ai essayé de bidouillé de la transparence)

void CArchiv2View::DrawBitmap( CDC *pDC, HBITMAP hBitmap, HPALETTE hPal, int xDest, int yDest )
{
// Get logical coordinates
BITMAP bm;
::GetObject( hBitmap, sizeof( bm ), &bm );
CPoint size( bm.bmWidth, bm.bmHeight );
pDC->DPtoLP(&size);

CPoint org(0,0);
pDC->DPtoLP(&org);


// Mon DC mémoire

// Create a memory DC compatible with the destination DC
CDC memDC;
memDC.CreateCompatibleDC( pDC );
memDC.SetMapMode( pDC->GetMapMode() );

//memDC.SelectObject( &bitmap );
HBITMAP hBmOld = (HBITMAP)::SelectObject( memDC.m_hDC, hBitmap );


// Je me suis dis qu'il fallais que je créé un DC dans le quel je //dessinais ma ligne

CDC LigneDC;
LigneDC.CreateCompatibleDC( pDC );
LigneDC.SetMapMode( pDC->GetMapMode() );
CRect rc=CRect(200, 200, 700, 220);
CBrush brush(RGB(255, 255, 0));
LigneDC.FillRect(rc, &brush);

// les propriétes de transparence
BLENDFUNCTION blendF;
blendF.BlendOp = AC_SRC_OVER;
blendF.BlendFlags = 0;
blendF.SourceConstantAlpha = 100;
//blendF.AlphaFormat = AC_SRC_ALPHA;
blendF.AlphaFormat = 0;


// je copie en tranparence le DC contenant la ligne dans le memDC (qui contient deja ma bitmap)

memDC.AlphaBlend(0, 0, 1000, 1000, &LigneDC, 0, 0, 1000, 1000, blendF);


// Select and realize the palette
if( hPal && pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE)
{
SelectPalette( pDC->GetSafeHdc(), hPal, FALSE );
pDC->RealizePalette();
}

// et je copie le memDC dans mon PaintDC
pDC->BitBlt(xDest, yDest, size.x, size.y, &memDC, org.x, org.y, SRCCOPY);

::SelectObject( memDC.m_hDC, hBmOld );
}




Que est ce qui cloche ?

Re : Surlignage semi transparent dans un Bitmap ? le 02/01/2005 15:37:02

DARKSIDIOUS
Membre Club
(Admin CS)
Ce que je te conseille : travailler dans un DC temporaire qui contient l'image en fond, et la couleur de surlignage sur tout l'image, ainsi, tu n'aurais plus qu'à copier la zone voulue avec BitBlt par exemple.
_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer

Re : Surlignage semi transparent dans un Bitmap ? le 02/01/2005 16:08:53

TigWdz
Mais comment je fais pour avoir un DC qui contient mon image ET ma couleur de surlignage (en semi transparence) sur toute l'image ?

Re : Surlignage semi transparent dans un Bitmap ? le 02/01/2005 16:20:05

DARKSIDIOUS
Membre Club
(Admin CS)
Ben tout d'abord tu copie ton image dans le DC temporaire. Ensuite, tu crée un nouveau DC temporaire qui contient uniquement la couleur de transparence en fond.

Tu applique le DC temporaire de la couleur de surlignage sur le DC temporaire contenant le fond à l'aide de la fonction AlphaBlend sur toute l'image, et tu détruit le DC temporaire contenant la couleur de fond.

Tu obtiens alors un DC temporaire avec l'image surlignée en semi-transparence, et tu n'as plus qu'à copier la partie de l'image que tu veux sur ton image de destination selon les coordonnées du surlignage.

Ainsi, ca évite de devoir appeler trop souvent AlphaBlend : si tu modifie ton surlignage souvent, tu n'as qu'à copier le bout d'image correspondant, et non recalculer toute la semi-transparence avec la couleur !
_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer

Re : Surlignage semi transparent dans un Bitmap ? le 02/01/2005 17:19:40

TigWdz
Bon je débude dans le domaine alors je metrise pas trop la chose. Pourquoi cela ne fonctionne pas ? (le surlignage n'apparait pas dans mon imgae)

NB : dans a la derniere ligne quand je remplace &memDC par &TempImgDC ou &TempClrDC (pour voir a quoi ressemble ces DC) rien ne s'affiche, ils sembles vides.

NB : je dessine dans une child frame d'une appli MDI

void CArchiv2View::DrawBitmap2( CDC *pDC, HBITMAP hBitmap, HPALETTE hPal, int xDest, int yDest )
{
// Get logical coordinates
BITMAP bm;
::GetObject( hBitmap, sizeof( bm ), &bm );
CPoint size( bm.bmWidth, bm.bmHeight );
pDC->DPtoLP(&size);

CPoint org(0,0);
pDC->DPtoLP(&org);

// Create a memory DC compatible with the destination DC
CDC memDC;
memDC.CreateCompatibleDC( pDC );

// DC Temporaire contenant l'image
CDC TempImgDC;
TempImgDC.CreateCompatibleDC( pDC );

// DC Temporaire contenant la couleur de transparence
CDC TempClrDC;
TempClrDC.CreateCompatibleDC( pDC );
TempClrDC.SetBkColor(RGB(255, 255, 0));

// on copie l'image dans le memDC
HBITMAP hBmOld = (HBITMAP)::SelectObject( memDC.m_hDC, hBitmap );

// on copie l'image dans le DC temporaire
TempImgDC.BitBlt(xDest, yDest, size.x, size.y, &memDC, org.x, org.y, SRCCOPY);

// infos blend
BLENDFUNCTION blendF;
blendF.BlendOp = AC_SRC_OVER;
blendF.BlendFlags = 0;
blendF.SourceConstantAlpha = 100;
blendF.AlphaFormat = 0;

// on copie le DC couleur en transpance sur le DC temp image
TempImgDC.AlphaBlend(xDest, yDest, size.x, size.y, &TempClrDC, xDest, yDest, size.x, size.y, blendF);

memDC.BitBlt(100,100, 300, 20, &TempImgDC, 100, 100, SRCCOPY);

// on detruit le dc couleur
TempClrDC.DeleteDC();

pDC->BitBlt(xDest, yDest, size.x, size.y, &memDC, org.x, org.y, SRCCOPY);
}

Re : Surlignage semi transparent dans un Bitmap ? le 02/01/2005 17:26:04

DARKSIDIOUS
Membre Club
(Admin CS)
Je ne sais pas si ca vient de là (tout dépend des coordonnées en fait), mais pour l'appel à l'AlphaBlend, je te disais d'appliquer la semitransparence à tout l'image et non uniquement à un bout, donc fait ceci :

// on copie le DC couleur en transpance sur le DC temp image
TempImgDC.AlphaBlend(0, 0, size.x, size.y, &TempClrDC, 0, 0, size.x, size.y, blendF);
_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer

Re : Surlignage semi transparent dans un Bitmap ? le 02/01/2005 17:38:21

TigWdz
Ca n'a rien changé.

Mais est ce normale que dans la derniere commande, si au lieu de

pDC->BitBlt(xDest, yDest, size.x, size.y, &memDC, org.x, org.y, SRCCOPY);

je mets

// pour afficher le DC temporaire contenant une copie de l'image
pDC->BitBlt(xDest, yDest, size.x, size.y, &TempImgDC, org.x, org.y, SRCCOPY);

ou

// pour afficher le DC de la couleur de surlignage (qui devarait être jaune)
pDC->BitBlt(xDest, yDest, size.x, size.y, &TempClrDC, org.x, org.y, SRCCOPY);

pour voir a quoi reseemblent les DC temporaire, rien ne s'affiche ?

Re : Surlignage semi transparent dans un Bitmap ? le 02/01/2005 17:54:48

DARKSIDIOUS
Membre Club
(Admin CS)
Malheureusement, je ne vais pas pouvoir t'aider plus : je suis un programmeur VB, et je suis débutant en C++ : je suis beaucoup moins à l'aise sous VC++ pour faire du graphisme ! Je laisserais donc cette question à ceux qui passent par là et qui connaissent la réponse. Je ne peux que te guider dans l'algorithme à choisir.
_______________________________________

DarK Sidious

[Responsable API/VB du site www.ProgOtoP.com]
Téléchargez ProgOtoP API Viewer

Re : Surlignage semi transparent dans un Bitmap ? le 02/01/2005 17:58:17

TigWdz
Merci quand même .

Re : Surlignage semi transparent dans un Bitmap ? le 03/01/2005 22:30:47

vdust
Je pense que le problème viens de ta manipulation des bitmaps, qui permettent de mémoriser les données graphiques de tes DC. Lorsque tu écris

HBITMAP hBmOld = (HBITMAP)::SelectObject( memDC.m_hDC, hBitmap );


tu associes la bitmap hBitmap au DC memDC. Une chose que tu dois savoir : chaque DC doit avoir une bitmap unique associée pour pouvoir manipuler son contenu. Tu doit donc créer pour chaque DC une nouvelle bitmap avec la fonction CreateCompatibleBitmap avant de pouvoir effectuer des opérations dessus.

De plus, tu dois pouvoir utiliser les capacités de la fonction AlphaBlend : Au lieu d'écrire

pDC.AlphaBlend(0, 0, 1000, 1000, &LigneDC, 0, 0, 1000, 1000);

tu peux écrire

pDC.AlphaBlend(l, t, r, b, &LigneDC, l, t, r, b);

où (l, t) et (r, b) sont les coordonnées respectives des coins gauche-
haut et droit-bas du rectangle que tu veux surligner. Dans ce cas, Tu créer avec CreateCompatibleBitmap une bitmap de la même taille que l'image source hBitmap que tu associes à LigneDC et que tu rempli avec la couleur de surlignage en utilisant FillRect sur toute l'image.

Voilà ! J'espère que ça marchera (en tout cas, en théorie, c'est a priori ça).


[Page 1 Page 2]
Classé sous : bitmap, pdc, hbitmap, memdc, blendf

Participer à cet échange

Livres en rapport

Pub



Appels d'offres

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS