[RESOLU] transférer une image sans SaveImage()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Mwoua
Messages : 44
Inscription : lun. 24/oct./2005 10:28

[RESOLU] transférer une image sans SaveImage()

Message par Mwoua »

Salut à tous !

Je cherche à transmettre une image via le net, mais sans passer par l'écriture sur disque dur 8) :

J'utilise BitBlt_ pour faire une capture d'écran. Je souhaite ensuite l'envoyer en utilisant SendNetworkData(), donc en donnant l'adresse mémoire où elle se trouve.

Pour l'instant, je suis obligé d'enregistrer l'image avec SaveImage(), et de la lire ensuite ! Je cherche donc un moyen de connaitre l'adresse mémoire de l'image juste après BitBlt_.

Vous avez des idées ?
Dernière modification par Mwoua le dim. 11/nov./2007 15:53, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ce petit bout de code te montre comment remplir une image a l'aide de BitBlt
ici, l'image est rempli avec l'image du bureau (GetDesktopWindow_())

Code : Tout sélectionner

hBitmap = CreateImage(#FullImage, Window_Width, Window_Height)
hdc = StartDrawing(ImageOutput())
SelectObject_(hdc, hBitmap)
BitBlt_(hdc, 0, 0, Window_Width, Window_Height, GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
StopDrawing()
DeleteDC_(hdc)
du coup tu as une adresse bien precise de l'image en ram
car (hdc) est le Device Context :)
Mwoua
Messages : 44
Inscription : lun. 24/oct./2005 10:28

Message par Mwoua »

c'est ce que je pensais au debut, mais si je rajoute :

Code : Tout sélectionner

Resultat = CatchImage(1, hdc)
ça plante. hdc n'est donc pas une adresse mémoire :?:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Regardes du côté de l'API GetDIBits, je ne sais pas si cela peut aller, je l'ai utilisé une fois il y déjà pas mal de temps

Le 5ème paramètre (pvBits ) est le buffer que tu définis pour stocker les données des pixels.
Mwoua
Messages : 44
Inscription : lun. 24/oct./2005 10:28

Message par Mwoua »

Merci Denis ! :D

C'étais effectivement de ce côté qu'il fallait chercher.

J'ai utilisé un morceau de code de Gillou (http://www.purebasic.fr/french/viewtopi ... f447c4fa13) :

Code : Tout sélectionner

; Ce code crée une capture partielle de l'écran, compresse la zone mémoire utilisée pour l'image, puis la décompresse et l'affiche

;****** Capture d'ecran sur une zone de 640x480
CreateImage(0,640,480) 
DC = StartDrawing(ImageOutput(0)) 
BitBlt_(DC,0,0,ImageWidth(0),ImageHeight(0),GetDC_(GetDesktopWindow_()),0,0,#SRCCOPY ) 
StopDrawing() 

;****** récupération de l'adresse de l'image (en fait d'une copie de l'image...)
ImageID0 = ImageID (0) 
Hdc0 = CreateCompatibleDC_ ( GetDC_ ( ImageID0 )) 
bmi.BITMAPINFO 
bm.BITMAP 
GetObject_ ( ImageID0 , SizeOf(BITMAP), @bm.BITMAP) 
bmi\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER) 
bmi\bmiheader\biWidth = bm\bmWidth 
bmi\bmiheader\biHeight = bm\bmHeight 
bmi\bmiheader\biPlanes = 1 
bmi\bmiheader\biBitCount = 32 
bmi\bmiheader\biCompression = #BI_RGB 
L=bm\bmWidth*bm\bmHeight*4
HList0 = AllocateMemory (L) ;<---- HList0 est l'@ de l'image, L sa "taille"
GetDIBits_ (hDC0, ImageID0 ,0,bm\bmHeight,HList0,bmi, #DIB_RGB_COLORS ) 

;****** on compresse l'image
HListComp = AllocateMemory (L+8) 
t = ElapsedMilliseconds()
TailleCompress = PackMemory(HList0, HListComp, L,0)
delatT=ElapsedMilliseconds()-t

;****** on décompresse
HListDeComp = AllocateMemory (L+8) 
Resultat = UnpackMemory(HListComp, HListDeComp)

;****** on crée une nouvelle image pour afficher le résultat
CreateImage(1,640,480)
ImageID1 = ImageID (1) 
HDC1= StartDrawing ( ImageOutput (1)) 
SetDIBits_ (HDC1, ImageID1 ,0, ImageHeight (1), HListDeComp, bmi, #DIB_RGB_COLORS ) ;<---- on "remplit" l'image
Resultat = DrawText(10, 5, "Compression en "+Str(DelatT)+" ms pour passer de "+Str(L)+" octets à "+Str(TailleCompress)+" octets",$FF)

StopDrawing ()

;****** on affiche l'image
OpenWindow (1,0,0,640,480, "FastImageOutput Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered  ) 
CreateGadgetList(WindowID(1)) 
ImageGadget(111,0,0,640,480,ImageID(1))

Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
Y'a plus qu'à insérer un transfert grâce à "SendNetworkData(Connexion, *BufferMemoire, Longueur)" entre compression et décompression pour envoyer l'image vers un client 8)

CQFD ! Encore merci et bravo à ceux (Gillou et Denis ici) qui se (dé)battent avec succès avec les API windows. Chapeau bas. :D
Répondre