BitBlt / StretchDIBits ??

Signaler
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
-
Messages postés
1
Date d'inscription
mercredi 22 novembre 2000
Statut
Membre
Dernière intervention
10 août 2005
-
salut a tous

voila, j'ai besoin de blitter des données graphique a l'ecran, et ce de maniere tres tres rapide car c'est une operation que je fait extremement souvent dans mon programme

pour l'heure, j'utilise StretchDIBits, qui gere l'etirement mais qui ne me sert strictement a rien, du moins ca ne me sert a rien si je peux peux faire plus rapide sans etirement

j'imagine que la gestion du redimensionnement doit prendre pas mal de ressource, et donc je voudrais echanger contre un BitBlt, pour tester, seulement je vous explique pourquoi j'ai choisi StretchDIBits, c'est tres simple :

void FAR PASCAL
StretchDIB(
LPBITMAPINFOHEADER biDst,
LPVOID lpvDst,
int DstX,
int DstY,
int DstXE,
int DstYE,
LPBITMAPINFOHEADER biSrc,
LPVOID lpvSrc, // <----- BUFFER DIRECTE
int SrcX,
int SrcY,
int SrcXE,
int SrcYE
)

en gros la fonction me permet de blitter directement un buffer contenant des données de couleur (pixels), voila pourquoi je l'utilise, c'est super simple

maintenant voyons BitBlt :

BOOL BitBlt(
HDC hdcDest, // handle to destination DC
int nXDest, // x-coord of destination upper-left corner
int nYDest, // y-coord of destination upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXSrc, // x-coordinate of source upper-left corner
int nYSrc, // y-coordinate of source upper-left corner
DWORD dwRop // raster operation code
);

mon probleme ce situe ici :

HDC hdcSrc, // handle to source DC

comment passer d'un buffer int* a un HDC, de maniere tres rapide ?

merci d'avance pour votre aide =)
a++

3 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
- d'abord au début du prog, tu crée un DC et un bitmap en memoire compatbible avec l'écran:

// cx et cy : taille image

HDC hdc = GetDC(NULL);
HDC hMemDC = CreateCompatibleDC(hdc);
HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, cx, cy);
HBITMAP hOldBmp = (HBITMAP) SelectObject(hMemDC, hMemBmp);
ReleaseDC(NULL, hdc);

- tu init ce DC avec ton DIB en utilsant StretchDIDBits

- quand tu doit dessiner, utilise hMemDC avec BitBlt.

- enfin à la fin du prog tu libère les ressources :
SelectObject(hMemDC, hOldBmp);
DeleteObject(hMemBmp);
DeleteDC(hMemDC);

Cependant c'est pas sur que bitblt soit plus rapide (la fonction StretchDIBits doit être optimisée quand il n'y a pas de mise à l'échelle).
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
alors en gros, si je dois init mon DC avec StretchDIBits, ca reviend a n'utiliser que StretchDIBits... j'ai dit que j'affichais mon image plein de fois, mais je le fait pas par plaisir, si je le fait, c'est parceque mon image est modifier en temps-reel

donc si a chaques fois je dois faire tout les trucs bizar que tu fait =) + un StretchDIBits, autant ne faire que le StretchDIBits

sinon pour l'opti, je pense aussi, sur une fenetre en 400 x 400 x 32 je suis a 195 fps, et dans que je redimensionne, je chute a 130 fps, meme si je redimensionne en plus petit que l'original
Messages postés
1
Date d'inscription
mercredi 22 novembre 2000
Statut
Membre
Dernière intervention
10 août 2005

Salut à tout le monde , et un grand merci pour les gens de ce site ;


Je ss débutant en vc++6;
mon problème c est :
j 'ai chargé un fichier.bmp dans un tableau bitmap[taile_de_bitmap] à l aide de ce code:


FILE* ptr;
const int taille_de_bitmap= 405875;
char bitmap[taile_de_bitmap];


if ((ptr=fopen("c:\fichier.bmp","rb"))==NULL)
{
.......

}else{

int buf[2];
for(int i=0;!feof(ptr);i++) // boucler jusqu à la la fin du fichier.bmp
{
fseek(ptr,i,SEEK_SET);
fread(buf,sizeof(int),1,ptr);
bitmap[i]=buf[0]; //remplir bitmap[]


}

je chreche du code utilisant les API win32 (StretchDIBIts() , BitBlt() ) dans WM_PAINT afin d afficher bitmap[]; car j arrive pas à comprendr comment ça marche ces deux fonctions!!!

// et *********MERCI d avance ********