在网上找了好几套,结果都不对。后来终于找到一套,还缺了一点。于是连蒙带猜,终于保存成功了。
- github的开源
吾已将此代码开源到github,会进行维护工作。请优待去github:
GitHub - quantum6/NV12ToJpgByJpegLib
- 编译jpeglib
LINUX下载编译jpeglib_柳鲲鹏的博客-优快云博客_jpeglib库linux下载
- 源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<jpeglib.h>
#define JPEG_QUALITY 75
int Nv12ToJpgFile(const char *pJpgFile,
const char* pYUVBuffer, const int nWidth, const int nHeight)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
JSAMPROW row_pointer[1];
FILE * pJpegFile = NULL;
unsigned char *yuvbuf = NULL;
unsigned char *ybase = NULL, *ubase = NULL;
int i=0, j=0;
int idx=0;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
if ((pJpegFile = fopen(pJpgFile, "wb")) == NULL)
{
return -1;
}
jpeg_stdio_dest(&cinfo, pJpegFile);
// image width and height, in pixels
cinfo.image_width = nWidth;
cinfo.image_height = nHeight;
cinfo.input_components = 3; // # of color components per pixel
cinfo.in_color_space = JCS_YCbCr; //colorspace of input image
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, JPEG_QUALITY, TRUE );
cinfo.jpeg_color_space = JCS_YCbCr;
cinfo.comp_info[0].h_samp_factor = 2;
cinfo.comp_info[0].v_samp_factor = 2;
jpeg_start_compress(&cinfo, TRUE);
yuvbuf=(unsigned char *)malloc(nWidth*3);
if(yuvbuf == NULL)
{
return -1;
}
memset(yuvbuf, 0, nWidth*3);
ybase=(unsigned char *)pYUVBuffer;
ubase=(unsigned char *)(pYUVBuffer+nWidth*nHeight);
while (cinfo.next_scanline < cinfo.image_height)
{
idx=0;
for(i=0;i<nWidth;i++)
{
yuvbuf[idx++]=ybase[i + j * nWidth];
yuvbuf[idx++]=ubase[j/2 * nWidth+(i/2)*2];
yuvbuf[idx++]=ubase[j/2 * nWidth+(i/2)*2+1];
}
row_pointer[0] = yuvbuf;
jpeg_write_scanlines(&cinfo, row_pointer, 1);
j++;
}
jpeg_finish_compress( &cinfo);
jpeg_destroy_compress(&cinfo);
fclose(pJpegFile);
return 0;
}
int main(int argc, char** argv)
{
}
- 编译
我试图使用pkgconfig,失败。
gcc \
Nv12ToJpg.c \
-I /usr/local/include \
-L /usr/lib/ -ljpeg
# `pkg-config --cflags --libs libjpeg`