libjpeg декомпрессия необработанное изображение черное, а байты нулевые

Я пытаюсь распаковать мое изображение 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;

}

Здесь input — это jpeg, а output — необработанное изображение. Странно, что некоторые изображения успешно распаковываются, а некоторые нет.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]