void read_raw_data( string const& fn, uint32_t w, uint32_t h, tImgLinear& rimg ) { vector<uint8_t> buf; try { bin_data::tReadBin()( fn, buf ); } catch( bin_data::tBinReadEx& ) { throw; } if( w * h == buf.size() ) { rimg.set_mono8(); } if( w * h * 3 == buf.size() ) { rimg.set_rgb(); } if( rimg.is_none() ) { string s = "Couldn't read raw file: '" + fn + "'"; throw tImgReadEx( s ); } rimg.size() = tSize( w, h ); rimg.alloc_data_buffer(); rimg.insert_data( buf, 0 ); }
void read( string fn, tImgLinear& rimg ) { std::vector<uint8_t> buf; bin_read::t_bin_read reader; reader( fn, buf ); FILEHEADER const* fileheader = referenceToFILEHEADER( buf ); uint16_t sig = fileheader->signature; if( sig != BMP_signature ) { return ; } if( buf.size() == fileheader->size ) { try { INFO const* bitmapinfoheader = referenceToINFO( buf ); uint32_t w = info_width( bitmapinfoheader ); uint32_t h = info_height( bitmapinfoheader ); // copy data to tImgLinear rimg.size() = tSize( w, h ); uint8_t const* pbuf = &buf[0]; uint8_t const* dataptr = pbuf + fileheader->offset_bits; // 8 bit if( bitmapinfoheader->bit_count == 8 ) { // LUT is not supported, convert to rgb, if lut is not an gray ramp lut tBGRA const* lut = referenceToLUT( buf ); if( is_ramp( lut ) ) { rimg.set_mono8(); rimg.alloc_data_buffer(); read_8bit( dataptr, rimg.size(), rimg.rows() ); return; } if( is_zero( lut ) ) { rimg.set_mono8(); rimg.alloc_data_buffer(); read_8bit( dataptr, rimg.size(), rimg.rows() ); return; } rimg.set_rgb(); rimg.alloc_data_buffer(); read_8bit_as_rgb( lut, dataptr, rimg.size(), rimg.rows() ); return; } // 24 bit if( bitmapinfoheader->bit_count == 24 ) { rimg.set_rgb(); rimg.alloc_data_buffer(); read_rgb( dataptr, rimg.size(), rimg.rows() ); } if( bitmapinfoheader->bit_count == 32 ) { // read an rgba image, write an rgb image, alpha is lost rimg.set_rgba(); rimg.alloc_data_buffer(); read_rgba( dataptr, rimg.size(), rimg.rows() ); } } catch( tImgAllocEx& ex ) { throw tImgReadEx( ex.what() ); } } }