bonjour,
je suis actuellement sur un projet de compression et diffusion video,
j'aimerai trouver un code source du codec bitmaptojpeg.
je suis en language C, sur un noyau 2.6.24. j'utilise kate comme editeur.
merci.
Version imprimable
bonjour,
je suis actuellement sur un projet de compression et diffusion video,
j'aimerai trouver un code source du codec bitmaptojpeg.
je suis en language C, sur un noyau 2.6.24. j'utilise kate comme editeur.
merci.
Bonjour,
AS-tu fais des recherches par toi-même sur le net ? Si oui, qu'as-tu trouvé ? Qu'est-ce qui te pose problème exactement ?
Vous pouvez jeter un oeil sur les sources de la librairie LibJpeg ;) (version 6b ici)
Vous pourrez par ailleurs l'utiliser pour encoder/décoder des images JPG.
alors oui j'ai fait des recherche, et je me perd très facilement...je ne trouve pas du tout ce qu'il me faut.
alors, j'utilise la libjpeg, et voila ce que j'ai deja fait :
///executable utilisant les fonction jpeg de la lib, detaille de convjpeg plus bas.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Libvideo.h"
#include "Libvideonext.h"
#include <signal.h>
#include <X11/Xlib.h>
#include "Libvideo.c"
#include <X11/extensions/xf86dga.h>
#include <X11/Xutil.h>
//#include"RGBtoBMP.c"
#include <time.h>
#include "jpeg.h"
#include"jpeg.c"
void acquisition();
VideoDev video;
int main (int argc,char*argv[])
{
int i;
T_VideoDim vid_dim;
T_XParam paramsX;
vid_dim.x=vid_dim.y=0;
vid_dim.width=384;
vid_dim.height=288;
paramsX.dpyname=(char *)malloc(strlen(":0.0")*sizeof(char));
sprintf(paramsX.dpyname,":0.0");
if(InitialisationVideo(0,SHM_MODE,vid_dim,paramsX,&video)==VIDEO_KO)
{
printf("erreur d'initialisation\n");
return VIDEO_KO;
}
acquisition();
return VIDEO_OK;
}
void acquisition()
{
FILE* file;
int width,height,depth,lenght;
char fic[15];
unsigned char * buffer;
buffer=GrabVideo(&video,&width,&height,&depth);
if(buffer!=NULL)
{
convjpeg(buffer,288,384,1,"imageout.jpeg");
}
else
printf("erreur grabbing\n");
CloseVideo(&video);
exit(0);
}
#include <stdio.h>
#include "jpeglib.h"
#include <setjmp.h>
void convjpeg(char * image_buffer,int image_height,int image_width,int quality,char*filename)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE * outfile; /* target file */
JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */
int row_stride;
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 = image_width; /* image width and height, in pixels */
cinfo.image_height = image_height;
cinfo.input_components = 3; /* # of color components per pixel */
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */);
jpeg_start_compress(&cinfo, TRUE);
row_stride = image_width * 3;
while (cinfo.next_scanline < cinfo.image_height) {
/* jpeg_write_scanlines expects an array of pointers to scanlines.
* Here the array is only one element long, but you could pass
* more than one scanline at a time if that's more convenient.
*/
row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];
(void) jpeg_write_scanlines(&cinfo, row_pointer,1);
jpeg_finish_compress(&cinfo);
fclose(outfile);
jpeg_destroy_compress(&cinfo);
}
}
a la compilation je n'ai aucune erreur, je passe en parametre un buffer contenant les bit en RGB obtenut avec un grabing, je le renvoie dans la fonction convjpeg, mais un message d'erreur aparait quand j'execute le prog.
"Application transfered too few scanlines"
je ne sait pas a quoi cela correspond, parce ke avec ce buffer j'arrive a le convertir en image bitmap et l'enregistrer dans un fichier lisible correctement.
aidez moi plz.
Cette erreur se produit lorsque l'appel à jpeg_finish_compress est fait alors qu'il n'y a pas eu suffisamment de scanlines transmises via jpeg_write_scanlines : il faut transmettre le nombre de scanlines correspondant à la valeur de l'attribut image_height de la structure jpeg_compress_struct.
PS : j'ai juste survolé le code (merci d'utiliser la balise code et de bien indenter à l'avenir).
Tout d'abord merci de votre attention a mon égart.
j'ai cru comprendre que les scanlines était le nombre de ligne de l'image,( si je me trompe, reprenner moi ).
Donc d'après votre réponse, mon erreur est du au faite que dans jpeg_write_scanlines, le derniere parametre n'est pas "1", mais image_height.
Avec ce parametre, une erreur de segmentation apparait.
suis je sur la bonne route ????
Code:
1
2
3 (void) jpeg_write_scanlines(&cinfo, row_pointer,1); // faux (void) jpeg_write_scanlines(&cinfo, row_pointer,image_height); // est ce bon ???
MERCI !!!
en cherchant j'ai trouver !!!!!
c'était en faite la boucle qui était mal faite,
le while doit se refermer juste avant de faire finish compresse, et le parametre est bien "1".
j'obtien une bonne image ^^.
Par contre je ne sait pas la plage de qualité...elle varie de combien a combien ????
Merci encore de votre attention.
j'ai trouvé, 0-100 :).
merci encore.