Pas d'inquiétude, avec PBAdonf, c'est dans la poche ! ^^

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 03-12-2012 16:33:40

Shed  
Membre Geek
Date d'inscription: 06-01-2011
Messages: 62
Pépites: 260
Banque: 0

[RESOLU] Crop d'une image

Bonjours les gens. Si quelqu'un s'y connait en fonctions GDI (gdi32.dll), peut-être pourrait-il m'aider avec le code suivant?

Je vous épargne le traitement d'erreur. J'ai mappé les api windows dans des fonction of_... mais les noms restent les mêmes. La fonction prend en entrée le handle d'un bitmap (retourné par l'api loadimage), les coordonnées d'un point d'origine, et la taille désirée pour faire un crop de l'image. Le handle est passé en référence pour récupérer le handle de la nouvelle image.

Code: pb

long ll_res, ll_height, ll_dummy
ulong lul_hWndscreen, lul_hdc, lul_lasterror, lul_dcmem, DIB_RGB_COLORS, lul_lpvBits[], lul_uStartScan, lul_height, lul_hdcnew, lul_hdcold, lul_dcmemnew, lul_dcmemold, lul_res
ulong lul_cScanLines, lul_holdbitmap1, lul_holdbitmap2, lul_hnewbitmap, lul_dcmembitmap
boolean lb_res
string ls_dummy
bitmapinfo lstr_Info
bitmap lst_bitmap
u_nv_gdi32 lu_nv_gdi32
u_nv_kernel32 lu_nv_kernel32
u_nv_user32 lu_nv_user32

lu_nv_gdi32 = create u_nv_gdi32
lu_nv_kernel32 = create u_nv_kernel32
lu_nv_user32 = create u_nv_user32

ll_res = lu_nv_gdi32.of_getobject(aul_bitmaphandle, lst_bitmap)

lul_hWndscreen = 0 
lul_hdc =  lu_nv_user32.of_getdc(lul_hWndscreen)

lul_dcmemnew = lu_nv_gdi32.of_createcompatibledc(lul_hdc)
lul_hnewbitmap = lu_nv_gdi32.of_createcompatiblebitmap(lul_hdc,al_newwidth,al_newheight)
lul_holdbitmap1 = lu_nv_gdi32.of_selectobject(lul_dcmemnew, lul_hnewbitmap)

lul_hWndscreen = handle(w_main)
lul_hdcold =  lu_nv_user32.of_getdc(lul_hWndscreen)
lul_dcmemold = lu_nv_gdi32.of_createcompatibledc(lul_hdcold)
lul_holdbitmap2 = lu_nv_gdi32.of_selectobject(lul_dcmemold, aul_bitmaphandle)

lb_res = lu_nv_gdi32.of_bitblt(lul_dcmemnew, 0, 0, al_newwidth, al_newheight, lul_dcmemold, al_newxorigin, al_newyorigin, 13369376)

lul_res = lu_nv_gdi32.of_selectobject(lul_dcmemnew, lul_holdbitmap1)
aul_bitmaphandle = lul_res // ici, ça ne va pas

lul_res = lu_nv_gdi32.of_selectobject(lul_dcmemold, lul_holdbitmap2)
lb_res = lu_nv_gdi32.of_deletedc(lul_dcmemnew)
lb_res = lu_nv_gdi32.of_deletedc(lul_dcmemold)
ll_res = lu_nv_user32.of_releasedc(lul_hWndscreen, lul_hdc)
ll_res = lu_nv_user32.of_releasedc(lul_hWndscreen, lul_hdcold)

fin_traitement:

if isvalid(lu_nv_gdi32) then destroy lu_nv_gdi32
if isvalid(lu_nv_kernel32) then destroy lu_nv_kernel32
if isvalid(lu_nv_user32) then destroy lu_nv_user32

return ll_res


Tout a l'air de bien fonctionner, sauf que quand je veux récupérer le handle de l'image copiée, bah ça me rend rien du tout... ou alors c'est des pixels transparents ...
Si je mets aul_bitmaphandle = lul_res après of_selectobject(lul_dcmemold, lul_holdbitmap2), là, je récupère bien l'image d'origine.
L'image est bien copiée et cropée par le bitblt car si mon device context de destination n'est pas un memory device context, mais par exemple un graphic device context comme celui de la fenetre, l'image s'affiche correctement, correctement cropée, au bon endroit.

Dernière modification par Shed (04-12-2012 09:12:30)

Hors ligne

 

#2 04-12-2012 09:12:10

Shed  
Membre Geek
Date d'inscription: 06-01-2011
Messages: 62
Pépites: 260
Banque: 0

Re: [RESOLU] Crop d'une image

Bon beh finalement j'ai résolu le problème tout seul.

Le problème venait simplement de l'image qui contenait de la transparence, et bitblt ne fonctionne pas avec la transparence. J'ai utilisé une image plus basique et c'est passé sans problème. (si vous voulez vraiment utiliser cette fonction avec une image comportant de la transparence, je pense qu'il faut utiliser alphablend).

hop, résolu!

Hors ligne

 

#3 04-12-2012 09:23:13

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [RESOLU] Crop d'une image

merci pour l'info, ça servira sans doute à qqun d'autre


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22