Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C libjpeg图像失真问题_C_Image_Arm_Jpeg_Libjpeg - Fatal编程技术网

C libjpeg图像失真问题

C libjpeg图像失真问题,c,image,arm,jpeg,libjpeg,C,Image,Arm,Jpeg,Libjpeg,我正在尝试使用ijg中的libjpeg将RGB图像压缩为JPEG。最后的想法是用图像传感器拍摄图像,并在ARM控制器上将数据压缩成JPEG格式;然而,出于测试目的,我一直在使用BMP文件转换为RGB.data文件,使用GIMP 我已经能够使用控制器和libjpeg成功地将RGB数据压缩到SD卡上的JPEG图像中,但是我发现使用这种方法在图像上出现了一条扭曲的线,我不确定是什么原因造成的,以及如何修复它 以下是压缩的JPEG图像: 以下是源BMP图像: 以下是相关的代码片段: static uin

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

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

以下是压缩的JPEG图像:

以下是源BMP图像:

以下是相关的代码片段:

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 ;
}
static uint8\u t*\u pucmagesrc;
静态uint8_t*_pucImageDst;
静态单元8_t*_pucCapturedBuf;
uint8_t_compress_image_jpg(SJPEGTest*pImage,sdCardDataHandler*datahandler){
SJpegData-SJpegData;
_pucmagedst=malloc(datahandler->sourceSize);
_pucCapturedBuf=datahandler->sourcePtr;
pImage->dwTimeC=getTicks();
JpegData_Init(&sJpegData);
JpegData_SetSource(&sJpegData,_pucCapturedBuf,datahandler->sourceSize);
JpegData_SetDestination(&sJpegData,_pucmagedst,datahandler->sourceSize);
JpegData_SetDimensions(&sJpegData,512384,3);
JpegData_设置参数(&sJpegData,25,JPG_数据_RGB,JPG_方法_IFAST);
如果(ijg_压缩(&sJpegData)==0){
pImage->dwTimeC=1+getTicks()-pImage->dwTimeC;
pImage->dwFinalLength=sJpegData.dwDstLength;
pImage->dwTimeD=getTicks();
}否则{
返回JPEG_转换错误;
}
datahandler->destSize=sJpegData.dwDstLength;
datahandler->destPtr=\u pucmagedst;
返回JPEG_转换_完成;
}
外部uint32\u t ijg\u压缩(SJpegData*pData){
结构jpeg\u压缩\u结构cinfo;
结构我的错误管理器;
JSAMPROW row_pointer;/*指向单行的指针*/
断言(pData!=NULL);
cinfo.err=jpeg\u std\u error(&jerr.pub);
if(setjmp(jerr.setjmp_缓冲区)){
jpeg\u destroy\u compress(&cinfo);
返回1;
}
jpeg\u创建\u压缩(&cinfo);
jpeg_mem_dest(&cinfo,&(pData->pucDst),(无符号长*)和(pData->dwDstLength));
cinfo.image_width=pData->dwWidth;
cinfo.image_height=pData->dwHeight;
cinfo.input_components=pData->dwBPP;
cinfo.in_color_space=pData->eInput;
jpeg\u set\u默认值(&cinfo);
cinfo.dct_method=pData->eMethod;
jpeg\u设置质量(&cinfo,pData->dwQuality,true);
jpeg\u start\u compress(&cinfo,true);
while(cinfo.next_扫描线pucSrc[cinfo.next\u scanline*cinfo.image\u width*cinfo.input\u components];
jpeg_write_扫描线(&cinfo,&row_指针,1);
}
jpeg\u完成\u压缩(&cinfo);
jpeg\u destroy\u compress(&cinfo);
返回0;
}

将libjpeg移植到未安装特定库的新控制器后,我能够确定问题所在。由于我曾用membag_free()替换free()调用,然后恢复到free(),但丢失了一个调用,因此某些内存没有被正确释放。啊!谢谢你的帮助

你检查过解码器的例子吗?在libjeg的example.c中,我一直在看write_JPEG_file函数。上面示例中的一些函数调用似乎来自Atmel的SAM3S PIRRD jpeg压缩应用程序说明和库中的libjpeg库。我没有使用SAM3S控制器,而是使用SAM3U控制器。从这两个参考资料中,我已经得出了文章中所描述的要点。看起来你的源图像数据是问题的根源。压缩数据的任何损坏都可能导致从那时起图像的其余部分完全无用。如果您没有使用重新启动标记,那么在发生错误后几乎无法重新同步。在将bmp文件加载到内存后,似乎有什么东西正在写入图像缓冲区的顶部。我将尝试验证加载到内存后是否损坏了数据,但我怀疑情况是否如此,因为我们正在运行一个外部RAM芯片,该芯片仅用作读取的原始数据和来自libjpeg的压缩jpeg数据的堆,并通过malloc进行分配。