Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fonctions graphiques

2 réponses
Avatar
riked
Bonjour (ou bonsoir),

Je fait actuellement un programme qui =E0 pour but d'afficher plusieurs
bitmaps constamment en mouvement et ayant =E0 la fois une couleur
transparente et =E0 la fois =EAtre semi-transparente.Pour g=E9rer la
transparence j'ai donc cr=E9er 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 =3D 0;x < Sx ;x++)
{
for (int y =3D 0;y < Sy;y++)
{
COLORREF clr =3D GetPixel(Src,x,y);
COLORREF tp =3D GetPixel(Dest,Dx+x,Dy+y);
if (clr =3D=3D 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 =E9norm=E9ment 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 :)

2 réponses

Avatar
Christian ASTOR
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);
Avatar
riked
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.