Fonctions graphiques

Le
riked
Bonjour (ou bonsoir),

Je fait actuellement un programme qui à pour but d'afficher plusieurs
bitmaps constamment en mouvement et ayant à la fois une couleur
transparente et à la fois être semi-transparente.Pour gérer la
transparence j'ai donc créer une fonction qui permet de rendre les
couleurs d'une image transparente par rapport au DC courant:

HBITMAP CouleurTransparente(HDC Src,HDC Dest,int Dx,int Dy,int Sx,int
Sy,COLORREF couleur)
{
for (int x = 0;x < Sx ;x++)
{
for (int y = 0;y < Sy;y++)
{
COLORREF clr = GetPixel(Src,x,y);
COLORREF tp = GetPixel(Dest,Dx+x,Dy+y);
if (clr == couleur) SetPixel(Src,x,y,tp);
}
}
return CreateCompatibleBitmap(dc,cx,cy);
}

Seulement, cette fonction est un peu lente et je doit l'utiliser une
dizaine de fois par seconde ce qui ralentie énormément le programme.

Je voudrais donc que quelqu'un puisse me donner une fonction
d'affichage rapide qui prend en compte l'affichage d'une image avec au
moins une couleur transparente comme la fonction "TransparentBlt" ET
l'affichage de l'image en semi-transparence comme le fait la fonction
"AlphaBlend".

Merci d'avance :)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Christian ASTOR
Le #19845951
riked wrote:

Seulement, cette fonction est un peu lente et je doit l'utiliser une
dizaine de fois par seconde ce qui ralentie énormément le programme.

Je voudrais donc que quelqu'un puisse me donner une fonction
d'affichage rapide qui prend en compte l'affichage d'une image avec au
moins une couleur transparente comme la fonction "TransparentBlt" ET
l'affichage de l'image en semi-transparence comme le fait la fonction
"AlphaBlend".



Oui, il ne faut pas utiliser GetPixel() qui est très lent.
Tu peux utiliser une DIB Section à la place.
Un exemple que j'avais posté qui change les pixels noirs en rouge =>
http://groups.google.com/group/comp.os.ms-windows.programmer.win32/msg/b448007b5a3949eb

ou avec les ImageLists : par ex, ceci affiche le logo de l'OS avec le
blanc pour couleur transparente et en "Blend" =>

HMODULE hLib = LoadLibrary(TEXT("Shell32.dll"));
HBITMAP hBitmap = (HBITMAP)LoadImage(hLib, MAKEINTRESOURCE(131),
IMAGE_BITMAP, 0, 0, 0);
FreeLibrary(hLib);
BITMAP bm;
GetObject(hBitmap, sizeof(bm), &bm);
HIMAGELIST hImageList = ImageList_Create(bm.bmWidth, bm.bmHeight,
ILC_COLORDDB |ILC_MASK, 1, 0);
ImageList_AddMasked(hImageList, hBitmap, RGB(255, 255, 255));
// Test affichage
HDC hDC = GetDC(NULL);
ImageList_DrawEx(hImageList, 0, hDC, 300, 20, bm.bmWidth, bm.bmHeight,
CLR_DEFAULT, CLR_NONE , ILD_BLEND25);
ReleaseDC(NULL, hDC);
riked
Le #19848621
Merci de cette réponse très rapide.Je pense que je vais plutôt
utiliser les DIB Sections qui me semble le mieux correspondre à mon
problème.
Si j'ai encore un problème d'affichage, je viendrais le dire ici.
Publicité
Poster une réponse
Anonyme