From Joran Jessurun, "I needed to be able to set the quality of the saved jpeg images. I could

not find a way to do this in OSG. Therefore I implemented this by adding
an option called: JPEG_QUALITY <quality> to the JPEG reader/writer.

To parse the options string I use the same method as used in the LWO
reader/writer. "
This commit is contained in:
Robert Osfield 2004-05-09 07:06:32 +00:00
parent 35c6632cfd
commit 6f34ef29f8

View File

@ -7,6 +7,8 @@
#include <osgDB/FileNameUtils> #include <osgDB/FileNameUtils>
#include <osgDB/FileUtils> #include <osgDB/FileUtils>
#include <sstream>
/**************************************************************************** /****************************************************************************
* *
* Follows is code extracted from the simage library. Original Authors: * Follows is code extracted from the simage library. Original Authors:
@ -410,6 +412,21 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter
/* And we're done! */ /* And we're done! */
return WriteResult::FILE_SAVED; return WriteResult::FILE_SAVED;
} }
int getQuality(const osgDB::ReaderWriter::Options *options) {
if(options) {
std::istringstream iss(options->getOptionString());
std::string opt;
while (iss >> opt) {
if(opt=="JPEG_QUALITY") {
int quality;
iss >> quality;
return quality;
}
}
}
return 100;
}
public: public:
virtual const char* className() { return "JPEG Image Reader/Writer"; } virtual const char* className() { return "JPEG Image Reader/Writer"; }
virtual bool acceptsExtension(const std::string& extension) virtual bool acceptsExtension(const std::string& extension)
@ -459,13 +476,13 @@ class ReaderWriterJPEG : public osgDB::ReaderWriter
return pOsgImage; return pOsgImage;
} }
virtual WriteResult writeImage(const osg::Image &img,const std::string& fileName, const osgDB::ReaderWriter::Options*) virtual WriteResult writeImage(const osg::Image &img,const std::string& fileName, const osgDB::ReaderWriter::Options *options)
{ {
std::string ext = osgDB::getFileExtension(fileName); std::string ext = osgDB::getFileExtension(fileName);
if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED; if (!acceptsExtension(ext)) return WriteResult::FILE_NOT_HANDLED;
osg::ref_ptr<osg::Image> tmp_img = new osg::Image(img); osg::ref_ptr<osg::Image> tmp_img = new osg::Image(img);
tmp_img->flipVertical(); tmp_img->flipVertical();
WriteResult::WriteStatus ws = write_JPEG_file(fileName.c_str(),img.s(),img.t(),(JSAMPLE*)(tmp_img->data())); WriteResult::WriteStatus ws = write_JPEG_file(fileName.c_str(),img.s(),img.t(),(JSAMPLE*)(tmp_img->data()),getQuality(options));
return ws; return ws;
} }
}; };