begin process at 2010 02 10 07:23:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Graphique

 > 

Surlignage semi transparent dans un Bitmap ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Surlignage semi transparent dans un Bitmap ?

dimanche 2 janvier 2005 à 15:15:44 | Surlignage semi transparent dans un Bitmap ?

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 ?
dimanche 2 janvier 2005 à 15:37:02 | Re : Surlignage semi transparent dans un Bitmap ?

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
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
dimanche 2 janvier 2005 à 16:08:53 | Re : Surlignage semi transparent dans un Bitmap ?

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 ?
dimanche 2 janvier 2005 à 16:20:05 | Re : Surlignage semi transparent dans un Bitmap ?

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
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
dimanche 2 janvier 2005 à 17:19:40 | Re : Surlignage semi transparent dans un Bitmap ?

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);
}
dimanche 2 janvier 2005 à 17:26:04 | Re : Surlignage semi transparent dans un Bitmap ?

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
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
dimanche 2 janvier 2005 à 17:38:21 | Re : Surlignage semi transparent dans un Bitmap ?

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 ?
dimanche 2 janvier 2005 à 17:54:48 | Re : Surlignage semi transparent dans un Bitmap ?

DARKSIDIOUS

Membre Club Administrateur CodeS-SourceS
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
dimanche 2 janvier 2005 à 17:58:17 | Re : Surlignage semi transparent dans un Bitmap ?

TigWdz

Merci quand même .
lundi 3 janvier 2005 à 22:30:47 | Re : Surlignage semi transparent dans un Bitmap ?

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

1 2

Cette discussion est classée dans : bitmap, pdc, hbitmap, memdc, blendf


Répondre à ce message

Sujets en rapport avec ce message

SetClipboardData + CF_BITMAP [ par vecchio56 ] J'essaye de mettre un bitmap dans la clipboard, mais vu que je ne sais pas trop comment ca marche les bitmap, je galère un peu. Voila ou j'en suis:HBI Affichage d'un Bitmap [ par vintrouj ] Bonjour,je cherche à afficher une image bitmap préalablement chargé dans un objet de type CBitmap. Le code que j'utilise affiche l'image pendant très Bitmap [ par zainal ] Salut a vousbon voila, je voudrai afficher une bitmap dans une zone de static et j ai creer ce bout de code qui ne marche pas vous vous en douter !voi Diaporama d'images bitmaps... le plus simple possible... [ par Druith2 ] Bonjour, je galère depuis le début de la semaine (je suis un neophyte veritable). Je cherche un moyen simple pour créer un diaporama de 12 images bitm Accelération affichage image bitmap [ par corben dallas ] Bonjour à tous,Mon problème est le suivant: je cherche à afficher un flux vidéo constitué d'images bitmap dans une fenêtre. Mon code est le suivant:dc Afficher une bitmap ... - API Windows [ par banane_rose ] hBitmap = LoadImage(hInst, "Timer.bmp", IMAGE_BITMAP, 10, 10, LR_DEFAULTSIZE|LR_LOADFROMFILE); Message d'erreur : invalid conversion from `void*' to redimentionnement d'image, aidez-moi svp [ par sousou_one ] salut à tous,je veux construire une bitmap par copie d'une région d'une bitmap source, je dois prendre les nouvelles dimensions en sélectionnant la ré pd de cdc en mémoire :( [ par CoyoteVsBeepBeep ] hello,j'ai un petit soucis avec du graphisme.j'ai une boite de dialogue dans laquelle je veux faire une petite animation (background + une animation p Bitmap et MFC [ par torNADoS ] Salut,je voudrais savoir comment puis je acceder au bits d'une image bitmap sous MFCsuuposons que j ai HBITMAP hBitmap//handlerCBitmap m_bmpBitmap//Im Comment fabriquer un HBITMAP à partir d'un Bitmap* (GDI+) ? [ par Hellbar ] Bonjour !Je bute sur un problème depuis quelques jours.Je réalise une application qui doit être capable de charger un bitmap à partir d'un fichier, en


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales