把从framebuffer抓出来的数据转换成jpg图像

把从framebuffer抓出来的数据转换成为jpg图象
2008-07-10 14:15
//gcc -o grab grab.c -ljpeg

//The source code of grab.c
//cat /dev/fb/0 >tmp
//./grab -i tmp -o grab.jpg
#include <setjmp.h>
#include <stdio.h>
#include <getopt.h>


#include <jpeglib.h>
#define W 800
#define H 480
/*The name of this program.*/
const char *program_name;

/*
   Prints usage information for this program to STREAM,and exit the program with EXIT_CODE.
*/

void print_usage(FILE* stream,int exit_code)
{
        fprintf(stream,"Usage: %s options [inputfile outputfile...]\n",program_name);

        fprintf(stream,
                        " -h --help Display this usage information\n"
                        " -i --input filename Read from file\n"
                        " -o --output filename Write output to file\n"
                   );
        exit(exit_code);
}


void convert_line( char *src, char *dst, int line,int weight,int height );

int main(int argc,char **argv)
{

        int next_option;
        unsigned int image_height = 0;
        unsigned int image_width = 0;
        const char* const short_opti;
        const struct option long_options[] = {
                {"help", 0, NULL, 'h'},
                {"input",1, NULL, 'i'},
                {"output",1, NULL, 'o'},
                {NULL, 0, NULL,0      }
        };

        const char *output_filename = NULL;
        char *input_filename = NULL;
        program_name = argv[0];
        do{
                next_option = getopt_long(argc,argv,short_options,long_options,NULL);
                switch(next_option)
                {
                        case 'h':
                                print_usage(stdout,0);
                        case 'o':
                                output_filename = optarg;
                                break;
                        case 'i':
                                input_filename = optarg;
                                break;
                        case '?':
                                print_usage(stdout,1);
                        case -1:
                                break;
                        default:
                                abort();
                }
        }
        while(next_option != -1);

        if(!output_filename){
                output_filename = "grab.jpg";
        }

        if(!input_filename)
        {
                input_filename = "tmp";
        }


        printf("outputfile = %s,inputfile = %s\n",output_filename,input_filename);
        struct jpeg_compress_struct cinfo;
        struct jpeg_error_mgr jerr;

        JSAMPLE *buffer;
        JSAMPLE *image_buffer;
        buffer = malloc(W*H*3);
        image_buffer = malloc(W*3);


        FILE *in;
        int ret = 0;
        in = fopen(input_filename,"r");
        if(!in){
                printf("please provide the rgb source\n");
                exit(0);
        }

        ret = fread(buffer, 1,W*H*2, in );

        if( ret == 0 ){
                printf("read image buffer error\n");
                exit(0);
        }

        int height = H;
        int width = W;

        FILE *outfile;
        JSAMPROW row_pointer[1];//points to JSAMPLE row[s]

        //setp 1:allocate and initialize JPEG compression object
        cinfo.err = jpeg_std_error(&jerr);
        jpeg_create_compress(&cinfo);

        //step 2:specify data destination
        //char *filename="grab1.jpg";
        if((outfile = fopen(output_filename,"wb")) == NULL){
                printf("cannot open file to write\n");
                exit(0);
        }
        jpeg_stdio_dest( &cinfo, outfile );

        //step 3:set parameters for compression
        cinfo.image_width = width;
        cinfo.image_height = height;
        cinfo.input_components = 3;
        cinfo.in_color_space = JCS_RGB;

        jpeg_set_defaults(&cinfo);

        jpeg_set_quality(&cinfo, 100, TRUE );

        //step 4:start compresor
        jpeg_start_compress(&cinfo, TRUE);

        //step 5:
        while(cinfo.next_scanline < cinfo.image_height ){
                convert_line( buffer,image_buffer,cinfo.next_scanline,height,width);
                //printf("%d======end",cinfo.next_scanline);
                row_pointer[0] = image_buffer;
                (void)jpeg_write_scanlines( &cinfo, row_pointer, 1);
        }
        jpeg_finish_compress(&cinfo);
        fclose( outfile );
        jpeg_destroy_compress(&cinfo);
        free(buffer);
        free(image_buffer);
}

void convert_line(char* src,char* dst,int line,int width,int height){
        int NUM1 = W*2;
        int NUM2 = W*3;
        char *p = src + line*NUM1;
        int i = 0;
        while( i < NUM2 ){
                dst[i] = (p[1]&0xf8 );
                dst[i+1] = ((p[1]&0x7)<<5) | ((p[0] & 0xe0)>>3);
                dst[i+2] = (p[0]&0x1f)<<3;
                i += 3;
                p += 2;
        }
}

你可能感兴趣的:(把从framebuffer抓出来的数据转换成jpg图像)