Pages vues depuis 25/07/2007 : 25 293 260
Index du forum »» Création-Développement »» Comment capturer un écran en C ?
/*?*********************************************************
**????????????????????????????????????????????????????????**
**???AmiDARK?Engine?Development?Project???????????????????**
**??------------------------------------??????????????????**
**????????????????????????????????????????????????????????**
**?File???:?AOSLibDTT.o???????????????????????????????????**
**?Author?:?Frederic?Cordier??????????????????????????????**
**?Date???:?2013.04.18????????????????????????????????????**
************************************************************
*/
//?2013.04.18?:?Restructuration?complète?du?SDK
//
//?***************************************************************************************************************
/*???????????????????????????????????????????????????????????????Ouverture?d'une?librairie?et?de?son?interface.?*/
int?deOpenDataTypes(?void?){
??int?Success?=?0;
??DataTypesBase?=?MyOpenLibrary(?"datatypes.library",?0?);
??if?(?DataTypesBase?!=?NULL?){
????#if?defined(?__amigaos4__?)
??????IDataTypes?=?(struct?DataTypesIFace?*)InterfacePtr;
??????if?(?IDataTypes?!=?NULL?){
????????Success?=?1;
???????}
?????#else
??????Success?=?1;
?????#endif
???}
??return?Success;
?}
//?***************************************************************************************************************
/*?????????????????????????????????????????????????????????????????Fermeture?d'une?interface?et?d'une?librairie?*/
void?deCloseDataTypes(?void?){
??#if?defined(?__amigaos4__??)
????MyCloseLibrary(?DataTypesBase,?IDataTypes?);
???#else
????MyCloseLibrary(?DataTypesBase,?NULL?);
???#endif
?}
//?***************************************************************************************************************
/*?????????????????????????????????????????????????????????????Demande?de?création?d'un?buffer?image?en?32?bits?*/
struct?MyPicture?*?AllocPicture32(?int?Width,?int?Height?){
??struct?MyPicture?*pt?=?NULL;
??pt?=?(struct?MyPicture?*)MyAllocVec(?sizeof(?struct?MyPicture?),?MEMF_ANY|MEMF_CLEAR?);
??if?(?pt?){
????pt->Pixels?=?MyAllocVec(?Width?*?(?Height?+?1?)?*?4,?MEMF_ANY|MEMF_CLEAR?);
????pt->Width?=?Width;
????pt->Height?=?Height;
????pt->Depth?=?32;
????if?(?pt->Pixels?==?NULL?){
??????MyFreeVec(?pt?);
??????pt?=?NULL;
?????}
???}
??return?pt;
?}
//?***************************************************************************************************************
/*?????????????????????????????????????Suppression?d'un?buffer?mémoire?précédemment?alloué?par?AllocPicture32()?*/
void?FreePicture(?struct?MyPicture?*pt?){
??if?(?pt?){
????MyFreeVec(?pt->Pixels?);
????pt->Pixels?=?NULL;
????MyFreeVec(?pt?);
???}
?}
//?***************************************************************************************************************
/*????????????????????????????????????????????????????????????Chargement?d'une?image?en?utilisant?les?DataTypes?*/
struct?MyPicture?*?LoadPicture(?APTR?FileName?){
??struct?MyPicture?*pt?=?NULL;
??Object?*dto?=?NULL;
??ULONG?nb;
??ULONG?*?AvailMethod?=?NULL;
??struct?BitMapHeader?*bmh;
??struct?pdtBlitPixelArray?bpa;
??void?*?bpaptr?=?&bpa;
??if?(?!FileName?)?return?NULL;
??#if?defined(?__amigaos4__?)
????dto?=?IDataTypes->NewDTObject(?(STRPTR)FileName,
???????????????????????????????????DTA_SourceType,????DTST_FILE,
???????????????????????????????????DTA_GroupID,???????GID_PICTURE,
???????????????????????????????????PDTA_DestMode,?????PMODE_V43,
???????????????????????????????????PDTA_Remap,????????TRUE,
???????????????????????????????????OBP_Precision,?????PRECISION_EXACT,
???????????????????????????????????TAG_DONE?);
???#else
????dto?=?NewDTObject(?(STRPTR)FileName,
???????????????????????DTA_SourceType,????DTST_FILE,
???????????????????????DTA_GroupID,???????GID_PICTURE,
???????????????????????PDTA_DestMode,?????PMODE_V43,
???????????????????????PDTA_Remap,????????TRUE,
???????????????????????OBP_Precision,?????PRECISION_EXACT,
???????????????????????TAG_DONE?);
???#endif
??if?(?dto?!=?0?){
????#if?defined(?__amigaos4__?)
??????nb?=?IIntuition->GetAttrs(?dto,?PDTA_BitMapHeader,?&bmh,?TAG_DONE?);
?????#else
??????nb?=?GetDTAttrs(?dto,?PDTA_BitMapHeader,?&bmh,?TAG_DONE?);
?????#endif
????if(?nb?!=?0?){
??????int?resread;
??????/*?Allocation?de?la?structure?Picture?et?du?buffer?mémoire?*/
??????pt?=?AllocPicture32(?bmh->bmh_Width,?bmh->bmh_Height?);
??????if?(?pt?!=?NULL?){
????????bpa.pbpa_PixelData?=?pt->Pixels;
????????bpa.pbpa_PixelFormat?=?PBPAFMT_RGBA;
????????bpa.pbpa_PixelArrayMod?=?bmh->bmh_Width?*?4;
????????bpa.pbpa_Left?=?0;
????????bpa.pbpa_Top?=?0;
????????bpa.pbpa_Width?=?bmh->bmh_Width;
????????bpa.pbpa_Height?=?bmh->bmh_Height;
????????#if?defined(?__amigaos4__?)
??????????AvailMethod?=?IDataTypes->GetDTMethods(?dto?);
??????????if?(?IDataTypes->FindMethod(?AvailMethod,?PDTM_READPIXELARRAY?)?!=?0?){
????????????bpa.MethodID?=?PDTM_READPIXELARRAY;
????????????resread?=?IIntuition->IDoMethodA(?dto,?bpaptr?);
???????????}
?????????#else
??????????AvailMethod?=?GetDTMethods(?dto?);
??????????if?(?FindMethod(?AvailMethod,?PDTM_READPIXELARRAY?)?!=?0?){
????????????bpa.MethodID?=?PDTM_READPIXELARRAY;
????????????resread?=?DoMethodA(?dto,?bpaptr?);
???????????}
?????????#endif
???????}
?????}
?????#if?defined(?__amigaos4__?)
???????IIntuition->DisposeObject(?dto?);
??????#else
???????DisposeObject(?dto?);
??????#endif
???}
??return?pt;
?}
void screenCapture()
{
struct Screen *screen = NULL;
UBYTE *buffer = NULL ;
LONG count_pixel = 0 ;
int largeur = 1920 ;
int hauteur = 1080 ;
int profondeur = 32 ;
buffer = AllocVecTags( (largeur * hauteur * profondeur)/8, AVT_ClearWithValue, 0,TAG_END);
screen = LockPubScreen("Workbench");
struct RastPort monrastport;
InitRastPort(&monrastport);
struct RastPort temprastport;
InitRastPort(&temprastport);
monrastport.BitMap=screen->RastPort.BitMap; /* celle du screen */
UnlockPubScreen(NULL, screen);
count_pixel = ReadPixelArray8(&monrastport,0,0,1920,1080,buffer,&temprastport) ;
printf("count_pixel = %ld \n",count_pixel);
char fileName[1024];
// strcpy(fileName,"RAM:Capture.JPG");
strcpy(fileName,"RAM:Capture.PNG");
ILuint imageName ;
ILenum Format;
ilInit();
ilGenImages(1, &imageName);
ilBindImage(imageName);
// if (profondeur == 8) {Format=IL_LUMINANCE;SaveRawBMP8(I,fileName);FreeVec(buffer);return;} as IL_LUMINANCE is bugged in devIL
if (profondeur == 24) Format=IL_RGB;
if (profondeur == 32) Format=IL_RGBA;
ilTexImage(largeur,hauteur,1,profondeur/8,Format,IL_UNSIGNED_BYTE,buffer);
ilEnable(IL_FILE_OVERWRITE);
if(!ilSaveImage(fileName))
{
printf("ilGetError %d !\n",ilGetError());
FreeVec(buffer);
return;
}
ilDeleteImages(1,&imageName);
FreeVec(buffer);
}