2013-05-24 12 views
0

J'essaie de sauvegarder un bytearray rgb dans un fichier jpg.enregistrer rgb char * dans l'image jpeg en utilisant libjpeg

J'ai suivi les instructions de ce page et voici mon code

//rgb is the image 
//rgb->imageData is char* to the rgb data 
//rgb->imageSize is the image size which is 640*480*3 

struct jpeg_compress_struct cinfo; 
    struct jpeg_error_mgr jerr; 

    /* this is a pointer to one row of image data */ 
    FILE *outfile = fopen("file.jpeg", "wb"); 

    cinfo.err = jpeg_std_error(&jerr); 
    jpeg_create_compress(&cinfo); 
    jpeg_stdio_dest(&cinfo, outfile); 

    /* Setting the parameters of the output file here */ 
    cinfo.image_width = 640;//width; 
    cinfo.image_height = 480;//height; 
    cinfo.input_components = 3; 
    cinfo.in_color_space = JCS_RGB; 

    jpeg_set_defaults(&cinfo); 
    /* Now do the compression .. */ 
    jpeg_start_compress(&cinfo, TRUE); 

    JSAMPROW buffer; 
    for(int i=0;i<rgb->imageSize;i+=640) 
    { 
     memcpy(buffer, 
      (JSAMPROW)rgb->imageData+i, 
      640);//segmentation fault here 
     jpeg_write_scanlines(&cinfo, &buffer, 1); 
    } 
    jpeg_finish_compress(&cinfo); 
    jpeg_destroy_compress(&cinfo); 
    fclose(outfile); 

Je reçois une erreur de segmentation, et en essayant tampon = RVB-> données d'image j'ai eu une erreur de libjpeg qui scanlines trop et rien est écrit dans le fichier, quel est le problème avec mon code ??

Je peux trouver un tas d'exemples libjpeg en ligne mais je ne trouve pas d'exemple de mémoire en mémoire (char * à char *).

J'ai une question secondaire: J'ai un YUV très optimisé rgb fonction, est-il bon de convertir l'image YUV (plus compressé) en RVB (non compressé), puis convertir RVB en jpeg ?? ou seulement utiliser YUV pour Jpeg dans libjpeg ??

Répondre

0

Comment le type JSAMPROW est-il déclaré? Essayez ceci:

memcpy(&buffer, (JSAMPROW)rgb->imageData+i, 640); 
0

essayer ce lieu de boucle:



    while (cinfo.next_scanline < cinfo.image_height) { 
     JSAMPLE *row = rgb->imageData + 3 * cinfo.image_width * cinfo.next_scanline; 
     jpeg_write_scanlines(&cinfo, &row, 1); 
    } 

Questions connexes