c - libjpeg 图像失真问题

标签 c image arm jpeg libjpeg

我正在尝试使用 ijg 的 libjpeg 将 RGB 图像压缩为 JPEG。最后的想法是使用图像传感器拍摄图像并将数据压缩为 ARM Cortex M3 Controller 上的 JPEG;但是,出于测试目的,我一直在使用使用 GIMP 转换为 RGB .data 文件的 BMP 文件。

我已经能够使用 Controller 和 libjpeg 成功地将 RGB 数据压缩成 SD 卡上的 JPEG 图像,但是我使用这种方法看到图像上有一条扭曲的线,我不确定是什么原因造成的,以及如何修复它。

这是压缩的 JPEG 图像:http://i.imgur.com/kFBEhEs.jpg

这是源 BMP 图像:http://i.imgur.com/jenHG0b.png

这里是相关的代码片段:

static uint8_t* _pucImageSrc ;
static uint8_t* _pucImageDst ;
static uint8_t*_pucCapturedBuf;

uint8_t _compress_image_jpg(SJPEGTest *pImage, sdCardDataHandler *datahandler){
    SJpegData sJpegData;

    _pucImageDst=malloc(datahandler->sourceSize);
    _pucCapturedBuf = datahandler->sourcePtr;

    pImage->dwTimeC=getTicks();
    JpegData_Init( &sJpegData ) ;
    JpegData_SetSource( &sJpegData, _pucCapturedBuf, datahandler->sourceSize) ;
    JpegData_SetDestination( &sJpegData, _pucImageDst, datahandler->sourceSize ) ;
    JpegData_SetDimensions( &sJpegData, 512, 384, 3 ) ;
    JpegData_SetParameters( &sJpegData, 25, JPG_DATA_RGB, JPG_METHOD_IFAST ) ;

        if ( ijg_compress( &sJpegData ) == 0 ){
            pImage->dwTimeC=1+getTicks()-pImage->dwTimeC;
            pImage->dwFinalLength=sJpegData.dwDstLength;
            pImage->dwTimeD=getTicks();
        } else {
             return JPEG_CONVERSION_ERRORED;    
        }

    datahandler->destSize = sJpegData.dwDstLength;
    datahandler->destPtr = _pucImageDst;

    return JPEG_CONVERSION_COMPLETE;
}

extern uint32_t ijg_compress( SJpegData* pData ){
    struct jpeg_compress_struct cinfo ;
    struct my_error_mgr       jerr ;
    JSAMPROW row_pointer ;          /* pointer to a single row */

    assert( pData != NULL ) ;

    cinfo.err = jpeg_std_error( &jerr.pub ) ;
    if(setjmp(jerr.setjmp_buffer)){
        jpeg_destroy_compress(&cinfo);
        return 1;
    }
    jpeg_create_compress( &cinfo ) ;
    jpeg_mem_dest( &cinfo, &(pData->pucDst), (unsigned long*)&(pData->dwDstLength) ) ;

    cinfo.image_width      = pData->dwWidth ;
    cinfo.image_height     = pData->dwHeight ;
    cinfo.input_components = pData->dwBPP ;
    cinfo.in_color_space   = pData->eInput ;

    jpeg_set_defaults( &cinfo ) ;
    cinfo.dct_method = pData->eMethod ;
    jpeg_set_quality( &cinfo, pData->dwQuality, true ) ;
    jpeg_start_compress( &cinfo, true ) ;

    while ( cinfo.next_scanline < cinfo.image_height )
    {
        row_pointer = (JSAMPROW) &pData->pucSrc[cinfo.next_scanline*cinfo.image_width*cinfo.input_components] ;
        jpeg_write_scanlines( &cinfo, &row_pointer, 1 ) ;
    }

    jpeg_finish_compress( &cinfo ) ;
    jpeg_destroy_compress(&cinfo);

    return 0 ;
}

最佳答案

在必须将 libjpeg 移植到一个没有安装特定库的新 Controller 后,我能够确定问题所在。由于我曾用 membag_free() 替换 free() 调用,然后恢复到 free() 但错过了一个调用,一些内存没有被正确释放。呸!谢谢您的帮助!

关于c - libjpeg 图像失真问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983535/

相关文章:

C - 一个程序可以为自己分配多少内存 - 它是如何确定的?

c - 函数 fseeko 的隐式声明

ios - Swift - 在 Markdown 中使用相对路径渲染图像

c - 如何在 HWND 中包含 Windows Word 文档?

c++ - 如何创建一个将其证书发送到服务器的 Gnutls-Client?

java - 如何使用 mvc 在数据库中存储图像或任何类型的文档

ios - Safari 没有在视口(viewport)外加载图像

c - 在 RVDS 5.01 上隐式声明的函数 "typeof"

python - 让 TensorFlow 在 ARM Mac 上使用 GPU

c - 为什么语法错误会导致无限循环而不是编译时的 fatal error ?