Page 1 sur 2

Problem ! Convertir une image bitmap en flux binaire!!

Publié : lun. 14/sept./2015 20:35
par celtic88
Slt toute le monde c est encore moi :(

je suis entrain de programmer une application purement coder en Pb, cette apli consiste a envoyez un flux des images "capture d Ecran" par TCP pour cella il faux que je convertie l image en binaire après l envoyer.. voila mon code quel qu un d expérience peu me corriger et merci d avance :D

Code : Tout sélectionner

Structure GdiplusStartupInput 
  GdiPlusVersion.l 
  *DebugEventCallback.DEBUG_EVENT
  SuppressBackgroundThread.l 
  SuppressExternalCodecs.l 
EndStructure 
Structure EncoderParameter
  Guid.GUID
  NumberOfValues.l
  Type.l
  Value.l
EndStructure
Structure EncoderParameters
  Count.l
  Parameter.EncoderParameter[1]
EndStructure

Defined *token

GdiplusStartupInput.GdiplusStartupInput\GdiPlusVersion=1

Prototype GdiplusStartup(a,b,c)
Prototype GdipSaveImageToStream(a,b,c,d)
Prototype GdipDisposeImage(a)
Prototype GdiplusShutdown(a)
Prototype GdipCreateBitmapFromHBITMAP(a,b,c)
lib_gdiplus = OpenLibrary(#PB_Any, "GDIPlus.dll") 
Debug lib_gdiplus
GdiplusStartup_.GdiplusStartup=GetFunction(lib_gdiplus,"GdiplusStartup")
GdipSaveImageToStream_.GdipSaveImageToStream=GetFunction(lib_gdiplus,"GdipSaveImageToStream")
GdipDisposeImage_.GdipDisposeImage=GetFunction(lib_gdiplus,"GdipDisposeImage")
GdiplusShutdown_.GdiplusShutdown=GetFunction(lib_gdiplus,"GdiplusShutdown")
GdipCreateBitmapFromHBITMAP_.GdipCreateBitmapFromHBITMAP=GetFunction(lib_gdiplus,"GdipCreateBitmapFromHBITMAP")

Debug GdiplusStartup_(*token, @GdiplusStartupInput,#NUL)

Define *IStream
Debug CreateStreamOnHGlobal_(#NUL,#True,@*IStream)
Debug *IStream

With encoderparams.EncoderParameters
  \Count = 1
  \Parameter[0]\Type = 4
  \Parameter[0]\NumberOfValues = 1
  \parameter[0]\Value = 100
EndWith
CopyMemory(?clsid_EncoderQuality, encoderparams\parameter[0]\Guid, SizeOf(GUID))

Define *image

CreateImage(0, 640,640)
StartDrawing(ImageOutput(0))
Box(0,0,640,640,#White)
Circle(319,319,319,#Blue)
Circle(319,319,219,#Green)
Circle(319,319,119,#Yellow)
StopDrawing()
Debug  ImageID(0)
Debug GdipCreateBitmapFromHBITMAP_(ImageID(0), 0, @*image)
Debug *image
Debug GdipSaveImageToStream_(*image,*IStream,?clsid_jpeg, @encoderparams)
MessageRequester("","")

GdipDisposeImage_(*image)
Define *hMemory
GetHGlobalFromStream_(*IStream,@*hMemory)

sizeimage= GlobalSize_(*hMemory)

Debug sizeimage

*Binimage=AllocateMemory(sizeimage)
*Binimage=GlobalLock_(*hMemory)
tVARIANT.VARIANT
DispCallFunc_(*IStream,16,4,23,0,0,0,@tVARIANT)
GlobalFree_(*hMemory)

GdiplusShutdown_(*token)
CloseLibrary(lib_gdiplus)

DataSection
  clsid_jpeg: ; clsid for jpeg image format
  Data.l $557CF401
  Data.w $1A04
  Data.w $11D3
  Data.b $9A,$73,$00,$00,$F8,$1E,$F3,$2E
  
  clsid_EncoderQuality:
  Data.l $1D5BE4B5
  Data.w $FA4A
  Data.w $452D
  Data.b $9C,$DD,$5D,$B3,$51,$05,$E7,$EB
EndDataSection

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : lun. 14/sept./2015 20:58
par falsam
GDI Denis est effectivement mieux placé pour répondre.

Voyons voir si j'ai compris.
- Tu fais des captures d'écrans.
- Tu les envoies avec le protocole TCP.

Tu les envoies vers un serveur qui contient une application permettant de visualiser tes images ?

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : lun. 14/sept./2015 21:03
par falsam
J'avais remarqué. Rien que des truc avec des API.

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : lun. 14/sept./2015 21:22
par G-Rom
Pourquoi passer par GDI ? PureBasic fourni toutes les commandes pour envoyer des images bitmap sur le réseau.
Le problème , c'est que tu auras une capture sous forme de tableau 2D qui représente ton image , il faut la compresser à la volée , Purebasic peu aussi te fournir une solution , regarde la doc sur Packer , une fois compresser il faudra que tu utilises le bon protocole réseaux , si c'est une image ponctuelle , le protocole TCP/IP fera l'affaire , même sans la compréssion , si c'est du streaming que tu vises , il faudra que tu changes de protocole en UDP , faire des plus petits paquets & faire de la mise en cache, c'est déjà beaucoup plus complexe.

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : mar. 15/sept./2015 0:33
par celtic88
merci pour votre réponse :) ,, voilla apres 2 heur de r étude les fonction gdip j ai trouver la solution 8) ,,pour qui est intéressé voilla le code:

Code : Tout sélectionner

Prototype GdiplusStartup(*a,b,c)
Prototype GdipSaveImageToStream(*a,*b,c,d)
Prototype GdipDisposeImage(*a)
Prototype GdiplusShutdown(*a)
Prototype GdipCreateBitmapFromHBITMAP(a, b, *c)
Prototype GdipGetImageWidth(a,*b)
Prototype GdipGetImageHeight(a,*b)
Prototype GdipCloneBitmapArea(a.f,b.f,c.f,d.f,e,*f,*g)
Prototype GdipSaveImageToFile(a,b.s,*c,*d)

lib_gdiplus = OpenLibrary(#PB_Any, "GDIPlus.dll") 
GdiplusStartup_.GdiplusStartup=GetFunction(lib_gdiplus,"GdiplusStartup")
GdipSaveImageToStream_.GdipSaveImageToStream=GetFunction(lib_gdiplus,"GdipSaveImageToStream")
GdipDisposeImage_.GdipDisposeImage=GetFunction(lib_gdiplus,"GdipDisposeImage")
GdiplusShutdown_.GdiplusShutdown=GetFunction(lib_gdiplus,"GdiplusShutdown")
GdipCreateBitmapFromHBITMAP_.GdipCreateBitmapFromHBITMAP=GetFunction(lib_gdiplus,"GdipCreateBitmapFromHBITMAP")
GdipGetImageWidth_.GdipGetImageWidth=GetFunction(lib_gdiplus,"GdipGetImageWidth")
GdipGetImageHeight_.GdipGetImageHeight=GetFunction(lib_gdiplus,"GdipGetImageHeight")
GdipCloneBitmapArea_.GdipCloneBitmapArea=GetFunction(lib_gdiplus,"GdipCloneBitmapArea")
GdipSaveImageToFile_.GdipSaveImageToFile=GetFunction(lib_gdiplus,"GdipSaveImageToFile")

Structure GdiplusStartupInput 
  GdiPlusVersion.l 
  *DebugEventCallback.DEBUG_EVENT
  SuppressBackgroundThread.l 
  SuppressExternalCodecs.l 
EndStructure 
Structure EncoderParameter
  Guid.GUID
  NumberOfValues.l
  Type.l
  Value.l
EndStructure
Structure EncoderParameters
  Count.l
  Parameter.EncoderParameter[28]
EndStructure

CreateImage(0, 640,640)
StartDrawing(ImageOutput(0))
Box(0,0,640,640,#White)
Circle(319,319,319,#Blue)
Circle(319,319,219,#Green)
Circle(319,319,119,#Yellow)
StopDrawing()

GdiplusStartupInput.GdiplusStartupInput\GdiPlusVersion=1

Define *token
GdiplusStartup_(@*token, @GdiplusStartupInput,#NUL)

Define image
GdipCreateBitmapFromHBITMAP_(ImageID(0), 0, @*image)
FreeImage(0)

Define xw,xy
GdipGetImageWidth_(*image,@xw)
GdipGetImageHeight_(*image,@xy)

Debug Str(xw) +" X "+ Str(xy)

With encoderparams.EncoderParameters
  \Count = 1
  \Parameter[0]\Type = 4
  \Parameter[0]\NumberOfValues = 1
  \parameter[0]\Value = @"100"
EndWith
CopyMemory(?clsid_EncoderQuality, encoderparams\parameter[0]\Guid, SizeOf(GUID))

;GdipSaveImageToFile_(*image,"C:\Users\larbi\Desktop\hhh.jpg",?clsid_jpeg, @encoderparams)

Define *IStream
CreateStreamOnHGlobal_(#NUL,#True,@*IStream)

GdipSaveImageToStream_(*image,*IStream,?clsid_jpeg, @encoderparams)

GdipDisposeImage_(*image)

Define *hMemory
GetHGlobalFromStream_(*IStream,@*hMemory)

sizeimage= GlobalSize_(*hMemory)

Debug sizeimage

*Binimage=AllocateMemory(sizeimage)
*Binimage=GlobalLock_(*hMemory)

tVARIANT.VARIANT
DispCallFunc_(*IStream,16,4,23,0,0,0,@tVARIANT)
GlobalFree_(*hMemory)
GdiplusShutdown_(*token)
CloseLibrary(lib_gdiplus)

imgpath=OpenFile(#PB_Any,"C:\Users\larbi\Desktop\hhh.jpg")
WriteData(imgpath,*Binimage,sizeimage)
CloseFile(imgpath)

FreeMemory(*Binimage)

DataSection
  clsid_jpeg: ; clsid for jpeg image format
  Data.l $557CF401
  Data.w $1A04
  Data.w $11D3
  Data.b $9A,$73,$00,$00,$F8,$1E,$F3,$2E
  
  clsid_EncoderQuality:
  Data.l $1D5BE4B5
  Data.w $FA4A
  Data.w $452D
  Data.b $9C,$DD,$5D,$B3,$51,$05,$E7,$EB
EndDataSection

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:24
par celtic88
falsam a écrit :GDI Denis est effectivement mieux placé pour répondre.

Voyons voir si j'ai compris.
- Tu fais des captures d'écrans.
- Tu les envoies avec le protocole TCP.

Tu les envoies vers un serveur qui contient une application permettant de visualiser tes images ?

ouii exactement ca :) une application genre teamviewer

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:25
par celtic88
Spock a écrit :celtic88 est partisant du tres compliqué :lol: :)
looll je suis tree nop :(

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:27
par falsam
celtic88 a écrit :ouii exactement ca une application genre teamviewer
C'est bien ce que je pensais :wink:

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:28
par celtic88
falsam a écrit :J'avais remarqué. Rien que des truc avec des API.
en fait tout les application utilise les api même pb avec cest command :)

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:28
par celtic88
falsam a écrit :
celtic88 a écrit :ouii exactement ca une application genre teamviewer
C'est bien ce que je pensais :wink:
aloor t es propo son quoi :P

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:33
par falsam
celtic88 a écrit :en fait tout les application utilise les api même pb avec cest command
Alors pourquoi tu n'utilises pas un peu plus les fonctions de PureBasic ?
celtic88 a écrit :aloor t es propo son quoi
Pour le moment je n'ai rien à te proposer. Je voulais être certain de ta demande.

Ma technique serait d'envoyer les images directement à un script PHP. Par contre il va falloir sacrément compresser les images pour rester fluide.

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:35
par celtic88
Spock a écrit :je crois qu'il translate des codes venant du C .. ceci explique peut etre cela :)

@Celtic

faire du pure basic c'est comme apprendre une langue ....
il ne faut pas chercher a traduire mot a mot , il faut se lancer a fond dans la langue
(et c'est quelqu'un qui ne parle aucune langue étrangère qui te le dis :lol: )

meme si tu as des codes en C , souvent c'est mieux de refaire a partir de zero en Purebasic ...
je sui un peu le genre fainéant lolll et cest sa existe des sources bien definer dans d autr langage pour koi pas les traduire en pb, et en gagne de temps!

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:45
par celtic88
@falsam je voix que tu est ancien dans ce forum et dans la programmation en général ,c est t utilise les fonction qui son dans pb tu va vit tomber dans c est limite exemple regarde la différence entre messageboxEx_ et MessageRequester! je veut dir la base de tt programmation et "langage c est les fonctions api :)

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:47
par celtic88
son oublier de dir merci a le Grand FRED

Re: Problem ! Convertir une image bitmap en flux binaire!!

Publié : jeu. 17/sept./2015 0:52
par falsam
celtic88 a écrit :je sui un peu le genre fainéant lolll et cest sa existe des sources bien definer dans d autr langage pour koi pas les traduire en pb, et en gagne de temps!
Si tu veux fainéant, au lieu de coder

Code : Tout sélectionner

GdipSaveImageToFile_(*image,"exemple.jpg",?clsid_jpg, @encoderparams)
tu pourrais écrire

Code : Tout sélectionner

UseJPEGImageEncoder()
SaveImage(Image, "exemple.jpg", #PB_ImagePlugin_JPEG)
Tu gagneras du temps, et c'est plus simple.
celtic88 a écrit :c est t utilise les fonction qui son dans pb tu va vit tomber dans c est limite exemple regarde la différence entre messageboxEx_ et MessageRequester! je veut dir la base de tt programmation et "langage c est les fonctions api
Si j'ai choisi PureBasic, c'est pour sa simplicité d'utilisation et le temps gagner à coder. J'ai pu me passer des API durant des années et ça me va bien.