C++ libjpeg解压缩原始图像为黑色,字节为零

C++ libjpeg解压缩原始图像为黑色,字节为零,c++,jpeg,libjpeg,libjpeg-turbo,C++,Jpeg,Libjpeg,Libjpeg Turbo,我正在尝试将我的jpeg图像解压缩为原始图像。奇怪的是,原始图像字节在18个字节后为零 class jpeg_decompress_struct_wrapper{ public: jpeg_decompress_struct_wrapper() { jpeg_create_decompress(&this->cinfo); } ~jpeg_decompress_struct_wrapper() {

我正在尝试将我的jpeg图像解压缩为原始图像。奇怪的是,原始图像字节在18个字节后为零

    class jpeg_decompress_struct_wrapper{

     public: 
    jpeg_decompress_struct_wrapper()
    {
        jpeg_create_decompress(&this->cinfo);   
    }

    ~jpeg_decompress_struct_wrapper()
    {
        jpeg_destroy_decompress(&this->cinfo);  
    }

    operator jpeg_decompress_struct*()
    {

        return &this->cinfo;
    }
     private:
    jpeg_decompress_struct cinfo;
     };

static void mem_init_source(j_decompress_ptr cinfo){

}

static void mem_term_source(j_decompress_ptr cinfo){

}

static boolean mem_fill_input_buffer(j_decompress_ptr cinfo){

#ifdef PROCESS_TRUNCATED_IMAGES
    jpeg_source_mgr* src=cinfo->src;
    static const JOCTET EOI_BUFFER[ 2 ] = { (JOCTET)0xFF, (JOCTET)JPEG_EOI };
    src->next_input_byte=EOI_BUFFER;
    src->bytes_in_buffer= sizeof(EOI_BUFFER);
#else
    printf("error truncated file\n");
#endif
    return true;
}


static void mem_skip_input_data(j_decompress_ptr cinfo,long num_bytes){

    jpeg_source_mgr* src=(jpeg_source_mgr* )cinfo->src;

    if(1>num_bytes)

        return;

    if(num_bytes< src->bytes_in_buffer)
    {
        src->next_input_byte += (size_t) num_bytes;

        src->bytes_in_buffer -= (size_t)num_bytes;

    }

    else
    {
#ifdef PROCESS_TRUNCATED_IMAGES
        src->bytes_in_buffer = 0;
#else
        printf("error truncated file\n");
#endif
    }
}


static void jpeg_mem_src_b(j_decompress_ptr cinfo,jpeg_source_mgr* src,void* buffer,long nbytes){

    src->init_source = mem_init_source;

    src->fill_input_buffer = mem_fill_input_buffer;

    src->skip_input_data = mem_skip_input_data;

    src->resync_to_restart = jpeg_resync_to_restart;

    src->term_source = mem_term_source;

    src->bytes_in_buffer = nbytes;

    src->next_input_byte = (JOCTET*)buffer;

    cinfo->src = src;
}



bool read_jpeg_file( CAtlArray<BYTE>* input,CAtlArray<BYTE>* output)
{    
    /* These are standard libjpeg structures for reading(decompression) */

    unsigned long location=0;

    jpeg_decompress_struct_wrapper cinfo;

    j_decompress_ptr pcinfo = cinfo;

        struct jpeg_error_mgr    jerr;

    jpeg_source_mgr src_mem;

    pcinfo->err = jpeg_std_error( &jerr );  

    jpeg_mem_src_b(cinfo,&src_mem,(PVOID)input->GetData(),longinput->GetCount()));

    //jpeg_mem_src(cinfo,(PVOID)row_buffer,long(row_buffer->GetCount()));

    jpeg_read_header(cinfo,TRUE);

    jpeg_start_decompress( cinfo );

    JSAMPROW row_pointer[1];

    unsigned char* raw_image= (unsigned char *)malloc(pcinfo->output_width*  pcinfo->num_components * pcinfo->output_height);

    unsigned long size=pcinfo->output_width*  pcinfo->num_components * pcinfo->output_height;

    row_pointer[0] = (unsigned char *)malloc(pcinfo->output_width*  pcinfo->num_components);

    while( pcinfo->output_scanline < pcinfo->image_height )
    {
        jpeg_read_scanlines( cinfo, row_pointer,1 );

        for(int i=0;i<pcinfo->image_width*pcinfo->num_components;i++)
            raw_image[location++]= row_pointer[0][i];

    }

    jpeg_finish_decompress( cinfo );

    ouyput->SetCount(size);

    CopyMemoryoutput->GetData(),raw_image,size);

    //cout<<"degerleri yazdirrrrrrrrrrrr"<<endl;

    //cout<<raw_image[921596]<<endl;

    //cout<<in_buffer->GetAt(921596)<<endl; 

    free(row_pointer[0]);

    free(raw_image);

    return true;

}

这里输入的是jpeg,输出的是原始图像。奇怪的是,有些图像被成功解压,但有些图像没有

对不起,这不是C。你能删除代码中不相关的部分并插入损坏的输入和输出吗?否则,我会向您推荐API,它更易于使用……我愿意提供帮助,但我需要无法重现问题的图片。