libjpg输出到内存
2024-08-23
9
0
函数代码:
#define JPEG_QUALITY 100 //图片质量
int savejpg2(char* pRGB, unsigned char* &jpeg_data, unsigned long& jpeg_size, int width, int height)
{
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
/* 创建 */
jpeg_create_compress(&cinfo);
/* 存到文件和存到内存,二选一 */
/* 存到文件 */
//jpeg_stdio_dest(&cinfo, jfp);
/* 存到内存 */
jpeg_mem_dest(&cinfo, &jpeg_data, &jpeg_size);
cinfo.image_width = width;
cinfo.image_height = height;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;// JCS_YCbCr; /* 此处是 YUV444 格式 */
cinfo.dct_method = JDCT_FLOAT;
jpeg_set_defaults(&cinfo);
/* 设置jpeg图像质量,范围 [0,100] */
jpeg_set_quality(&cinfo, 90, TRUE);
/* 开始 */
jpeg_start_compress(&cinfo, TRUE);
/* 处理数据 */
JSAMPROW row_pointer[1];
int row_stride = width * 3;
while (cinfo.next_scanline < cinfo.image_height)
{
row_pointer[0] = (JSAMPROW)(pRGB + cinfo.next_scanline * row_stride);//一行一行数据的传,jpeg为大端数据格式
jpeg_write_scanlines(&cinfo, row_pointer, 1);
}
/* 停止 */
jpeg_finish_compress(&cinfo);
/* 销毁 */
jpeg_destroy_compress(&cinfo);
return 0;
}
测试代码
{
static char* pData = new char[1280 * 720 * 4];
memset(pData, 0, 1280 * 720 * 3);
long red = 0xff000000;
for (int h = 0; h < 720; h++)
{
char* pColor = (char*)(pData + h * 1280 * 3);
for (int w = 0; w < 1280; w++)
{
pColor[0] = 255;
pColor[1] = 0;
pColor[2] = 0;
pColor += 3;
}
}
unsigned char* pMjpg = NULL;
unsigned long len = 0;
savejpg2(pData, pMjpg, len, 1280, 720);
FILE* fp = fopen("11280x720.jpg", "wb");
fwrite(pMjpg, len, 1, fp);
fclose(fp);
}