Annonces Google
Serveur IRC
Serveur : irc.portlane.se
Canal : #AmigaNG
Activité du Site

Pages vues depuis 25/07/2007 : 24 893 875

  • Nb. de membres 186
  • Nb. d'articles 1 269
  • Nb. de forums 19
  • Nb. de sujets 20
  • Nb. de critiques 24

Top 10  Statistiques

Index du forum »»  Création-Développement »» Comment capturer un écran en C ?

Comment capturer un écran en C ?#1821

5Contributeur(s)
zzd10hthellierElwoodAmiDARKK-L
3 Modérateur(s)
K-LElwoodcorto
zzd10h zzd10hicon_post
Bonjour les pros des fonctions graphiques sur OS4 (Alain, AmiDark...)

Est-ce que l'un d'entre vous sait comment capturer un écran dans un Bitmap ?

Avec CompositeTags, j'arrive à copier / remettre à l'échelle des Bitmaps mais est'il possible de mettre un écran en Source ?

Par avance, merci, c'est juste pour ajouter une option basique de capture dans FastView.
A+
thellier thelliericon_post
Hello

A priori oui en utilisant comme bitmap source
Screen->RastPort.BitMap

Mais j'ai eu des problème sur de grands écrans sur la Sam440 genre en 1800 (souvent je prend un écran de double largeur scrollable en suivant la souris) donc vérifie bien que CompositeTags s'est bien passé (cad pas d'erreur)
Il semblerait (au moins sur ma Sam) que la bitmap source ait une limite en taille (pas la bitmap dest) je me rappelle plus de la taille max (large 1800?) mais c'étais pas celle de Warp3D (2048)

Alain
Elwood Elwoodicon_post
Si tu demandes à l'auteur de Sgrab, je pense qu'il te donnera les sources : http://stephan-rupprecht.de/
--
Philippe Ferrucci
Avec une Sam460 et AmigaOS 4.1, je suis eco-responsable. Cool !
zzd10h zzd10hicon_post
Alain :
Super, je vais essayer...

Elwood :
Et au pire je contacterais l'auteur de Sgrab,



Merci à tous les 2.

edit : mais j'y pense, ensuite comment faire pour passer le bitmap en fichier autre que ILBM ?
J'ai relancè un vieux sujet à propos de la sauvegarde par Datatype sur Amigans

http://www.amigans.net/modules/xforum/viewtopic.php?post_id=87988#forumpost87988


Message édité par : zzd10h / 06-03-2014 18:19
thellier thelliericon_post
>comment faire pour sauver le bitmap en fichier autre que ILBM ?

Prends libjpeg ou DevIL:
Tu créé un buffer ram de la taille bitmap (cad taille=large*haut*3)
tu copie ta bitmap dans le buffer avec readpixel array
tu sauve le buffer en tant qu'image jpg


Voici 2 bouts de code pour DevIL et LibJPG

/*==========================================================================*/
void SaveDEVIL(struct image3D *I,UBYTE *filename)
{
/* Save Texture to any kind of Image file with DevIL.dll */

ILuint ImageName;
ILenum Format;
ILAPI ILvoid ILAPIENTRY ilRegisterPal(ILvoid *Pal, ILuint Size, ILenum Type);


if(!DevilLibraryON) InitDEVIL();
if(!DevilLibraryON) return;

if(I ==NULL) return;
if(I->pt==NULL) return;
if(DevilDebugON) printf("SaveTextureDEVIL %dX%d %d bits to <%s>\n",I->large,I->high,I->bits,filename);
if (ilGetInteger(IL_VERSION_NUM) < IL_VERSION )
{
if(DevilDebugON) printf("Your IL version < %d !\n",IL_VERSION);
return;
}

ilGenImages(1, &ImageName);
ilBindImage(ImageName);

/* IL_COLOR_INDEX IL_LUMINANCE IL_LUMINANCE_ALPHA */

if(I->bits==8) {Format=IL_LUMINANCE;SaveRawBMP8(I,filename);return;} /* as IL_LUMINANCE is bugged in devIL */
if(I->bits==24) Format=IL_RGB;
if(I->bits==32) Format=IL_RGBA;
ilTexImage(I->large,I->high,1,I->bits/8,Format,IL_UNSIGNED_BYTE,I->pt);

ilEnable(IL_FILE_OVERWRITE);
if(!ilSaveImage(filename))
{
if(DevilDebugON) printf("ilGetError %d !\n",ilGetError());
return;
}
ilDeleteImages(1,&ImageName);

return;
}

/*==========================================================================*/
unsigned int SaveJPG(struct image3D *I,char * filename,int quality)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
JSAMPROW imagescanline[1]; /* pointer to JSAMPLE row[s] */
int bytesperline; /* physical row width in image buffer */
int n;
FILE * fp;

if(JpegDebugON) printf("JPEG File <%s> \n", filename);
if ((fp = fopen(filename, "wb")) == 0)
{
if(JpegDebugON) printf("can't open %s\n", filename);
return(FALSE);
}

cinfo.err = jpeg_std_error(&jerr);

if(JpegDebugON) printf("Writing JPEG %d X %d X %d Bits from Memory(%ld)\n",I->large,I->high,I->bits,I->pt);
if (I->pt==NULL)
{if(JpegDebugON) printf("Given Image pt==NULL !\n");return(FALSE);}

jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, fp);

