Я пытаюсь распаковать мое изображение 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 — необработанное изображение. Странно, что некоторые изображения успешно распаковываются, а некоторые нет.
Задача ещё не решена.