RMatrixXus readPNG16(const std::string &filename) {
	std::ifstream is( filename.c_str(), std::fstream::in | std::fstream::binary );
	if( !is.is_open() )
		return RMatrixXus();
	char magic[9]={0};
	is.read( magic, 8 );
	if ((std::string)magic != "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
		printf("PNG bad magic!\n");
	
	int W=0, H=0;
	while(!readHDR( is, W, H ) && !is.eof());
	
	std::vector< short > data;
	while(!is.eof() && is.is_open()){
		std::vector<char> r = readDat( is );
		if(r.size()) {
			size_t o = data.size();
			data.resize( o + W*H );
			for( int i=0; i<H; i++ ) {
				uint16_t * pr = (uint16_t*)(r.data()+i*(W*sizeof(uint16_t)+1)+1);
				std::transform( pr, pr+W, data.begin()+o+i*W, htons2 );
			}
			break;
		}
	}
	if( data.size() >= H*W ) {
		RMatrixXus r( H, W );
		memcpy( r.data(), data.data(), W*H*sizeof(uint16_t) );
		return r;
	}
	return RMatrixXus();
}
RMatrixX<T> readIPNG_T( const std::string & filename ) {
	std::ifstream is( filename.c_str(), std::fstream::in | std::fstream::binary );
	if( !is.is_open() )
		return RMatrixX<T>();
	char magic[9]={0};
	is.read( magic, 8 );
	if ((std::string)magic != "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
		printf("PNG bad magic!\n");
	
	int W=0, H=0;
	while(!readHDR( is, W, H ) && !is.eof());
	
	std::vector< T > data;
	std::vector< uint16_t > lbl_map;
	while(!is.eof() && is.is_open()){
		if( lbl_map.size() == 0 )
			lbl_map = readRemap( is );
		std::vector<char> d = readDat( is );
		if(d.size()) {
			RMatrixXu8 tmp = RMatrixXu8::Map( reinterpret_cast<uint8_t*>(d.data()), H, W+1 ).rightCols( W );
			RMatrixX<T> r = tmp.cast<T>();
			if (lbl_map.size()) {
				const int N = W*H;
				T * pr = r.data();
				unsigned char * ptmp = tmp.data();
				for( int i=0; i<N; i++ )
					pr[i] = lbl_map[ ptmp[i] ];
			}
			return r;
		}
	}
	return RMatrixX<T>();
}
std::vector<RMatrixXu8> readAPNG( const std::string & filename ) {
	std::ifstream is( filename.c_str(), std::fstream::in | std::fstream::binary );
	if( !is.is_open() )
		return std::vector<RMatrixXu8>();
	char magic[9]={0};
	is.read( magic, 8 );
	if ((std::string)magic != "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
		printf("PNG bad magic!\n");
	
	int W=0, H=0;
	while(!readHDR( is, W, H ) && !is.eof());
	
	std::vector<RMatrixXu8> r;
	while(!is.eof() && is.is_open()){
		std::vector<char> d = readDat( is );
		if(d.size())
			r.push_back( RMatrixXu8::Map( reinterpret_cast<uint8_t*>(d.data()), H, W+1 ).rightCols( W ) );
	}
	return r;
}
Exemple #4
0
TP_EXPORT bool tpImageIO::readHDR(tpImageColorHDR& I, const std::string& path)
{
	return readHDR(I,path.c_str());
}