欢迎使用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
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- Acdream 1019 Palindrome 树状数组 + 字符串hash
- 2015_10_03_被虐的一塌糊涂的区域赛网赛
- PCM1750采集正弦波
- Java框架与低耦合
- leetcode 17 Letter Combinations of a Phone Number
- 欢迎使用CSDN-markdown编辑器
- 数据库 SQL 2005 知识点汇总
- php网站本地测试正常,传到服务器布局混乱,竟是UTF-8问题!!!!!
- 弱校联萌十一大决战之强力热身 C. Censor (KMP + stack)
- CentOS 7 yum安装路径查询方法
- LeetCode(69) Sqrt(x)
- KMP算法
- 工厂设计模式
- 杭电adc java 2011