Denis a écrit :Spock a écrit :le specialiste de GDI ici c'est Denis
en esperant qu'il verra ton message

GDI est la librairie Microsoft pour la 2D.
GDI+ est une autre librairie de Microsoft qui pallie les manques de GDI et qui permet une gestion très intéressante de formats d'image en particulier.
Les spécialistes ici c'est Microsoft
@celtic88 :
Essaye au moins de compiler avec le debugger car il y a des erreurs.
Ton code fonctionne en 32/64 bits mais tu dois rectifier ceci:
Tu mélanges les mémoires allouées par PB et celles obtenues par les API
Code : Tout sélectionner
*Binimage=AllocateMemory(sizeimage)
*Binimage=GlobalLock_(*hMemory)
ca ne va pas, tu utilises le même pointeur, le pointeur PB est perdu et ca plante ici
Tu utilises l'API GlobalLock_(), tu dois donc lorsque les opérations sont terminées, utiliser l'API GlobalUnlock_() avant de libérer la mémoire avec les API microsoft et par FreeMemory() de PB.
Si tu veux un code stable, tu dois
toujours, toujours, toujours, toujours, toujours, toujours, toujours, toujours,
tester le retour des fonctions PB et des API sinon tu risques de faire planter, c'est obligatoire si tu manipules les fonctions 2D de PB, des mémoires, stream, objet GDI+ etc.
oh merci bcp, oui c'est vrais pourquoi j ai ajouté "AllocateMemory(sizeimage)" bizarre
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.b,c.d,e.f,g.h,k,*l,*m)
Prototype GdipSaveImageToFile(a,b.c,*d,*e)
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)
DESKTOP_dir.s=Space(#MAX_PATH)
SHGetSpecialFolderPath_(#Null,@DESKTOP_dir,#CSIDL_DESKTOP,#False)
DESKTOP_dir+"\hhh.jpg"
Debug Desktop_dir
imgpath=OpenFile(#PB_Any,Desktop_dir)
WriteData(imgpath,*Binimage,sizeimage)
CloseFile(imgpath)
GlobalUnlock_(*Binimage)
GlobalFree_(*hMemory)
GdiplusShutdown_(*token)
CloseLibrary(lib_gdiplus)
;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