欢迎使用CSDN-markdown编辑器

来源:互联网 发布:剑灵男力士捏脸数据 编辑:程序博客网 时间:2024/06/05 02:36

RGB转jpg使用libjpeg库实现

近期在做一个在智能相机产品,关于人脸识别方面的,需要输出一张jpeg图片识别结果,需要YUV转RGB,RGB转JPG,其实libjpeg也可以直接以YUV输入源输出JPG图片的,涉及到通用性和不同编码器输出的YUV格式不一致,下面贴代码,从网上找了一些参考,调试过后没保存作者的url,抱歉,下面贴代码。

代码块

rgb2jpeg.h

#ifndef __libjpegTest__rgb2jpeg__#define __libjpegTest__rgb2jpeg__#include <stdio.h>//初始化int jpeginit(int image_width,int image_height,int quality);//转换int rgb2jpeg(char * filename, unsigned char* rgbData);//反初始化int jpeguninit();#endif /* defined(__libjpegTest__rgb2jpeg__) */

rgb2jpeg.c

#ifndef __libjpegTest__rgb2jpeg__#include <stdio.h>#include "rgb2jpeg.h"#include "jpeglib.h"//定义一个压缩对象,这个对象用于处理主要的功能struct jpeg_compress_struct jpeg;//用于错误信息struct jpeg_error_mgr jerr;int jpeginit(int image_width,int image_height,int quality){    //错误输出在绑定    jpeg.err = jpeg_std_error(&jerr);    //初始化压缩对象    jpeg_create_compress(&jpeg);    //压缩参数设置。具体请到网上找相应的文档吧,参数很多,这里只设置主要的。    //我设置为一个 24 位的 image_width X image_height大小的RGB图片    jpeg.image_width = image_width;    jpeg.image_height = image_height;    jpeg.input_components  = 3;    jpeg.in_color_space = JCS_RGB;    //参数设置为默认的    jpeg_set_defaults(&jpeg);    //还可以设置些其他参数:    //// 指定亮度及色度质量    //jpeg.q_scale_factor[0] = jpeg_quality_scaling(100);    //jpeg.q_scale_factor[1] = jpeg_quality_scaling(100);    //// 图像采样率,默认为2 * 2    //jpeg.comp_info[0].v_samp_factor = 1;    //jpeg.comp_info[0].h_samp_factor = 1;    //// 设定编码jpeg压缩质量    jpeg_set_quality(&jpeg, quality, TRUE);    return 0;}int rgb2jpeg(char * filename, unsigned char* rgbData){    //定义压缩后的输出,这里输出到一个文件!    FILE* pFile = fopen( filename,"wb" );    if( !pFile )        return 0;    //绑定输出    jpeg_stdio_dest(&jpeg, pFile);    //开始压缩。执行这一行数据后,无法再设置参数了!    jpeg_start_compress(&jpeg, TRUE);    JSAMPROW row_pointer[1];    //从上到下,设置图片中每一行的像素值    for( int i=0;i<jpeg.image_height;i++ )    {        row_pointer[0] = rgbData+i*jpeg.image_width*3;        jpeg_write_scanlines( &jpeg,row_pointer,1 );    }    //结束压缩    jpeg_finish_compress(&jpeg);    fclose( pFile );    pFile = NULL;    return 0;}int jpeguninit(){    //清空对象    jpeg_destroy_compress(&jpeg);    return 0;}

main.c

#include<sys/time.h>#include "rgb2jpeg.h"#define WIDTH 1920#define HEIGHT 1080int main(int argc, const char * argv[]) {    unsigned char *rgbdata = (unsigned char*)malloc(WIDTH*HEIGHT*3);    struct timeval tbegin,tend;    long timediff = 0;    gettimeofday(&tbegin,NULL);    int data = 0;    for( int i=0;i<HEIGHT*WIDTH*3;i+=3 )    {        rgbdata[i] = data%255;//R        rgbdata[i+1] = data%255;//G        rgbdata[i+2] = data%255;//B        data++;        if (data == WIDTH) {            data=0;        }    }    gettimeofday(&tend,NULL);    timediff = (tend.tv_sec-tbegin.tv_sec)*1000+(tend.tv_usec-tbegin.tv_usec)/1000;    printf("timediff=%ld rgbdata create...\n",timediff);    gettimeofday(&tbegin,NULL);    rgb2jpeg("./test.jpg",rgbdata);    gettimeofday(&tend,NULL);    timediff = (tend.tv_sec-tbegin.tv_sec)*1000+(tend.tv_usec-tbegin.tv_usec)/1000;    printf("timediff=%ld rgb2jpeg,test3.jpg...\n",timediff);    jpeguninit();    free(rgbdata);    return 0;}

图片结果

0 0