Afficher une image jpeg avec la fonction StretchDIBits ?

cs_mitch19 Messages postés 10 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 31 mars 2007 - 5 mars 2006 à 21:54
cs_mitch19 Messages postés 10 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 31 mars 2007 - 8 mars 2006 à 21:14
bonjour, j'essaye depuis quelques temps d'afficher une image jpeg avec
la commande StretchDIBits, en vain ! mon programme plante lamentablement !
Si quelqu'un peut m'aider !
merci
mon code :

fichier db "photo1.jpg",0
bv4H BITMAPV4HEADER <>


.data ?
hPhoto dd ?
pPhoto dd ?
pJpeg dd ?
Largeur dd ?
Hauteur dd
.elseif uMsg == WM_COMMAND
mov eax,wParam
.if eax == IDM_OPEN

invoke BitmapFromFile,offset fichier ;ouvre fichier
mov hPhoto, eax
INVOKE GetObject, hPhoto, SIZEOF bv4H, ADDR bv4H ; information image
;la déja eax=0 donc j'ai rien récupéré!
mov pPhoto,eax ;sauve sur pointer
mov eax,bv4H.bV4V4Compression
mov pJpeg,eax ;récupère la compression
mov eax,bv4H.bV4Width
mov Largeur,eax ;sauve largeur image
mov eax,bmih.bV4Height
mov Hauteur,eax ;sauve hauteur image

invoke InvalidateRect,hWnd,NULL,TRUE ;repeindre la fenetre

.endif


.elseif uMsg==WM_PAINT
invoke BeginPaint,hWnd,addr ps
mov hMemDC,eax
invoke SetStretchBltMode, hMemDC, COLORONCOLOR
invoke StretchDIBits, hMemDC, 0,0, cxClient, cyClient, 0,0,Largeur,Hauteur, \
pJpeg, pPhoto, DIB_RGB_COLORS, SRCCOPY
....

10 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 mars 2006 à 22:42
Je t'ai fait exemple en C ici, tu verras pour traduire en (pseudo) asm, pas le temps.
http://bnmvp.free.fr/ImagesOle.zip
Une dialogbox repaint sa surface avec, alternativement par timer, 3 images (jpg, gif et bmp).

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cs_mitch19 Messages postés 10 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 31 mars 2007
6 mars 2006 à 20:34
merci, je vais épelucher ton code !
et désolé pour le pseudo assembleur !
0
cs_mitch19 Messages postés 10 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 31 mars 2007
6 mars 2006 à 21:28
Le code qui marche en masm32 merci BruNews

fichier db "photo1.jpg",0
bmih BITMAP <>
.data ?
hPhoto dd ?
hPhotoCopy dd ?
Largeur dd ?
Hauteur dd ?
.elseif uMsg == WM_COMMAND
mov eax,wParam
.if eax == IDM_OPEN

invoke BitmapFromFile,offset fichier ;ouvre fichier
mov hPhoto, eax
invoke CopyImage,hPhoto,IMAGE_BITMAP,0,0,/
LR_COPYRETURNORG
mov hPhotoCopy,eax


INVOKE GetObject, hPhotoCopy, SIZEOF bmih, ADDR bmih ; information image
mov eax,bmih.Width
mov Largeur,eax ;sauve largeur image
mov eax,bmih.Height
mov Hauteur,eax ;sauve hauteur image

invoke InvalidateRect,hWnd,NULL,TRUE ;repeindre la fenetre

.endif


.elseif uMsg==WM_PAINT
invoke BeginPaint,hWnd,addr ps
mov hdc,eax
invoke CreateCompatibleDC,hdc
mov hMemDC,eax
invoke SelectObject,hMemDC,hBitmap
mov hOld, eax
invoke GetClientRect,hWnd,addr rect
invoke StretchBlt, hdc, 0, 0,cxClient, cyClient, hMemDC, 0, 0, cxDib,/
cyDib, SRCCOPY
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 mars 2006 à 21:47
On peut parier au moins à 100 contre 1 que le compilo de VS aura produit un code nettement meilleur.
Regarde tous les accès mémoire que tu forces inutilement:
...
mov hdc,eax
invoke CreateCompatibleDC,hdc
mov hMemDC,eax
...
à chaque ligne tu vas relire en mémoire ce que tu as déjà en registre, dur dur...
Je te garantis qu'un bon compilo C moderne sait utiliser tous les registres pour ne jamais avoir à faire cela.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 mars 2006 à 11:22
salut,

sans parler de pari et pour ne pas avoir de compilo c moderne à la maison ( ça coûte combien ? ), j'aimerais voir le code obtenu.

Je ne sais pas avec quoi sont programmés les logiciels d'aujourd'hui mais je n'ai jamais rien vu d'optimisé sortant d'un compilo C.

Pas meme le ntkrnlmp:

push ebx
push esi
push dword ptr [ebp+0Ch]
push dword ptr [ebp-4]
push dword ptr [ebp+8]
call fn_0043D298
mov edi,eax <- c quoi ça, c'est de l'utilisation de tout les registres ?
cmp edi,ebx
jge loc_005434A9


@++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 mars 2006 à 11:45
Bon exemple, son hMemDC placé dans EDI aurait été très bien...

Décompile l'exe du lien et regarde, j'ai vraiment mieux à faire.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 mars 2006 à 15:42
bon exemple, ca aurait été optimisé si:
push ebx
push esi
push dword ptr [ebp+0Ch]
push dword ptr [ebp-4]
push dword ptr [ebp+8]
call fn_0043D298
mov edi,eax
cmp eax,ebx
jge loc_005434A9

@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
7 mars 2006 à 15:51
puis faudrait voir a lire ce qui est noté plutot que de nous faire une pirouette:
"et pour ne pas avoir de compilo c moderne à la maison"

@++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 mars 2006 à 20:32
VC++ 2005 Express gratuit sur le site de MS.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cs_mitch19 Messages postés 10 Date d'inscription dimanche 19 octobre 2003 Statut Membre Dernière intervention 31 mars 2007
8 mars 2006 à 21:14
Ne vous battez pas !
comment pourrais je renseigner les 11 et 12èmes
paramètres (CONST VOID *lpBits, et CONST BITMAPINFO
*lpBitsInfo) la fonction StretchDIBBits pour une image JPEG
(en vue de récupérer les paramètres pour impression futur)
int StretchDIBits(
HDC hdc, // handle to device context
int XDest, // x-coordinate of upper-left corner of dest. rectangle
int YDest, // y-coordinate of upper-left corner of dest. rectangle
int nDestWidth, // width of destination rectangle
int nDestHeight, // height of destination rectangle
int XSrc, // x-coordinate of upper-left corner of source rectangle
int YSrc, // y-coordinate of upper-left corner of source rectangle
int nSrcWidth, // width of source rectangle
int nSrcHeight, // height of source rectangle
CONST VOID *lpBits, // address of bitmap bits
CONST BITMAPINFO *lpBitsInfo, // address of bitmap data
UINT iUsage, // usage flags
DWORD dwRop // raster operation code
);
A partir du code ci dessous est-ce possible ?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
bmih BITMAPV4HEADER <>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

invoke BitmapFromFile,offset fichier
mov hBitmap, eax
invoke CopyImage,hBitmap, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG
mov hBmp,eax
INVOKE GetObject, hBmp, SIZEOF bmih, ADDR bmih ; recupere les information de l'image
mov eax,bmih.bV4Width
mov cxDib,eax
mov eax,bmih.bV4Height
mov cyDib,eax
0
Rejoignez-nous