Accueil > Forum > > > > Surlignage semi transparent dans un Bitmap ?
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
|
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
|
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
|
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
|
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 ?
|
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).
|
|
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
Livres en rapport
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|