cinfo.image_width = I->large; /* image width and height, in pixels */
cinfo.image_height = I->high;
cinfo.input_components = I->bits/8; /* # of color components per pixel */
if (I->bits==24)
cinfo.in_color_space = JCS_RGB; /* colorspace of input image */
else
cinfo.in_color_space = JCS_GRAYSCALE; /* colorspace of input image */


jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */);
jpeg_start_compress(&cinfo, TRUE);

bytesperline = I->large*(I->bits/8);

NLOOP(I->high)
{
imagescanline[0] = & (I->pt[n*bytesperline]);
(void) jpeg_write_scanlines(&cinfo, imagescanline, 1);
}

jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
fclose(fp);
return(TRUE);
}

zzd10h zzd10hicon_post
Merci Alain mais je ne comprends pas comment passer un Bitmap en mémoire à une de tes fonctions Devil ou Jpg ?

J'ai une image chargée par Datatype,
je transfére ses données dans un Bitmap par PDTM_READPIXELARRAY (via RenderInfo.Memory)

et ensuite ?

Désolé, je n'y connais pas grand chose... :-?

Merci

Elwood :
Penses-tu que les Datatypes Savers seront publiquement disponibles dans pas trop longtemps ?
Merci


Message édité par : zzd10h / 07-03-2014 19:10
Elwood Elwoodicon_post
Citation : zzd10h?

Penses-tu que les Datatypes Savers seront publiquement disponibles dans pas trop longtemps ?

j'ai pas d'info
--
Philippe Ferrucci
Avec une Sam460 et AmigaOS 4.1, je suis eco-responsable. Cool !
zzd10h zzd10hicon_post
Dommage...mais merci pour la réponse.

Et si au détour d'une de vos discussions entre beta-testeurs, le sujet venait là dessus, merci de penser aux "pauvres" qui attendent aprés ces bugs déjà fixés. ;-)
thellier thelliericon_post
Mes 2 fonctions utilisent ma structure image3d
qui contient high large bits et aussi pt le pointeur
sur buffer ou est l image
donc copie juste ta bitmap avec readpixelarray dans un buffer de ram
et met pt=buffer

Ce buffer de ram est juste un pt=buffer=allocmem(largexhighxbits/8)

Par ailleurs je crois pas (a verifier) que tu ait besoin
de copier dans un bitmap quand tu charge
avec un datatype (car il la met deja dans une bitmap)


alain
zzd10h zzd10hicon_post

Encore une question de boulet...
Comment tu remplis un buffer avec PDTM_READPIXELARRAY ?

Désolé pour toutes ces questions, Alain !
Petites Annonces

0 annonce(s) publiée(s)

Consulter

AmigaOS 4.1

Laissez-vous tenter par
AmigaOS 4.1
AmiTheme

AmiTheme