extern "C"
{
#include <jpeglib.h>
}
static void init_buffer(struct jpeg_compress_struct * c) {
}
static boolean empty_buffer(struct jpeg_compress_struct * compress_struct) {
return TRUE;
}
static void term_buffer(struct jpeg_compress_struct * c) {
}
void writeJPEGBuff(unsigned char *buffsrc, int width, int height, int quality, uint8_t *jpegbuff, int * len){
struct jpeg_error_mgr jerr;
JSAMPLE * imageBuffer = (JSAMPLE *)buffsrc;
struct jpeg_compress_struct cinfo = {
.client_data = NULL, .err = jpeg_std_error(&jerr)
};
jpeg_create_compress(&cinfo);
struct jpeg_destination_mgr dm = {
.init_destination = init_buffer, .empty_output_buffer = empty_buffer,
.term_destination = term_buffer, .next_output_byte = jpegbuff,
.free_in_buffer = (size_t) width * height * 3
};
cinfo.dest = &dm;
cinfo.image_width = (JDIMENSION) width;
cinfo.image_height = (JDIMENSION) height;
// 这里是一个通道的灰度图buffer, 如何使RGB图,可以设置JCS_RGB,input_components = 3;
cinfo.in_color_space = JCS_GRAYSCALE;
cinfo.jpeg_color_space = JCS_GRAYSCALE;
cinfo.input_components = 1;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE); // TRUE = limit to baseline-JPEG values
cinfo.MCUs_per_row = (JDIMENSION) width;
cinfo.MCU_rows_in_scan = (JDIMENSION) height;
jpeg_start_compress(&cinfo, TRUE);
int row_stride; // physical row width in image buffer
row_stride = width * cinfo.input_components; // JSAMPLEs per row in imageBuffer
JSAMPROW row_pointer[1]; // pointer to JSAMPLE row[s]
while (cinfo.next_scanline < cinfo.image_height) {
row_pointer[0] = &imageBuffer[cinfo.next_scanline * row_stride];
(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
int size = (int) (cinfo.dest->next_output_byte - jpegbuff);
*len = size;
}
void writeJPEGBuff(unsigned char *buffsrc, int width, int height, int quality, uint8_t *jpegbuff, int * len);
buffsrc -> 编码前的buffer, 如RGB
width -> 图片宽
height -> 图片高
quality -> jpeg 编码质量
jpegbuff -> jpeg编码输出buffer
len ->jpegbuff 的长度