Bonjour,
Voila je modifie le programme Playcap fourni dans la SDK de DirectShow. Ce programme creer un graph afin de recuperer le flux video de la caméra et l'affiche a l'ecran.
Je l'ai modifier afin d'y incorporer la possibilité de faire une capture d'ecran au format BMP ou JPG en utilisant l'interface ISampleGrabber. L'enregistrement au format BMP fonctionne sans problème. Mon soucis est dans l'enregistrement au format jpeg. Voici le code que j'utilise :
Code C/C++ :
long nBufferSize = am_media_type.lSampleSize;
JSAMPLE *JBuffer = (JSAMPLE*)malloc(nBufferSize);
long *pBuffer = (long *)malloc(nBufferSize);
// grab image data.
pSampleGrabber->GetCurrentBuffer(&nBufferSize, (long *)pBuffer);
memcpy((void*)&JBuffer,(void*)&pBuffer, sizeof(pBuffer));
const char filename[] = "test.jpg";
int quality = 100;
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
/* More stuff */
FILE * outfile; /* target file */
JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */
int row_stride; /* physical row width in image buffer */
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
if ((outfile = fopen(filename, "wb")) == NULL) {
fprintf(stderr, "can't open %s\n", filename);
exit(1);
}
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = pVideoInfoHeader->bmiHeader.biWidth;
cinfo.image_height = pVideoInfoHeader->bmiHeader.biHeight;
cinfo.input_components = 3; /* # of color components per pixel */
cinfo.in_color_space = JCS_RGB; /* colorspace of input image */
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */);
jpeg_start_compress(&cinfo, TRUE);
row_stride = cinfo.image_width * 3; /* JSAMPLEs per row in image_buffer */
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = & JBuffer[cinfo.next_scanline * row_stride];
(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);
Je Jpg que je recupere est lisible mais il manque la composante rouge...
Je pense que cela vient du faite que le buffer que GetCurrentBuffer me donne est de type LONG alors que le format JSAMPLE du buffer requis par la libjpeg est au format unsigned char.
Je ne sais pas comment convertir ce buffer de long vers unsigned char....
Si quelqu'un voit comment rendre mon code fonctionnel je lui en serai tres reconnaissant

.
Merci d'avance.