LIBJPG
+ -

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);

    }

0 篇笔记 写笔记

作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!