Merge pull request #619 from mathieu/topic/SaveInlinedImages

Added saving of inline Images without having the physical image file.
This commit is contained in:
OpenSceneGraph git repository 2018-09-11 08:34:20 +01:00 committed by GitHub
commit 960f4d1ef2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -17,6 +17,7 @@
#include <osgDB/ConvertBase64>
#include <osgDB/FileUtils>
#include <osgDB/WriteFile>
#include <osgDB/FileNameUtils>
#include <osgDB/ObjectWrapper>
#include <osgDB/fstream>
#include <sstream>
@ -581,35 +582,61 @@ void OutputStream::writeImage( const osg::Image* img )
if ( isBinary() )
{
std::string fullPath = osgDB::findDataFile( img->getFileName(), _options.get() );
osgDB::ifstream infile( fullPath.c_str(), std::ios::in|std::ios::binary );
if ( infile )
if (fullPath.empty()==false)
{
infile.seekg( 0, std::ios::end );
unsigned int size = infile.tellg();
writeSize(size);
if ( size>0 )
osgDB::ifstream infile( fullPath.c_str(), std::ios::in|std::ios::binary );
if ( infile )
{
char* data = new char[size];
if ( !data )
{
throwException( "OutputStream::writeImage(): Out of memory." );
if ( getException() ) return;
}
infile.seekg( 0, std::ios::end );
unsigned int size = infile.tellg();
writeSize(size);
infile.seekg( 0, std::ios::beg );
infile.read( data, size );
writeCharArray( data, size );
delete[] data;
if ( size>0 )
{
char* data = new char[size];
if ( !data )
{
throwException( "OutputStream::writeImage(): Out of memory." );
if ( getException() ) return;
}
infile.seekg( 0, std::ios::beg );
infile.read( data, size );
writeCharArray( data, size );
delete[] data;
}
infile.close();
}
else
{
OSG_WARN << "OutputStream::writeImage(): Failed to open image file "
<< img->getFileName() << std::endl;
*this << (unsigned int)0;
}
infile.close();
}
else
{
OSG_WARN << "OutputStream::writeImage(): Failed to open image file "
<< img->getFileName() << std::endl;
*this << (unsigned int)0;
std::string ext = osgDB::getFileExtension( img->getFileName() );
osgDB::ReaderWriter* writer =
osgDB::Registry::instance()->getReaderWriterForExtension( ext );
if ( writer )
{
std::stringstream outputStream;
writer->writeImage(*img, outputStream, getOptions());
std::string data (outputStream.str());
unsigned int size = data.size();
writeSize(size);
writeCharArray( data.c_str(), size );
}
else
{
OSG_WARN << "OutputStream::writeImage(): Failed to find a plugin to write the image file "
<< img->getFileName() << std::endl;
*this << (unsigned int)0;
}
}
}
break;
case IMAGE_EXTERNAL: