如何让 LibJPEG 调整结果图像的质量
How to get LibJPEG to adjust Quality of resulting image
我正在使用 libjpeg 将 V4L2 缓冲区保存到文件中。生成的图像看起来很棒。现在我正在尝试设置 JPEG 的质量(范围 1-100)。我查阅了文档:https://www4.cs.fau.de/Services/Doc/graphics/doc/jpeg/libjpeg.html
我看到有一个 jpeg_set_quality 函数。我将它添加到我的代码中,它看起来总是最高质量,即使质量参数为 1。
如何让质量参数生效?谢谢
我的保存 jpeg 功能如下所示:
static void save_jpeg(CamInfo *cam, struct v4l2_buffer *dqBuf)
{
static int inited = 0;
static int fileno = 0;
int row_stride;
JSAMPROW row_pointer[1];
char *image_buf;
FILE * outfile;
char filename[32];
if(!inited)
{
memset(&cam->cinfo, 0, sizeof(cam->cinfo));
memset(&cam->jerr, 0, sizeof(cam->jerr));
cam->cinfo.err = jpeg_std_error(&cam->jerr);
jpeg_create_compress(&cam->cinfo);
cam->cinfo.image_width = WIDTH; //image width and height, in pixels
cam->cinfo.image_height = HEIGHT;
cam->cinfo.input_components = 3; // must be 3
cam->cinfo.in_color_space = JCS_YCbCr;
printf("Setting JPEG quality: %d\n",quality);
jpeg_set_quality(&cam->cinfo, quality, (boolean)0);
jpeg_set_defaults(&cam->cinfo);
inited = 1;
}
if( continuous_stream )
fileno = 0; /* same filename each time */
printf("About to write JPEG image\n");
sprintf(filename, "/tmp/nginx/vl.jpeg");
if ((outfile = fopen(filename, "wb")) == NULL)
{
fprintf(stderr, "can't open %s\n", filename);
exit(1);
}
jpeg_stdio_dest(&cam->cinfo, outfile);
jpeg_start_compress(&cam->cinfo, TRUE);
row_stride = WIDTH * 3;
image_buf = planar_to_interleave(mCam.frames[dqBuf->index]);
while (cam->cinfo.next_scanline < cam->cinfo.image_height)
{
row_pointer[0] = (JSAMPROW)(&image_buf[cam->cinfo.next_scanline * row_stride]);
(void) jpeg_write_scanlines(&cam->cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cam->cinfo);
fclose(outfile);
}
在 jpeg_set_quality()
之后调用 jpeg_set_defaults()
会将质量重置为 75。交换函数调用的顺序以解决此问题。
GLOBAL(void)
jpeg_set_defaults (j_compress_ptr cinfo)
{
…
/* Set up two quantization tables using default quality of 75 */
jpeg_set_quality(cinfo, 75, TRUE);
我正在使用 libjpeg 将 V4L2 缓冲区保存到文件中。生成的图像看起来很棒。现在我正在尝试设置 JPEG 的质量(范围 1-100)。我查阅了文档:https://www4.cs.fau.de/Services/Doc/graphics/doc/jpeg/libjpeg.html
我看到有一个 jpeg_set_quality 函数。我将它添加到我的代码中,它看起来总是最高质量,即使质量参数为 1。
如何让质量参数生效?谢谢
我的保存 jpeg 功能如下所示:
static void save_jpeg(CamInfo *cam, struct v4l2_buffer *dqBuf)
{
static int inited = 0;
static int fileno = 0;
int row_stride;
JSAMPROW row_pointer[1];
char *image_buf;
FILE * outfile;
char filename[32];
if(!inited)
{
memset(&cam->cinfo, 0, sizeof(cam->cinfo));
memset(&cam->jerr, 0, sizeof(cam->jerr));
cam->cinfo.err = jpeg_std_error(&cam->jerr);
jpeg_create_compress(&cam->cinfo);
cam->cinfo.image_width = WIDTH; //image width and height, in pixels
cam->cinfo.image_height = HEIGHT;
cam->cinfo.input_components = 3; // must be 3
cam->cinfo.in_color_space = JCS_YCbCr;
printf("Setting JPEG quality: %d\n",quality);
jpeg_set_quality(&cam->cinfo, quality, (boolean)0);
jpeg_set_defaults(&cam->cinfo);
inited = 1;
}
if( continuous_stream )
fileno = 0; /* same filename each time */
printf("About to write JPEG image\n");
sprintf(filename, "/tmp/nginx/vl.jpeg");
if ((outfile = fopen(filename, "wb")) == NULL)
{
fprintf(stderr, "can't open %s\n", filename);
exit(1);
}
jpeg_stdio_dest(&cam->cinfo, outfile);
jpeg_start_compress(&cam->cinfo, TRUE);
row_stride = WIDTH * 3;
image_buf = planar_to_interleave(mCam.frames[dqBuf->index]);
while (cam->cinfo.next_scanline < cam->cinfo.image_height)
{
row_pointer[0] = (JSAMPROW)(&image_buf[cam->cinfo.next_scanline * row_stride]);
(void) jpeg_write_scanlines(&cam->cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cam->cinfo);
fclose(outfile);
}
在 jpeg_set_quality()
之后调用 jpeg_set_defaults()
会将质量重置为 75。交换函数调用的顺序以解决此问题。
GLOBAL(void)
jpeg_set_defaults (j_compress_ptr cinfo)
{
…
/* Set up two quantization tables using default quality of 75 */
jpeg_set_quality(cinfo, 75, TRUE);